rsync ile Sistem Klonlama ve Sunucu Göçü
Sunucu göçü denince çoğu sysadmin’in aklına hemen dd, Ghost veya pahalı enterprise araçlar geliyor. Oysa yıllardır elimizin altında olan rsync, doğru kullanıldığında bu işin en güvenilir ve esnek çözümü. Ben de bu yazıda gerçek dünya senaryolarıyla rsync’i nasıl bir sistem klonlama ve sunucu göçü aracına dönüştürebileceğinizi anlatacağım.
rsync Neden Disk Klonlama İçin İyi Bir Seçim?
dd gibi araçlar bloğu blok kopyalar, yani boş alanı da, silinmiş dosyaları da, her şeyi alırsınız. 500GB’lık bir diskten 50GB veri varsa bile 500GB taşırsınız. rsync ise dosya bazlı çalışır, delta transfer yapar ve ağ üzerinden kopyalamayı birinci sınıf vatandaş olarak destekler.
Avantajları:
- Sadece değişen dosyaları kopyalar, ikinci transferde zaman kazandırır
- Çalışan bir sistem üzerinde kademeli senkronizasyon yapabilirsiniz
- Ağ kesilmesinde kaldığı yerden devam eder
- Sembolik linkleri, izinleri, ownership bilgisini korur
- Hariç tutma kuralları yazabilirsiniz
Dezavantajları:
- Açık dosyalar (özellikle veritabanları) tutarsız kopyalanabilir
- Boot sektörünü kopyalamaz, hedef sistemde ayrıca bootloader kurmanız gerekir
- Dosya sistemi özelliklerini (örneğin btrfs subvolume) birebir taşımaz
Bu dezavantajların üstesinden nasıl geliyoruz, bunu da ele alacağız.
Temel rsync Parametrelerini Anlayalım
Klonlama senaryolarında kullandığım parametreler:
-a (–archive): Arşiv modu. Sembolik linkleri, izinleri, zaman damgalarını, grup ve sahiplik bilgilerini korur. Dizinleri özyinelemeli kopyalar.
-v (–verbose): Ne yapıldığını ekrana yazar.
-z (–compress): Ağ üzerinden transfer ederken veriyi sıkıştırır. Yerel kopyada gereksiz CPU harcar.
-H (–hard-links): Hard link’leri korur. Özellikle /etc gibi dizinlerde önemlidir.
-A (–acls): POSIX ACL’leri kopyalar.
-X (–xattrs): Extended attribute’ları kopyalar. SELinux context’leri için kritik.
–delete: Kaynakta olmayan dosyaları hedeften siler. Gerçek ayna için şart.
–exclude: Belirtilen dizin veya dosyaları atlar.
–progress: Dosya başına ilerleme gösterir.
–numeric-ids: Kullanıcı ve grup adlarını değil, ID’leri kullanır. Farklı sistemler arası kopyalamada güvenli.
–one-file-system: Farklı mount noktalarına geçmez. Sistem kopyasında /proc, /sys gibi sanal dosya sistemlerini atlamak için kullanılır.
Senaryo 1: Aynı Sunucu İçinde Disk Değişimi
Elimde çalışan bir Ubuntu 22.04 sunucu var, 500GB HDD’yi 1TB SSD ile değiştireceğim. Sistemi kapatmadan, minimum downtime ile.
Önce yeni diski bağlayıp partition’ları oluşturuyorum. Eski disk /dev/sda, yeni disk /dev/sdb.
# Eski diskin partition tablosunu görüntüle
fdisk -l /dev/sda
# Partition tablosunu yeni diske kopyala (GPT için)
sgdisk -R /dev/sdb /dev/sda
sgdisk -G /dev/sdb # Yeni GUID ata
# Yeni diski formatla
mkfs.ext4 /dev/sdb1 # boot
mkfs.ext4 /dev/sdb2 # root
# Yeni diski bağla
mkdir -p /mnt/newdisk
mount /dev/sdb2 /mnt/newdisk
mkdir -p /mnt/newdisk/boot
mount /dev/sdb1 /mnt/newdisk/boot
Şimdi rsync ile sistemi kopyalıyorum:
rsync -aHAXv
--exclude='/dev/*'
--exclude='/proc/*'
--exclude='/sys/*'
--exclude='/tmp/*'
--exclude='/run/*'
--exclude='/mnt/*'
--exclude='/media/*'
--exclude='/lost+found'
--delete
/ /mnt/newdisk/
Bu komutun bitmesi birkaç saat alabilir. İşin bittiğini düşündükten sonra, sistemi kapatmadan hemen önce değişiklikleri senkronize etmem gerekiyor. Çünkü kopyalama sırasında da dosyalar değişti.
# Minimal downtime için: önce sistemi maintenance moduna al
# Sonra hızlı bir senkronizasyon daha yap
rsync -aHAXv
--exclude='/dev/*'
--exclude='/proc/*'
--exclude='/sys/*'
--exclude='/tmp/*'
--exclude='/run/*'
--exclude='/mnt/*'
--exclude='/media/*'
--exclude='/lost+found'
--delete
/ /mnt/newdisk/
# fstab'ı güncelle
blkid /dev/sdb2 # Yeni UUID'yi öğren
vim /mnt/newdisk/etc/fstab # UUID'leri güncelle
Bootloader kurulumu:
# Chroot ile yeni sisteme gir
mount --bind /dev /mnt/newdisk/dev
mount --bind /proc /mnt/newdisk/proc
mount --bind /sys /mnt/newdisk/sys
chroot /mnt/newdisk
# Chroot içinde grub kur
grub-install /dev/sdb
update-grub
exit
# Bind mount'ları kaldır
umount /mnt/newdisk/dev
umount /mnt/newdisk/proc
umount /mnt/newdisk/sys
Senaryo 2: Uzak Sunucuya Göç (SSH Üzerinden)
Bu senaryoda üretim sunucusunu (192.168.1.10) yeni bir sunucuya (192.168.1.20) taşıyorum. Her iki sunucu da çalışıyor.
Önce SSH key-based authentication kuruyorum, şifre sormadan kopyalama yapabileyim:
# Kaynak sunucuda
ssh-keygen -t ed25519 -f /root/.ssh/migration_key
ssh-copy-id -i /root/.ssh/migration_key.pub [email protected]
Büyük bir transfer öncesinde ağ hızını test etmek iyi fikir:
# Yaklaşık transfer hızını ölç
rsync -a --stats /dev/null [email protected]:/dev/null 2>&1 | head -5
# Ya da iperf3 ile
iperf3 -s # Hedef sunucuda
iperf3 -c 192.168.1.20 # Kaynak sunucuda
İlk büyük transfer, gece çalıştırıyorum:
rsync -aHAXzv
-e "ssh -i /root/.ssh/migration_key -o StrictHostKeyChecking=no"
--exclude='/dev/*'
--exclude='/proc/*'
--exclude='/sys/*'
--exclude='/tmp/*'
--exclude='/run/*'
--exclude='/mnt/*'
--exclude='/media/*'
--exclude='/lost+found'
--exclude='/var/log/*'
--numeric-ids
--delete
/ [email protected]:/mnt/migration/
--numeric-ids parametresi burada kritik. Kaynak ve hedef sistemlerde aynı kullanıcı adı farklı UID’ye sahip olabilir. Bu parametre ile UID/GID sayısal değerleriyle taşınır.
Göç günü geldiğinde, son senkronizasyon:
# Servisleri durdur (örneğin web + veritabanı)
systemctl stop nginx
systemctl stop postgresql
# Son senkronizasyon, bu sefer hızlı olacak
rsync -aHAXzv
-e "ssh -i /root/.ssh/migration_key"
--exclude='/dev/*'
--exclude='/proc/*'
--exclude='/sys/*'
--exclude='/tmp/*'
--exclude='/run/*'
--numeric-ids
--delete
/ [email protected]:/mnt/migration/
Senaryo 3: Kademeli Yedekleme ile Snapshot Benzeri Yapı
rsync’in --link-dest parametresi ile her gün tam yedek almak yerine, önceki yedeğe hard link oluşturan artımlı yedekler alabiliriz. Disk kullanımı açısından çok verimli.
#!/bin/bash
# /usr/local/bin/rsync-snapshot.sh
KAYNAK="/"
HEDEF="/backup/snapshots"
TARIH=$(date +%Y-%m-%d_%H-%M)
ONCEKI=$(ls -1d ${HEDEF}/????-??-??_??-?? 2>/dev/null | tail -1)
EXCLUDE_OPTS=(
"--exclude=/dev/*"
"--exclude=/proc/*"
"--exclude=/sys/*"
"--exclude=/tmp/*"
"--exclude=/run/*"
"--exclude=/mnt/*"
"--exclude=/backup/*"
"--exclude=/lost+found"
)
if [ -n "$ONCEKI" ]; then
rsync -aHAX
"${EXCLUDE_OPTS[@]}"
--link-dest="${ONCEKI}"
--delete
"${KAYNAK}" "${HEDEF}/${TARIH}/"
else
rsync -aHAX
"${EXCLUDE_OPTS[@]}"
--delete
"${KAYNAK}" "${HEDEF}/${TARIH}/"
fi
# 30 günden eski snapshotları sil
find "${HEDEF}" -maxdepth 1 -type d -mtime +30 -exec rm -rf {} ;
echo "Snapshot tamamlandi: ${HEDEF}/${TARIH}"
Bu script’i cron’a ekleyebiliriz:
chmod +x /usr/local/bin/rsync-snapshot.sh
echo "0 2 * * * root /usr/local/bin/rsync-snapshot.sh >> /var/log/rsync-snapshot.log 2>&1" >> /etc/cron.d/rsync-snapshot
Veritabanlarını Güvenli Taşıma
rsync tek başına çalışan PostgreSQL veya MySQL veritabanlarını tutarsız kopyalayabilir. Çözüm: önce dump al, sonra rsync yap.
# PostgreSQL için
pg_dumpall -U postgres > /tmp/pg_full_backup.sql
rsync -avz /tmp/pg_full_backup.sql [email protected]:/tmp/
# MySQL/MariaDB için
mysqldump --all-databases --single-transaction
--flush-logs --master-data=2
-u root -p > /tmp/mysql_full_backup.sql
rsync -avz /tmp/mysql_full_backup.sql [email protected]:/tmp/
# Hedef sunucuda geri yükle
ssh [email protected] "psql -U postgres < /tmp/pg_full_backup.sql"
Eğer veritabanı çok büyükse ve dump/restore yavaşsa, veritabanını durdurarak rsync ile data dizinini kopyalayabiliriz:
# PostgreSQL data dizinini kopyala
systemctl stop postgresql
rsync -aHAXv --delete
/var/lib/postgresql/
[email protected]:/var/lib/postgresql/
systemctl start postgresql
Performans Optimizasyonu
Büyük transferlerde rsync’i hızlandırmak için bazı tüyolar:
# Daha hızlı şifreleme algoritması kullan
rsync -aHAXz
-e "ssh -c aes128-ctr -o Compression=no"
--numeric-ids
/ [email protected]:/mnt/migration/
# Çok sayıda küçük dosya varsa (örn. mail spool, web cache)
# --no-whole-file ve --inplace kombinasyonu işe yarayabilir
rsync -aHAX
--inplace
--no-whole-file
/var/spool/mail/ [email protected]:/var/spool/mail/
Lokal ağda sıkıştırma genellikle yavaşlatır. Ağ hızınız 1Gbps’in üzerindeyse -z parametresini kullanmayın, CPU’ya gereksiz yük bindirirsiniz.
# Transfer sonrası bütünlük kontrolü
rsync -aHAXn --checksum
--exclude='/dev/*'
--exclude='/proc/*'
--exclude='/sys/*'
/ [email protected]:/mnt/migration/
| grep -v "/$" | head -50
-n (–dry-run) parametresi ile gerçek transfer yapmadan, sadece farklılıkları raporlatabilirsiniz. Bu, göçten sonra doğrulama için ideal.
Göç Sonrası Kontrol Listesi
Yeni sunucu ayağa kalktıktan sonra sırasıyla şunları kontrol etmelisiniz:
Temel sistem kontrolleri:
/etc/fstabUUID’lerinin doğru olduğunu confirm edin- Ağ arayüzü isimlerinin değişip değişmediğini kontrol edin (eth0 vs ens3 gibi)
- Hostname ayarlarını doğrulayın
- SSH key’lerinin yerli yerinde olduğunu test edin
Servis kontrolleri:
systemctl --failedile başlayamayan servisleri listeleyin- Kritik servisler için
systemctl statusçalıştırın - Uygulamaların log dosyalarını ilk 10 dakika takip edin
Ağ ve güvenlik:
# Yeni sunucuda ağ arayüzünü kontrol et
ip addr show
ip route show
# Firewall kurallarının gelip gelmediğini kontrol et
iptables -L -n
# veya
ufw status verbose
# SELinux varsa context'leri yeniden etiketle
restorecon -Rv /
Sık Karşılaşılan Sorunlar ve Çözümleri
“Operation not permitted” hataları: Root olmadan çalışıyorsunuz veya hedef dosya sistemi bazı özellikleri desteklemiyor. Her iki tarafta da root olarak çalıştığınızdan emin olun.
Transfer yarıda kesiliveriyor: Büyük transferlerde SSH timeout olabilir. Bunu önlemek için:
# SSH config'e ekle veya komuta parametre olarak ver
rsync -aHAXz
-e "ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=10"
/ [email protected]:/mnt/migration/
“No space left on device” hatası: Hedef diskte yer bitti. Önce ne kadar yer gerektiğini tahmin edin:
# Kopyalanacak veri miktarını hesapla
rsync -an --stats
--exclude='/dev/*' --exclude='/proc/*'
--exclude='/sys/*' --exclude='/tmp/*'
/ /mnt/newdisk/ 2>&1 | grep "Total file size"
Sembolik linkler kırık görünüyor: --copy-links yerine -a (ya da -l) kullandığınızdan emin olun. -a sembolik linkleri olduğu gibi kopyalar, hedef gösterilen dosyayı değil.
SELinux’ta servisler başlamıyor: rsync SELinux context’lerini korumak için -X parametresine ihtiyaç duyar. Eğer taşıma sırasında bunu kaçırdıysanız:
# Tüm dosya sistemini yeniden etiketle (uzun sürer)
touch /.autorelabel
reboot
Büyük Ölçekli Ortamlar İçin Script Altyapısı
Birden fazla sunucu göçü yapıyorsanız, bunu script haline getirmek mantıklı:
#!/bin/bash
# sunucu-goc.sh
# Kullanim: ./sunucu-goc.sh kaynak_ip hedef_ip
KAYNAK_IP=$1
HEDEF_IP=$2
LOG_FILE="/var/log/migration_${KAYNAK_IP//./_}.log"
SSH_OPTS="-o StrictHostKeyChecking=no -o ServerAliveInterval=60"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
if [ -z "$KAYNAK_IP" ] || [ -z "$HEDEF_IP" ]; then
echo "Kullanim: $0 <kaynak_ip> <hedef_ip>"
exit 1
fi
log "Goc basliyor: ${KAYNAK_IP} -> ${HEDEF_IP}"
# Hedef sunucuda dizin olustur
ssh ${SSH_OPTS} root@${HEDEF_IP} "mkdir -p /mnt/migration"
# Ilk buyuk transfer
log "Ilk transfer basladi..."
rsync -aHAXz
-e "ssh ${SSH_OPTS}"
--exclude='/dev/*'
--exclude='/proc/*'
--exclude='/sys/*'
--exclude='/tmp/*'
--exclude='/run/*'
--numeric-ids
--delete
--stats
root@${KAYNAK_IP}:/ root@${HEDEF_IP}:/mnt/migration/
2>&1 | tee -a "$LOG_FILE"
log "Transfer tamamlandi. Dogrulama yapiliyor..."
# Basit dogrulama
KAYNAK_COUNT=$(ssh ${SSH_OPTS} root@${KAYNAK_IP} "find /
--exclude-dir={dev,proc,sys,tmp,run}
-type f 2>/dev/null | wc -l")
HEDEF_COUNT=$(ssh ${SSH_OPTS} root@${HEDEF_IP}
"find /mnt/migration -type f 2>/dev/null | wc -l")
log "Kaynak dosya sayisi: ${KAYNAK_COUNT}"
log "Hedef dosya sayisi: ${HEDEF_COUNT}"
Sonuç
rsync ile sistem klonlama ve sunucu göçü, doğru parametreler ve biraz planlama ile oldukça güvenilir bir süreç haline geliyor. Benim önerdiğim yaklaşım şu: büyük transferi gece alın, göç günü servisleri durdurup hızlı bir delta sync yapın, ardından bootloader ve fstab düzenlemelerini hallederek sistemi ayağa kaldırın.
Kritik üretim sistemlerinde her zaman bir geri dönüş planınız olsun. Eski sunucuyu hemen kapatmayın, en az 24-48 saat yeni sistemin stabil çalıştığından emin olduktan sonra yedeğe alın. Veritabanları için rsync tek başına yeterli değil, mutlaka dump/restore veya replikasyon mekanizması kullanın.
rsync öğrenme eğrisi düşük, esnek ve her Linux sistemde hazır bulunan bir araç. Enterprise klonlama araçlarına para harcamadan önce rsync’in neler yapabileceğini bir keşfedin. Çoğu zaman fazlasıyla yeterli olduğunu göreceksiniz.
