Rehber

rsync: Linux'ta dosya senkronizasyonu ve yedekleme örnekleri

Güncellendi: · Skillaria.Top

rsync dosyaları yerel olarak ve SSH üzerinden kopyalar ve eşitler; yalnızca değişen kısımları aktarır. Temel komut rsync -avz kaynak/ kullanici@sunucu:/yol/ biçimindedir: -a izinleri ve zamanı korur, -v aktarılan dosyaları gösterir, -z trafiği sıkıştırır; --delete hedefi kaynağın birebir kopyası yapar, -n ise değişiklik yapmadan önce sonucu denemenize olanak tanır.

rsync, Linux'ta dosya kopyalamak ve eşitlemek için standart bir araçtır: yerel olarak, diskler arasında ve SSH üzerinden sunucular arasında. cp ve scp'den temel farkı, yalnızca değişen kısmı aktarmasıdır; bu yüzden büyük bir dizini tekrar eşitlemek saniyeler sürer. Aşağıda proje dosyalarını sunucuya kopyalamak, bir dizinin aynasını tutmak, dışlamalar, anlık görüntülü yedekler ve zamanlanmış çalıştırma gibi tipik görevler için rsync örnekleri var.

Söz dizimi ve en gerekli bayraklar

Komutun genel biçimi:

rsync [seçenekler] KAYNAK... HEDEF

Kaynak ve hedef yerel yol olabilir ya da kullanici@sunucu:/yol biçiminde uzak yol olabilir. Taraflardan biri mutlaka yerel olmalıdır: rsync iki uzak makine arasında doğrudan kopyalama yapmaz.

BayrakNe yapar
-aarşiv kipi: özyinelemeli, izinleri, sahibi, grubu, değişiklik zamanını ve sembolik bağlantıları korur (-rlptgoD ile aynı)
-vaktarılan dosyaların listesini gösterir
-zağ üzerinden aktarırken veriyi sıkıştırır
-hboyutları okunabilir biçimde gösterir (K, M, G)
-P--partial --progress ile aynı: ilerleme ve yarıda kalan dosyanın devamı
-n, --dry-rundeneme çalıştırması: ne yapılacağını gösterir, hiçbir şeyi değiştirmez
--deletekaynakta olmayan dosyaları hedefte siler
--excludedosyaları şablona göre kopyalamaz
-euzak kabuğu belirler, örneğin -e "ssh -p 2222"
-H, -A, -Xsert bağlantıları, ACL'leri ve genişletilmiş öznitelikleri korur (-a içinde yoktur)

Pratikte vakaların on tanesinin dokuzunda yerel kopyalama için rsync -avh, ağ üzerinden için rsync -avzh yeterlidir.

Yoldaki sondaki eğik çizgi: asıl tuzak

Yeni başlayanların en sık yaptığı hata kaynağın sonundaki eğik çizgidir. Neyin kopyalanacağını bu belirler: dizinin kendisi mi yoksa yalnızca içeriği mi.

# project DİZİNİNİ /backup içine kopyala → /backup/project/... oluşur
rsync -av project /backup/

# project'in İÇERİĞİNİ /backup'a kopyala → dosyalar doğrudan /backup/ içine gelir
rsync -av project/ /backup/

Kolay hatırlamak için: kaynağın sonundaki eğik çizgi "bu dizinin içeriği" demektir. Hedefte eğik çizginin bir önemi yoktur. Emin değilseniz -n ekleyip rsync'in hangi yolları oluşturmaya çalışacağına bakın.

Yerel kopyalama

Bir dizini ilerleme göstererek harici diske kopyalamak için:

rsync -avhP ~/photos/ /mnt/usb/photos/

Aynı komutu tekrar çalıştırmak her şeyi baştan kopyalamaz: rsync dosya boyutunu ve değişiklik zamanını karşılaştırır, yalnızca yeni ve değişen dosyaları aktarır. Sondaki özet, gerçekte ne kadar veri aktarıldığını gösterir:

sending incremental file list
2026/10/IMG_2041.jpg
          4.12M 100%   38.40MB/s    0:00:00 (xfr#1, to-chk=0/1534)

sent 4.13M bytes  received 9.25K bytes  2.76M bytes/sec
total size is 6.82G  speedup is 1,648.21

speedup değeri, tam kopyalamaya kıyasla kaç kat daha az veri aktarıldığını gösterir.

SSH üzerinden rsync: sunucuya ve geri kopyalama

Uzak yollarda rsync varsayılan olarak SSH kullanır, bu yüzden ayrıca bir şey kurmak gerekmez; normal ssh girişinin çalışması yeterlidir. En rahat yol anahtar kullanmaktır: parola sorulmaz ve komut cron'a konabilir.

# Siteyi sunucuya yükle
rsync -avz ./site/ deploy@203.0.113.10:/var/www/site/

# Sunucudan logları kendi bilgisayarına indir
rsync -avz deploy@203.0.113.10:/var/log/nginx/ ./nginx-logs/

# Standart olmayan port ve belirli anahtarla SSH
rsync -avz -e "ssh -p 2222 -i ~/.ssh/deploy_key" ./site/ deploy@203.0.113.10:/var/www/site/

rsync her iki makinede de kurulu olmalıdır: uzak tarafta SSH üzerinden çalıştırılır. Yoksa rsync: command not found görürsünüz; paketi kurun (sudo apt install rsync veya sudo dnf install rsync).

Sunucu ~/.ssh/config içinde bir takma adla tanımlıysa rsync bunu anlar: rsync -avz ./site/ prod:/var/www/site/.

Sunucuda root hakları gerekiyorsa

Hedefteki dosyalar root'a aitse ve siz normal bir kullanıcıyla bağlanıyorsanız, uzak rsync'i sudo ile çalıştırabilirsiniz:

rsync -avz --rsync-path="sudo rsync" ./conf/ admin@server:/etc/myapp/

Bunun için sunucuda rsync için sudo parolasız çalışmalıdır (sudoers kuralı); aksi halde komut girdi beklerken takılır.

Dizin aynası: --delete

Varsayılan olarak rsync yalnızca dosya ekler ve günceller, hiçbir şey silmez. Hedefin kaynağın birebir kopyası olması için --delete gerekir:

rsync -avh --delete ~/projects/ /mnt/backup/projects/

Bu güçlü ve tehlikeli bir bayraktır. Yoldaki bir hata (örneğin boş kaynak veya unutulmuş eğik çizgi) hedefteki verileri siler. Bu yüzden kural basit: --delete içeren her komutu önce -n ile çalıştırın.

$ rsync -avhn --delete ~/projects/ /mnt/backup/projects/
sending incremental file list
deleting old-app/README.md
deleting old-app/
app/main.py

sent 1.20K bytes  received 64 bytes  2.53K bytes/sec
total size is 18.4M  speedup is 14,554.39 (DRY RUN)

deleting satırları neyin silineceğini gösterir. Her şeyin doğru olduğundan emin olunca -n olmadan çalıştırın.

Faydalı varyantlar: --delete-after silmeyi aktarımdan sonra yapar (hedef daha uzun süre tam kalır); --backup --backup-dir=/mnt/backup/deleted-$(date +%F) silmek yerine silinen ve değiştirilen dosyaları ayrı bir dizine taşır.

Dışlamalar: --exclude ve --include

Geçici dosyaları, bağımlılıkları ve gizli bilgileri dışlamak dağıtımda ve yedeklemede olağan bir uygulamadır.

# Birkaç şablon
rsync -avz --exclude='.git/' --exclude='node_modules/' --exclude='*.log' ./app/ server:/srv/app/

# Şablonlar bir dosyadan
rsync -avz --exclude-from='.rsyncignore' ./app/ server:/srv/app/

.rsyncignore dosyası, her satırda bir şablon içeren basit bir listedir:

.git/
node_modules/
*.log
.env
tmp/

Şablonlar şöyle çalışır:

  • Başında eğik çizgi olmayan şablon (*.log) her derinlikte eşleşir.
  • Başında eğik çizgi olan şablon (/tmp/) aktarımın köküne bağlıdır — yalnızca en üstteki tmp'yi dışlar.
  • Sonda eğik çizgi (cache/) "yalnızca dizin" anlamına gelir.
  • Kurallar sırayla kontrol edilir; ilk eşleşen uygulanır.

Son maddeden "yalnızca gerekeni kopyala" yöntemi çıkar: önce izin ver, sonra geri kalanı yasakla.

# Yalnızca .conf dosyalarını kopyala, dizin yapısını koru
rsync -av --include='*/' --include='*.conf' --exclude='*' /etc/ ./etc-confs/

Burada --include='*/', rsync'in tüm alt dizinlere girmesi için gereklidir. Boş dizinleri oluşturmamak için --prune-empty-dirs (-m) ekleyin.

rsync ile yedekleme

Basit günlük kopya

Ana dizini ikinci bir diske yedeklemenin en kısa yolu:

rsync -aH --delete --exclude='.cache/' /home/alice/ /mnt/backup/alice/

Bu yaklaşımın eksiği yalnızca bir sürüm tutmasıdır. Bir dosya bozulur ve yedek de bu bozuk hali eşitlerse, eski sürüm kaybolmuş olur.

--link-dest ile artımlı anlık görüntüler

--link-dest bu sorunu yerinde ve neredeyse bedelsiz çözer. Değişmeyen dosyalar kopyalanmaz; önceki anlık görüntüdeki dosyalara sert bağlantı olarak oluşturulur. Her anlık görüntü tam kopya gibi görünür, ama yer yalnızca değişiklikler için kullanılır.

#!/bin/bash
set -euo pipefail

SRC="/home/alice/"
DEST="/mnt/backup/snapshots"
TODAY="$(date +%F)"

mkdir -p "$DEST"
rsync -aH --delete \
  --exclude='.cache/' \
  --link-dest="$DEST/latest" \
  "$SRC" "$DEST/$TODAY"

ln -sfn "$DEST/$TODAY" "$DEST/latest"

İlk çalıştırmada latest dizini henüz yoktur — rsync uyarı verir ve tam bir kopya oluşturur; bu normaldir. Eski anlık görüntüler sıradan rm -rf ile silinir: diğer anlık görüntülerin bağlandığı dosyalar kaybolmaz.

30 günden eski anlık görüntüleri silmek için:

find /mnt/backup/snapshots -maxdepth 1 -type d -name '20*' -mtime +30 -exec rm -rf {} +

Sunucu yedeğini başka bir makineye alma

Yönü "yedek sunucudan çalışan sunucuya" seçmek iyi bir fikirdir: yedek makine verileri kendisi çeker, çalışan sunucunun yedeklere erişimi yoktur. Sunucu ele geçirilse bile yedekler sağlam kalır.

rsync -azH --delete -e "ssh -i /root/.ssh/backup_key" \
  backup@web01:/var/www/ /srv/backups/web01/www/

Veritabanlarını bu şekilde kopyalamayın: çalışan bir DBMS'nin dosyaları kopyalama anında tutarsızdır. Önce döküm alın (mysqldump, pg_dump) ve rsync'e hazır döküm dosyasını taşıtın.

cron ile zamanlanmış çalıştırma

Yedek betiği crontab -e ile cron'a eklenir:

# Her gün 03:15'te, çıktı günlüğe
15 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Yedeğin cron'dan gerçekten çalışması için kontrol edilecekler:

  • Betikte mutlak yollar kullanın: cron'un PATH'i çok kısıtlıdır ve geçerli dizini farklıdır.
  • SSH anahtarı parolasız olsun ve sunucu zaten known_hosts içinde bulunsun — aksi halde rsync sunucunun kimliği hakkındaki soruda takılır.
  • Betik çıkış kodunu kontrol etsin: rsync başarıda 0 döndürür, bazı dosyalar aktarılamazsa 23, dosyalar kopyalama sırasında kaybolursa 24.
  • İki kopyanın aynı anda çalışmasını flock engeller: flock -n /tmp/backup.lock /usr/local/bin/backup.sh.

cron yerine systemd zamanlayıcısı da kullanılabilir: çıktısını journal'a yazar ve sonuçları journalctl ile görmek kolaydır.

Büyük aktarımlar için faydalı seçenekler

GörevSeçenek
Kanalı doldurmamak için hızı sınırlamak--bwlimit=5M
Kesintiden sonra büyük dosyayı devam ettirmek-P (veya --partial)
Dosya listesi yerine genel ilerleme--info=progress2
Zamana değil içeriğe göre karşılaştırmak-c (--checksum), daha yavaş
Hedefte daha yeni olan dosyalara dokunmamak-u (--update)
Var olan dosyaların üzerine yazmamak--ignore-existing
Aktarımdan sonra kaynak dosyaları silmek (taşıma)--remove-source-files
Sonda ayrıntılı istatistik--stats

Tipik hatalar ve çözümleri

  • Yazarken Permission denied — kullanıcının hedef dizine yazma hakkı yok. Dizinin sahibini kontrol edin veya --rsync-path="sudo rsync" kullanın.
  • Dosyalar her seferinde baştan kopyalanıyor — değişiklik zamanı korunmuyor. -a veya -t olduğundan emin olun; FAT/exFAT'ta bu sistemler zamanı iki saniye hassasiyetle sakladığı için --modify-window=2 ekleyin.
  • Flash bellek veya ağ klasörüne kopyalarken chown veya chgrp hataları — dosya sistemi sahipleri desteklemiyor. -a yerine -rlt kullanın.
  • Gereksiz iç içe /backup/project/project yapısı — kaynağın sonundaki eğik çizgi karıştırılmış.
  • connection unexpectedly closed — SSH sorunu veya uzak tarafta rsync kurulu değil. Normal ssh ile girişi ve sunucuda rsync varlığını kontrol edin.

Sonuç

Günlük çalışma için birkaç komutu bilmek yeterlidir: SSH üzerinden kopyalamak için rsync -avz src/ host:/dst/, ayna için önce -n ile birlikte --delete, fazlalıkları dışlamak için --exclude, anlık görüntülü yedekler için --link-dest. Kaynağın sonundaki eğik çizgiye dikkat edin — o zaman rsync makineler arasında dosya taşımanın en güvenilir yolu olur. Senkronizasyon ve yedekleme kurstaki Linux uygulamalarında ele alınır.

Sık sorulan sorular

rsync, scp'den neden daha iyi?

scp dosyaları her seferinde tamamen kopyalar; rsync yalnızca değişiklikleri aktarır, kesintiden sonra devam edebilir, hedefteki fazlalıkları silebilir ve dosyaları şablonla dışlayabilir. Tek bir dosyayı bir kez kopyalarken fark neredeyse yoktur, düzenli senkronizasyonda rsync çok daha hızlıdır.

rsync Windows'ta kullanılabilir mi?

Evet, WSL üzerinden — orada rsync normal Linux'taki gibi kurulur — veya Cygwin ile. Windows makinesi ile Linux sunucusu arasında eşitleme için en uygun yol WSL'dir.

rsync aktardığı verileri şifreliyor mu?

rsync kendisi şifrelemez, ama SSH üzerinden kopyalarken tüm trafik şifreli SSH bağlantısından geçer. Şifreleme olmadan veri yalnızca rsync:// adresiyle rsync daemon'una bağlanırken aktarılır.

Kopyanın orijinalle aynı olduğunu nasıl doğrularım?

rsync -avnc kaynak/ hedef/ komutunu çalıştırın — -c bayrağı dosyaları sağlama toplamlarıyla karşılaştırır, -n hiçbir şeyi değiştirmez. Dosya listesi boşsa kopyalar birebir aynıdır.

rsync yarıda kesilirse ne olur?

Şimdiye kadar aktarılmış dosyalar kalır, yarım kalan dosya varsayılan olarak silinir. Aynı komutu tekrar çalıştırmak kaldığı yerden devam eder; -P bayrağıyla yarım kalan dosyanın bir kısmı da korunur.

Bu konuyu videoyla öğrenin

Bu konu “Linux: с нуля до уверенного администрирования” kursunda uygulamalı olarak ayrıntılı işleniyor.

Kursa git