--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/file
aynıysa ve z/file
gü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/file
ve z/file
aynı 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 newdir
bu 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:
a
bizim kaynak, 1
aracılığıyla 4
bizim 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/foobar
zaman 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-dest
istediğ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ı $yesterday
ve $today
birlikte ü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-after
gayet 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ş); pax
daha hızlıdır, ancak eski yedekleme ile yenisini karşılaştıran HDD kafalarını çöker. rsync -n
delta 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-after
Bu kullanım senaryosunda kullanıyorum , bunun nesi var?