Sunucu yönetiminin en kritik ama en çok ihmal edilen konusu yedeklemedir. Bir disk arızası, yanlış bir rm komutu ya da bir güvenlik ihlali; hepsi tek bir dakikada aylarca biriktirdiğiniz veriyi silip süpürebilir. İşte rsync, Linux dünyasında yedekleme ve dosya senkronizasyonunun altın standardıdır; hızlı, güvenilir ve inanılmaz esnektir.
Bu rehberde rsync'in neden bu kadar verimli olduğunu (delta-transfer sihri), en çok kullanacağınız bayrakları, SSH üzerinden uzak sunucu yedeklemeyi, cron ile otomatik gecelik yedek kurmayı ve herkesin bir kez düştüğü meşhur "trailing slash" tuzağını uygulamalı örneklerle ele alacağız. Temel Linux komutlarını hatırlamak isterseniz Linux temel komutları yazımız iyi bir başvuru kaynağıdır.
rsync Nedir ve Delta-Transfer Avantajı#
rsync (remote sync), dosyaları ve dizinleri bir kaynaktan bir hedefe kopyalayan bir komut satırı aracıdır. Onu basit bir cp veya scp'den ayıran şey, "delta-transfer" adı verilen akıllı algoritmasıdır. rsync, hedefte zaten var olan dosyaları baştan kopyalamak yerine, kaynak ve hedef arasındaki farkları hesaplar ve yalnızca değişen kısımları aktarır.
Bunu somutlaştıralım: 10 GB'lık bir web sitesi dizininiz olsun ve bugün sadece birkaç dosya değişmiş olsun. scp ile yedek alırsanız 10 GB'ın tamamı yeniden aktarılır. rsync ise ilk yedeklemede 10 GB'ı aktarır, ama ikinci yedeklemede sadece değişen o birkaç dosyayı (hatta büyük dosyalarda sadece değişen blokları) gönderir. Bu, ağ trafiğini ve süreyi dramatik biçimde azaltır.
Bu verimlilik, özellikle uzak sunuculara internet üzerinden yedek alırken çok değerlidir. rsync ayrıca dosya izinlerini, sahiplik bilgilerini, zaman damgalarını ve sembolik bağları koruyabilir; yani bir dizinin birebir aynısını, tüm meta verileriyle birlikte oluşturabilir. Bu özellikleri onu hem günlük senkronizasyon hem de düzenli yedekleme için ideal kılar.
Temel Sözdizimi ve En Önemli Bayraklar#
rsync'in temel sözdizimi son derece basittir: kaynak ve hedef belirtirsiniz.
rsync [seçenekler] KAYNAK HEDEF
Gerçek gücü ise bayraklarında (seçeneklerinde) yatar. En çok kullanacağınız bayrakları bilmek, rsync'i günlük aracınız yapmaya yeter:
| Bayrak | Anlamı |
|---|---|
-a | Arşiv modu; izinler, sahiplik, zaman damgaları ve sembolik bağları korur (en sık kullanılan) |
-v | Verbose; ne kopyalandığını ekrana yazar |
-z | Aktarım sırasında veriyi sıkıştırır (yavaş ağlarda faydalı) |
-h | Boyutları insan-okur biçimde gösterir (KB, MB, GB) |
-P | İlerleme çubuğu gösterir ve yarım kalan aktarımları sürdürür (--partial --progress) |
--delete | Kaynakta olmayan dosyaları hedeften de siler (birebir ayna için) |
--dry-run | Hiçbir şey yapmadan sadece ne olacağını gösterir (test için hayati) |
--exclude | Belirtilen dosya/dizinleri aktarımdan hariç tutar |
Bu bayrakların büyük kısmını birleştirebilirsiniz. Neredeyse her rsync komutunun temelinde -avh üçlüsü bulunur. İlk kez bir komut çalıştırmadan önce --dry-run ekleyip sonucu görmek, özellikle --delete gibi tehlikeli seçenekler kullanırken kaza riskini ortadan kaldırır:
# Önce ne olacağını test et (hiçbir şey silinmez/kopyalanmaz)
rsync -avh --delete --dry-run /kaynak/ /hedef/
# Sonuçtan eminsen gerçek çalıştır
rsync -avh --delete /kaynak/ /hedef/
Yerel Dizinler Arası Senkronizasyon#
En basit kullanım, aynı sunucu içinde bir dizini başka bir konuma (örneğin başka bir diske veya bağlı bir yedek noktasına) kopyalamaktır. Bir web sitesinin dosyalarını yerel bir yedek dizinine kopyalayalım:
# /var/www/site dizinini /yedek/site altına senkronize et
rsync -avh /var/www/site/ /yedek/site/
Bu komut ilk çalıştığında tüm dosyaları kopyalar. Bir daha çalıştırdığınızda ise sadece değişen dosyaları aktarır; bu yüzden düzenli yedekler çok hızlı tamamlanır. Eğer kaynakta silinen dosyaların hedefte de silinmesini istiyorsanız (yani birebir ayna) --delete ekleyin:
# Birebir ayna: kaynakta olmayan hedeftekiler de silinir
rsync -avh --delete /var/www/site/ /yedek/site/
Dikkat: --delete güçlü ama tehlikeli bir bayraktır. Kaynak yolu yanlış yazarsanız hedefteki dosyaları da silebilir. Bu yüzden --delete kullanan her yeni komutu mutlaka önce --dry-run ile test edin. Yedeklerinizi genellikle harici bir diske veya farklı bir fiziksel sunucuya almak, aynı disk üzerindeki bir kopyaya kıyasla çok daha güvenlidir; çünkü disk arızasında her iki kopya birden gitmez.
SSH Üzerinden Uzak Sunucu Yedekleme#
rsync'in gerçek gücü, SSH üzerinden uzak sunucularla çalışabilmesidir. Yerel makinenizden uzak bir sunucuya yedek gönderebilir (push) veya uzak sunucudan yerel makinenize yedek çekebilirsiniz (pull). Sözdizimi, hedef veya kaynağın başına kullanıcı@sunucu: eklemenizle değişir. SSH güvenliği hakkında derinlemesine bilgi için SSH bağlantısı ve güvenliği yazımızı incelemenizi öneririz.
Yerelden uzak sunucuya yedek göndermek (push):
# Yerel /var/www/site dizinini uzak sunucuya yedekle
rsync -avhz -e ssh /var/www/site/ kullanici@sunucu-ip:/yedek/site/
Uzak sunucudan yerele yedek çekmek (pull) — genellikle merkezi bir yedek sunucusunda tercih edilir:
# Uzak sunucudaki dizini yerel yedek diskine çek
rsync -avhz -e ssh kullanici@sunucu-ip:/var/www/site/ /yedek/site/
Burada -z bayrağı, veriyi internet üzerinden sıkıştırarak gönderir ve yavaş bağlantılarda süreyi kısaltır. -e ssh bölümü aktarımın SSH üzerinden yapılacağını söyler (modern rsync bunu varsayılan kabul eder ama açıkça belirtmek nettir). Standart dışı bir SSH portu kullanıyorsanız -e "ssh -p 2222" şeklinde belirtebilirsiniz. Otomatik yedeklerde parola sormaması için mutlaka SSH anahtar (key) tabanlı kimlik doğrulama kurmalısınız; aksi halde cron içindeki komut parola bekleyip takılır.
Dosyaları Hariç Tutma ve Filtreleme#
Bir dizini yedeklerken her şeyi kopyalamak istemeyebilirsiniz. Geçici dosyalar, önbellek dizinleri, log dosyaları veya kaynak paket dizinleri (node_modules, vendor gibi) hem yer kaplar hem gereksizdir. --exclude bayrağı ile bunları dışarıda bırakabilirsiniz:
# Belirli dizin ve desenleri hariç tutarak yedekle
rsync -avh \
--exclude 'node_modules' \
--exclude '*.log' \
--exclude 'cache/' \
--exclude '.git' \
/var/www/site/ /yedek/site/
Hariç tutulacak öğe çoksa, hepsini bir dosyaya yazıp --exclude-from ile okutmak daha temizdir:
# exclude listesi: exclude.txt (her satırda bir desen)
rsync -avh --exclude-from='/root/exclude.txt' /var/www/site/ /yedek/site/
exclude.txt dosyasının içeriği şöyle görünebilir:
node_modules
*.log
*.tmp
cache/
.git
Desenler kaynak dizinine görelidir. Sonuna / koyarsanız yalnızca dizinlerle eşleşir. --include ile bir istisnayı geri dahil edebilirsiniz, ama çoğu yedekleme senaryosunda sadece --exclude yeterlidir. Hangi dosyaların hariç tutulduğunu görmek için yine --dry-run ekleyerek çıktıyı kontrol edin.
Trailing Slash Tuzağı ve Artımlı Yedek Stratejisi#
rsync'te en sık yapılan hata, kaynak yolunun sonundaki eğik çizgi (trailing slash) ile ilgilidir. Bu küçük detay davranışı tamamen değiştirir ve doğru anlamadan kullanan herkes en az bir kez yanlış konuma yedek almıştır.
Kural şudur: kaynağın sonunda / varsa, o dizinin içeriği hedefe kopyalanır; yoksa, dizinin kendisi hedefin içine kopyalanır. Örnekle netleşir:
# Sondaki slash VAR: site dizininin İÇERİĞİ /yedek/ altına gider
# Sonuç: /yedek/index.php, /yedek/style.css ...
rsync -avh /var/www/site/ /yedek/
# Sondaki slash YOK: site dizininin KENDİSİ /yedek/ altına gider
# Sonuç: /yedek/site/index.php, /yedek/site/style.css ...
rsync -avh /var/www/site /yedek/
Alışkanlık olarak çoğu yönetici hem kaynağa hem hedefe sonda / koymayı ve zihinsel olarak "dizinin içeriğini şuraya" diye düşünmeyi tercih eder. Yanlış konuma yedek almanın önüne geçmenin en güvenli yolu ilk çalıştırmayı yine --dry-run ile test etmektir.
Yedekleme stratejisi olarak iki yaklaşım vardır. Tam yedek her seferinde her şeyi ayrı bir konuma kopyalar; basittir ama yer israfıdır. Artımlı yedek ise sadece değişenleri saklar; rsync'in doğal davranışı zaten değişenleri aktarmak olduğundan, tek bir hedef dizini sürekli güncelleyerek düşük maliyetli bir "en güncel ayna" tutabilirsiniz. Gerçek bir felaket kurtarma için ise tarihli anlık görüntüler (snapshot) tutmak daha iyidir; bunu bir sonraki bölümde ele alıyoruz.
--link-dest ile Snapshot Mantığı#
Sadece "en güncel ayna" tutmak, dünkü yanlışlıkla silinen bir dosyayı bugün kurtaramamanız anlamına gelir; çünkü ayna da onu silmiştir. Bunun çözümü, her gün ayrı bir tarihli klasörde tam görünümlü ama disk açısından ekonomik anlık görüntüler tutmaktır. rsync bunu --link-dest ile sağlar.
--link-dest, bir önceki yedeği referans alır ve değişmemiş dosyaları yeniden kopyalamak yerine onlara sabit bağ (hard link) oluşturur. Sonuçta her tarihli klasör sanki tam bir yedekmiş gibi görünür, ama değişmeyen dosyalar diskte tek bir kez saklanır. Böylece 30 günlük yedek tutmanız 30 kat değil, yalnızca değişikliklerin toplamı kadar yer kaplar:
# Bugünün tarihli yedeği, dün ile ortak dosyaları hard-link'ler
DUN=$(date -d "yesterday" +%F)
BUGUN=$(date +%F)
rsync -avh --delete \
--link-dest=/yedek/$DUN/ \
/var/www/site/ /yedek/$BUGUN/
Bu yaklaşım, ticari yedekleme yazılımlarının "snapshot" mantığının basit ama son derece etkili bir uygulamasıdır. Eski yedekleri silmek de kolaydır; bir klasörü sildiğinizde diğer günlerin paylaştığı dosyalar sabit bağ sayesinde korunmaya devam eder. Kurumsal ölçekte otomatik ve yönetilen bir yedek çözümü isterseniz, bu tür scriptlerle uğraşmak yerine Clou.TR'nin yedekleme hizmetini değerlendirebilirsiniz.
Cron ile Otomatik Gecelik Yedek#
Elle çalıştırılan bir yedek, unutulmaya mahkumdur. Gerçek koruma otomasyonla gelir. rsync'i cron ile birleştirerek her gece otomatik çalışan bir yedek kurabilirsiniz. cron'un ayrıntıları için cron görevleri rehberimize bakabilirsiniz.
Önce yedekleme işini yapan basit bir script yazalım (/root/yedek.sh):
#!/bin/bash
BUGUN=$(date +%F)
KAYNAK="/var/www/site/"
HEDEF="/yedek/$BUGUN/"
DUN=$(date -d "yesterday" +%F)
rsync -avh --delete \
--exclude-from='/root/exclude.txt' \
--link-dest="/yedek/$DUN/" \
"$KAYNAK" "$HEDEF" >> /var/log/yedek.log 2>&1
# 30 günden eski yedekleri temizle
find /yedek/ -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
Scripti çalıştırılabilir yapıp cron'a ekleyin:
# Scripti çalıştırılabilir yap
sudo chmod +x /root/yedek.sh
# crontab'ı düzenle
sudo crontab -e
crontab içine her gece saat 03.00'te çalışacak satırı ekleyin:
# Her gece 03:00'te yedekle
0 3 * * * /root/yedek.sh
Artık sunucunuz her gece otomatik olarak tarihli, artımlı bir yedek alır ve 30 günden eski olanları temizler. Yedeklerin gerçekten alındığını doğrulamak için /var/log/yedek.log dosyasını ara sıra kontrol edin. Unutmayın: test edilmemiş yedek, yedek değildir. Ayda bir yedekten örnek bir dosyayı geri yükleyip bütünlüğünü doğrulamak, kritik bir alışkanlıktır.
Geri Yükleme#
Yedek almanın tek amacı, gün geldiğinde geri yükleyebilmektir. rsync ile geri yükleme, yedeği kaynak, canlı dizini hedef yaparak aynı komutu ters yönde çalıştırmaktır. Örneğin dün gece alınan yedekten siteyi geri yüklemek:
# Belirli bir tarihli yedekten canlı dizine geri yükle
rsync -avh /yedek/2026-07-08/ /var/www/site/
Tek bir dosyayı geri getirmek isterseniz, tüm dizini değil sadece o dosyayı belirtmeniz yeterlidir:
# Sadece tek bir dosyayı geri yükle
rsync -avh /yedek/2026-07-08/wp-config.php /var/www/site/
Geri yüklerken --delete kullanmamaya özen gösterin; aksi halde yedekte olmayan ama canlıda olması gereken yeni dosyaları silebilirsiniz. Kritik bir geri yüklemeden önce mutlaka --dry-run ile ne olacağını görün ve mümkünse canlı dizinin bir kopyasını da alın; böylece geri yükleme beklendiği gibi gitmezse başlangıç durumuna dönebilirsiniz.
Sıkça Sorulan Sorular#
rsync ile scp arasındaki fark nedir?#
scp dosyaları her seferinde baştan sona kopyalar; hedefte aynı dosya olsa bile yeniden aktarır. rsync ise delta-transfer algoritmasıyla yalnızca değişen kısımları gönderir, bu yüzden düzenli yedeklemelerde çok daha hızlı ve az bant genişliği kullanır. Ayrıca rsync dosya izinlerini, sahipliği ve zaman damgalarını koruyabilir, yarım kalan aktarımları sürdürebilir ve --exclude gibi filtreleme seçenekleri sunar; bu da onu yedekleme için scp'ye kıyasla çok daha güçlü kılar.
Trailing slash (sondaki eğik çizgi) neden önemli?#
Kaynak yolunun sonundaki /, rsync'in dizini nasıl kopyalayacağını belirler. Sonda / varsa dizinin içeriği hedefe kopyalanır; yoksa dizinin kendisi hedefin içine bir alt klasör olarak kopyalanır. Bu küçük fark yanlış konuma yedek almanıza yol açabileceği için, yeni bir komutu ilk kez çalıştırmadan önce mutlaka --dry-run ile sonucu test etmelisiniz.
rsync ile artımlı yedek nasıl alınır?#
rsync doğası gereği yalnızca değişen dosyaları aktardığı için, aynı hedef dizini tekrar tekrar güncelleyerek zaten artımlı çalışır. Tarihli anlık görüntüler (snapshot) tutmak isterseniz --link-dest bayrağıyla önceki yedeği referans gösterirsiniz; değişmeyen dosyalar için sabit bağ oluşturulur, böylece her tarihli klasör tam yedek gibi görünür ama diskte minimum yer kaplar. Bu yöntem 30 günlük yedeği 30 kat değil, yalnızca değişikliklerin toplamı kadar alanda saklamanızı sağlar.
Otomatik rsync yedeklerinde parola sorununu nasıl çözerim?#
Cron ile çalışan bir rsync komutu SSH parolası soramaz, bu yüzden SSH anahtar tabanlı kimlik doğrulama kurmanız gerekir. Yerel sunucuda ssh-keygen ile bir anahtar çifti oluşturup açık anahtarı ssh-copy-id ile uzak sunucuya kopyaladığınızda parolasız ve güvenli bağlantı sağlanır. Bu sayede cron içindeki yedek komutu parola beklemeden sorunsuz çalışır; ayrıntılar için SSH güvenliği yazımıza göz atabilirsiniz.
--delete bayrağını kullanmak tehlikeli mi?#
--delete, kaynakta bulunmayan dosyaları hedeften de siler ve birebir ayna oluşturmak için gereklidir, ancak yanlış kullanıldığında veri kaybına yol açabilir. Örneğin kaynak yolunu yanlış yazarsanız hedefteki tüm dosyaları silebilir. Bu yüzden --delete içeren her komutu önce --dry-run ile test etmeli ve yedeklerinizi tek bir aynadan ibaret bırakmayıp --link-dest ile tarihli snapshot'lar da tutmalısınız.
Yedeğimin gerçekten çalıştığından nasıl emin olurum?#
Bir yedeğin geçerliliği ancak geri yükleme testiyle kanıtlanır; "test edilmemiş yedek, yedek değildir" ilkesi burada esastır. Düzenli olarak (örneğin ayda bir) yedekten örnek bir dosyayı veya küçük bir dizini ayrı bir konuma geri yükleyip içeriğini kontrol etmelisiniz. Ayrıca cron ile aldığınız yedeklerin log dosyasını periyodik okuyarak hata olup olmadığını ve dosya sayısının beklendiği gibi arttığını doğrulamanız önerilir.
Kapanış#
rsync, doğru öğrenildiğinde bir sistem yöneticisinin elindeki en güçlü yedekleme ve senkronizasyon araçlarından biridir. Delta-transfer sayesinde hızlıdır, SSH ile güvenlidir, --exclude ile esnektir ve --link-dest ile disk dostu snapshot'lar üretir. cron ile birleştirdiğinizde ise 7/24 sizin yerinize çalışan otomatik bir yedek sistemine sahip olursunuz.
Yine de en iyi rsync scripti bile disk arızasına, veri merkezinde bir soruna veya bir insan hatasına karşı tek başına yeterli olmayabilir. Kritik verileriniz için yönetilen ve harici bir çözüm istiyorsanız Clou.TR'nin yedekleme hizmetini inceleyin. Bu tür yedek scriptlerini özgürce çalıştırabileceğiniz tam kök erişimli VDS ve sanal sunucularımıza, ya da tüm bakımı bize bırakabileceğiniz sunucu yönetimi hizmetimize göz atabilirsiniz.