eski bir dosya zaten varsa - rsync özdeş dosyaları --link-dest seçeneği ile bağlamak için nasıl?


11

--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-afterBu kullanım senaryosunda kullanıyorum , bunun nesi var?
gogoud

1
--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.
matematik

Sorunuzun ne olduğundan tam olarak emin değilim. Düşündün mü 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.
roaima

1
Burada ihtiyacınız olan cevabı alamazsanız, rsync listesine mesaj gönderebilirsiniz. Rsync geliştiricileri, birçok gelişmiş kullanıcıyla birlikte buradaki soruları düzenli olarak cevaplar. Bunları lists.samba.org/mailman/listinfo/rsync adresinde bulabilirsiniz . Çoğunlukla orada gizleniyor ve çok şey öğreniyorum.
Joe

rsnapshot eski yedekleri geri dönüştürmek alışkanlık - ve ben gerekir: 2 ay ve 2 ay + 1 günlük yedekleri varsa, ben yeni hedef olarak bir döngüsü olabilir. Dosyaların ~% 5'i her gün değiştiğinden, 10 milyon yerine 50 bin sabit bağlantı oluşturuyorum. Bu hız farkı, 5 sunucu / gece vs değil yedekleme sağlar. 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.
matematik

Yanıtlar:


12

(Soru düzenlemesinden dönüştürüldü)

Bu, rsync yükseltilerek çözülür. Sürüm 3.1.1 veya üzeri, artık hedef ve --link-destdizindeki aynı dosyaları tek bağlantılı dosyayla değiştirecektir. Çok yer kazandırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.