--link-destÖzdeş bir dosyaya başvurmanın her durumda işe yarayacağını düşünebilirsiniz . Ancak dosya güncel olmadığında / farklı içeriklere sahip olsa bile dosya mevcut olmadığında bu gerçekleşmez.
Bu nedenle, rsync man sayfasından --link-dest:
"Bu seçenek en iyi, boş bir hedef hiyerarşisine kopyalama yaparken işe yarar, çünkü rsync varolan dosyaları kesin olarak ele alır (bu nedenle rsync bir hedef dosya zaten olduğunda link-dest dizinlerine asla bakmaz )"
Bu, kaynakla y/fileaynıysa ve z/filegüncel değilse ,
rsync -a --del -link-dest=y source:/file z
İKİ inode'larda (ve iki kez bir disk alanına) kullanılıyorsa, sonuçlanacaktır y/fileve z/fileaynı içeriği ve datestamps olacak.
Temelde günde bir kez çalıştırılan bu komut dosyasıyla günlük yedeklemeler yaptığım için bununla karşılaştım:
mv $somedaysago $today;
yest=$today; today=`date +%Y%m%d`;
rsync -avPShyH --del --link-dest=../$yest host:/dirs $today
Yedeklerim 10 milyona kadar dosya içerdiğinden, rm -rf $olddir; rsync source:$dir newdirbu işlem çok uzun sürecektir (özellikle dosyaların yalnızca% 0,5'i değiştiğinde, yalnızca 50 bin yeni veya değiştirilmiş dosyayı işlemek için 10 milyon dir girdisinin silinmesine ve oluşturulmasına neden oldu. yedeklemeler ertesi gün için zamanında tamamlanmamıştır).
İşte durumun bir demosu:
abizim kaynak, 1aracılığıyla 4bizim numaralı yedeklemeler:
$ mkdir -p 1 2; echo foo > 1/foobar; cp -lrv 1/* 2
`1/foobar' -> `2/foobar'
$ ls -i1 */foobar
1053003 1/foobar
1053003 2/foobar
$ mkdir a; echo quux > a/foobar
$ mv 1 3; rsync -avPhyH --del --link-dest=../2 a/ 3
sending incremental file list
./
foobar
5 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/2)
sent 105 bytes received 34 bytes 278.00 bytes/sec
total size is 5 speedup is 0.04
$ ls -i1 */foobar
1053003 2/foobar
1053007 3/foobar
1053006 a/foobar
$ mv 2 4; rsync -avPhyH --del --link-dest=../3 a/ 4
sending incremental file list
./
foobar
5 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/2)
sent 105 bytes received 34 bytes 278.00 bytes/sec
total size is 5 speedup is 0.04
$ ls -il1 */foobar
1053007 -rw-r--r-- 1 math math 5 Mar 30 00:57 3/foobar
1053008 -rw-r--r-- 1 math math 5 Mar 30 00:57 4/foobar
1053006 -rw-r--r-- 1 math math 5 Mar 30 00:57 a/foobar
$ md5sum [34a]/foobar
d3b07a382ec010c01889250fce66fb13 3/foobar
d3b07a382ec010c01889250fce66fb13 4/foobar
d3b07a382ec010c01889250fce66fb13 a/foobar
Şimdi a/foobarzaman damgası da dahil olmak üzere her türlü özdeş, ancak farklı inode işgal eden 2 yedeklememiz var .
Bir çözüm --delete-before, artımlı taramanın yararını öldüren bir çözüm olacağını düşünebilir , ancak dosya silinmeyeceğinden bu yardımcı olmaz, ancak artımlı kopya mümkün olduğunda temel olarak kullanılır.
Dahası, bu artımlı kopya çitini kapatabiliriz --whole-file, ancak bu algoritmaya herhangi bir yardımcı olmaz, istediğimizi elde etmenin bir yolu yoktur.
Bu davranışı, çeşitli komut argümanlarının dikkatli seçimlerinden faydalı bir davranışın yorumlanabileceği rsync'te başka bir hata olarak görüyorum, ancak istenen sonuç mevcut değil.
Bir çözüm maalesef tek bir rsync'ten atomik bir işlem olarak kuru bir çalışmaya geçiyor -n, günlüğe kaydediyor, değiştirilen tüm dosyaları manuel olarak önceden silmek için bu günlüğü girdi olarak işliyor, sonra rsync --link-destistediğimizi elde etmek için çalışıyor - büyük bir çamur tek bir temiz rsync ile karşılaştırıldığında.
Ek: ön bağlantıyı çalıştı $yesterdayve $todaybirlikte üretim kutuları karşı yedekleme önce yedekleme sunucusunda rsync --link-dest=../$yesterday $yesterday/ $today- ama aynı sonucu - herhangi bir şekilde var olan herhangi bir dosya, hatta 0 uzunluk, kaldırılacak asla ve bunun yerine, bütün bir bağlantı dested yeni bir inode ile ve daha fazla disk alanı kullanarak kaynaktan yeni kopya yapılacaktır.
Baktığımızda pax(1)olası bir ön bağlama-öncesi-yedekleme çözümü olarak.
--delete-aftergayet iyi, ancak konuyla ilgisi yok. Kopyalama yapıldıktan sonra kaynakta eksik olan dosyalar silinecektir. Açıkladığım sorun, dün yapılanla aynıdır, ancak dünün inode'una bağlı olmayan, ancak dünün toplam disk alanının iki katında yeni bir dosya olarak depolanan eski bir eski dosyaya karşı yapılan bir yedekleme ile ilgilidir. özdeş kopya dikkate alınır.
rsnapshot? Ayrıca, "özdeş" dosyaları yeniden bağlamak için küçük bir komut dosyası yazmayı düşünün. Her ikisini de sistemlerimde yapıyorum.
hardlink(1)yavaştır (rsync'in meta veri taramasından 15 kat daha yavaş); paxdaha hızlıdır, ancak eski yedekleme ile yenisini karşılaştıran HDD kafalarını çöker. rsync -ndelta listesinin elde edilmesi, üretim sunucularına iki kez vurmak anlamına gelir (10M dosyalarını taramak, 50K değişikliklerini kopyalamaktan çok daha etkilidir). Buna izin vermek için listeyi rsync'deki bir seçenekle ilgili olarak göndereceğim.
--delete-afterBu kullanım senaryosunda kullanıyorum , bunun nesi var?