Sorun
rsync komutu ile yapılan basit bir kopyalama işlemi, kaynak dizini hedef dizine yansıtır ancak sadece bir kopya tutar. Her senkronizasyonda önceki durum silinir ve yeni bir tam kopya oluşturulur. Bu durum, disk alanını büyük ölçüde tüketirken, çoğu dosyanın değişmediği gerçeğiyle çelişir.
Çözüm: --link-dest Seçeneği
--link-dest seçeneği, hem disk alanından tasarruf sağlayan hem de her yedeklemenin bağımsız, tam görünürlüklü bir snapshot gibi görünmesini sağlayan bir çözümdür. Bu seçenekle:
- Değişmemiş dosyalar, yeni bir kopya yerine sert bağlantı (hard link) olarak saklanır.
- Her yeni snapshot, sadece yeni veya değiştirilmiş dosyalar için alan kullanır.
- Tüm snapshot'lar, bağımsız bir şekilde görüntülenebilir ve geri yüklenebilir.
Önemli Not: Sert bağlantılar aynı dosya sistemi içinde çalışır. Bu nedenle, hem referans snapshot hem de yeni snapshot aynı dosya sistemi üzerinde bulunmalıdır.
Adım Adım Kurulum
1. Temel Komutla Başlayın
Aşağıdaki komut, /home/user/ dizinini yedekler ve değişmemiş dosyaları önceki snapshot'a sert bağlantı olarak ekler:
rsync -a --link-dest=/mnt/backup/latest /home/user/ /mnt/backup/2026-06-19/
Komut Açıklaması:
-a: Arşiv modunu etkinleştirir (izinler, sahiplik, zaman damgası ve sembolik bağlantılar korunur).--link-dest=/mnt/backup/latest: Referans snapshot dizini. Değişmemiş dosyalar burada sert bağlantı olarak oluşturulur.
Dikkat: Kaynak dizin yolunun sonunda / kullanılması, dizinin içeriğinin doğrudan hedef dizine kopyalanmasını sağlar. Aksi takdirde, hedef dizin içinde user adlı bir alt dizin oluşturulur. --link-dest için mutlak yol kullanılması önemlidir.
2. Yeniden Kullanılabilir Bir Script Oluşturun
Elle komut çalıştırmak ve tarihleri elle düzenlemek hata yapmaya açıktır. Bunun yerine, her çalıştırmada otomatik olarak tarihli bir dizin oluşturulmalı ve latest sembolik bağlantısı en son snapshot'a işaret etmelidir.
Aşağıdaki script'i oluşturun:
#!/bin/bash
set -euo pipefail
SOURCE="/home/user/"
BACKUP_ROOT="/mnt/backup"
DATE="$(date +%Y-%m-%dT%H-%M-%S)"
DEST="$BACKUP_ROOT/$DATE"
LATEST="$BACKUP_ROOT/latest"
mkdir -p "$BACKUP_ROOT" "$DEST"
LINK_DEST=()
if [[ -d "$LATEST" ]]; then
LINK_DEST=(--link-dest="$LATEST")
fi
rsync -a "${LINK_DEST[@]}" "$SOURCE" "$DEST/"
# Snapshot tamamlandığında kaydedin ve latest bağlantısını güncelleyin
touch "$DEST"
ln -sfn "$DATE" "$LATEST"
Script Açıklaması:
set -euo pipefail: Hataları yakalar ve script'in güvenilir çalışmasını sağlar.LINK_DESTdizisi, ilk çalıştırmada boş olup tam bir yedekleme yapılmasını sağlar. Sonraki çalışmalarda, önceki snapshot'a referans verir.latestsembolik bağlantısı, her başarılı yedekleme sonrasında güncellenir.
Script'i çalıştırılabilir hale getirin:
sudo chmod +x /usr/local/bin/rsync-snapshot.sh
İlk yedeklemeyi çalıştırın:
sudo /usr/local/bin/rsync-snapshot.sh
3. Disk Alanı Tasarrufunu Doğrulayın
Tüm snapshot'ların birlikte ne kadar alan kullandığını du komutu ile ölçebilirsiniz:
du -sh --total /mnt/backup/2026-06-*
Örnek Çıktı:
2.1G /mnt/backup/2026-06-16T02-00-01
14M /mnt/backup/2026-06-17T02-00-02
9.8M /mnt/backup/2026-06-18T02-00-01
2.1G total
du komutu, sert bağlantılı dosyaları sadece bir kez sayar. İlk snapshot tüm veriyi içerirken, sonraki snapshot'lar sadece o snapshot'a özgü veriyi gösterir. total satırı, tüm snapshot'ların birlikte ne kadar alan kullandığını gösterir.
4. Dosyaları Geri Yükleyin
Her snapshot, normal bir dizin ağacı gibi davrandığından, dosyaları geri yüklemek basittir. Tek bir dosyayı geri yüklemek için:
cp /mnt/backup/2026-06-17T02-00-02/documents/report.odt /home/user/documents/
Tüm bir dizini geri yüklemek için:
rsync -a /mnt/backup/2026-06-17T02-00-02/documents/ /home/user/documents/
Önemli: Mevcut verilerin üzerine geri yükleme yapmadan önce, --dry-run seçeneğiyle değişiklikleri önceden inceleyin:
rsync -a --dry-run /mnt/backup/2026-06-17T02-00-02/ /home/user/
5. Eski Snapshot'ları Temizleyin
Snapshot'lar zamanla birikir, bu nedenle eski olanları belirli aralıklarla temizlemek önemlidir. Sert bağlantılar sayesinde, bir snapshot silindiğinde sadece o snapshot'a özgü veriler silinir. Diğer snapshot'larda referans verilen dosyalar kalır.
30 günden eski snapshot'ları listeleyin:
find /mnt/backup -maxdepth 1 -type d -name '20*' -mtime +30 -print
Çıktıyı dikkatlice kontrol edin. Doğrulandıktan sonra, bu dizinleri silin:
find /mnt/backup -maxdepth 1 -type d -name '20*' -mtime +30 -exec rm -rf -- {} +
6. Cron ile Otomatikleştirin
Yedekleme script'ini otomatik olarak çalıştırmak için root'un crontab'ına ekleyin:
sudo crontab -e
Aşağıdaki satırı ekleyin (her gün saat 02:00'de çalıştırılsın):
0 2 * * * /usr/bin/flock -n /run/lock/rsync-snapshot.lock /usr/local/bin/rsync-snapshot.sh
flock komutu, önceki yedekleme tamamlanmadan yeni bir yedekleme başlamasını engeller.
Uzaktan Sunucuya Yedekleme
Aynı iş akışı, SSH üzerinden uzaktaki bir sunucuya da uygulanabilir. İlk olarak, timestamp'ı bir değişken olarak saklayın:
DATE="$(date +%Y-%m-%dT%H-%M-%S)"
Uzaktaki sunucuda yeni snapshot dizinini oluşturun:
ssh user@backup-host "mkdir -p /mnt/backup/$DATE"
Dosyaları transfer edin ve uzaktaki latest snapshot'ını referans olarak kullanın:
rsync -a \
--link-dest=/mnt/backup/latest \
/home/user/ "user@backup-host:/mnt/backup/$DATE/"
İlk çalıştırmada latest bulunmayabilir, bu durumda tam bir kopya oluşturulur. Transfer başarılı olduktan sonra, uzaktaki sunucuda sembolik bağlantıyı güncelleyin:
ssh user@backup-host "touch /mnt/backup/$DATE && ln -sfn '$DATE' /mnt/backup/latest"
Ön Koşullar:
- Uzaktaki sunucuya SSH anahtar tabanlı kimlik doğrulaması kurulmuş olmalıdır.
- Hem yerel hem de uzak sistemde
rsyncyüklü olmalıdır.
Sık Karşılaşılan Sorunlar ve Çözümleri
Her snapshot tam boyutta görünüyor:
--link-destdizini eksik, farklı bir dosya sisteminde olabilir veya dosyaların korunmuş öznitelikleri farklı olabilir.ls -l /mnt/backup/latestkomutu ilelatestbağlantısının geçerli bir snapshot'a işaret ettiğinden emin olun. Değişmesi gereken bir dosyanın izinleri, sahiplik bilgileri, boyutu ve değiştirilme zamanı gibi özniteliklerini karşılaştırın.
Snapshot'larda izinler veya sahiplik hatalı:
Yedeklemeyi root olarak (veyasudoile) çalıştırın. Yeterli ayrıcalıklar olmadan,-aseçeneği orijinal kullanıcı ve grup bilgilerini geri yükleyemez.
Sert bağlantılar farklı dosya sistemleri arasında oluşturulamıyor:
Sert bağlantılar aynı dosya sistemi içinde çalışır. Referans snapshot ve yeni snapshot aynı hacimde bulunmalıdır. Tüm snapshot'ları tek bir yedekleme mount noktası altında tutun.
latestsembolik bağlantısı eksik veya tamamlanmamış bir snapshot'a işaret ediyor:
latestbağlantısını sadecersyncbaşarılı bir şekilde tamamlandıktan sonra güncelleyin. Bu rehberdeki script,set -ekullanır, bu nedenlersynchata verdiğindelnkomutuna ulaşmadan durur.
SSS
Her snapshot tüm verimin tam bir kopyasını mı saklıyor?
Hayır. Her snapshot bağımsız görünür, ancak değişmemiş dosyalar önceki snapshot'larda zaten saklanan veriye sert bağlantı olarak eklenir. Sadece yeni ve değiştirilmiş dosyalar ek alan kullanır.
Eski bir snapshot'ı silmek, yeni snapshot'ları bozar mı?
Hayır. Eski bir snapshot silindiğinde, sadece o snapshot'a özgü veriler serbest bırakılır. Yeni snapshot'larda sert bağlantılar aracılığıyla paylaşılan dosyalar kalır.
--link-dest,--backupseçeneğinden nasıl farklıdır?
--backup, tek bir senkronizasyonda değiştirilen dosyaları ayrı bir dizine kaydederken,--link-desther biri bağımsız ve tam görünürlüklü snapshot'lar oluşturur. Zaman içinde geçmiş tutmak için--link-destdoğru araçtır.
Sonuç
--link-dest seçeneğiyle, rsync disk alanından tasarruf eden ve her yedeklemeyi bağımsız olarak görüntülenebilir ve geri yüklenebilir snapshot'lar halinde saklayan bir yedekleme sistemi oluşturmanızı sağlar. Script ve geri yükleme işlemlerini güvenilir bir şekilde çalıştırmadan önce test edin. Gereksiz dosyaları dışarıda bırakmak için rsync hariç tutma desenlerini kullanmayı unutmayın.


