Rsync, iki yerel sürücü arasında kopyalanan dosyaları doğrular mı?


65

Bir yerel sürücüden diğerine çok sayıda dosyanın yeni bir kopyasını çıkarmak istiyorum.

Rsync'in dosyaları ağ üzerinden uzak bir makineye gönderirken sağlama toplamı karşılaştırması yaptığını okudum.

  1. Dosyaları iki yerel sürücü arasında kopyalarken rsync karşılaştırma yapacak mı?

  2. Doğrulama yaparsa - güvenli bir bahis mi? Yoksa bayt karşılaştırmalı bayt yapmak daha mı iyidir?

Yanıtlar:


77

rsync, bir dosyanın doğru şekilde aktarıldığını doğrulamak için her zaman sağlama toplamı kullanır. Hedef dosya zaten varsa, rsync değişiklik zamanı ve boyut kaynak dosyasını eşleşirse dosyasını güncelleme atlamak olabilir, ama rsync verileri sağlama edilir transfer edilmesi gerektiğini karar verirse her zaman gönderme ve alma rsync işlemleri arasında aktarılan veriler üzerinde kullanılan . Bu, alınan verilerin, ağ üzerinde bir bayt düzeyinde karşılaştırma yapılmasının fazla yükü olmadan, yüksek olasılıkla gönderilen verilerle aynı olduğunu doğrular.

Dosya verileri alındıktan sonra, rsync verileri dosyaya yazar ve eğer çekirdek başarılı bir yazı yazıyorsa, verilerin diske bozulmadan yazıldığına güvenir. rsync verileri tekrar okumaz ve bilinen kontrol toplamı ile ek kontrol olarak karşılaştırmaz.

(İlk 3.0.0 desteklenen) protokolü 30 ve ötesinde doğrulama kendisi gelince, rsync kullanan MD5 . Daha eski protokoller için kullanılan sağlama toplamı MD4'tür .

Uzun zamandır güvenli şifreleme karmaları için eski olduğu düşünüldüğü halde, MD5 ve MD4 dosya bozulmalarını kontrol etmek için yeterli kalmaktadır.

Kaynak: kılavuz sayfası ve doğrulamak için rsync kaynak kodunun göz küresi.


3
Herkesin balonu kırmaktan nefret ediyorum ama rsync sadece -c bayrağı eklenmişse toplam doğrulamayı kontrol ediyor!

27
@clint Hayır, cevap doğru. Man sayfasının -cbayrak açıklamasından : "rsync'in her zaman aktarılan her bir dosyanın, aktarılan dosya olarak oluşturulan tam bir sağlama toplamı denetleyerek, ancak aktarım sonrasında otomatik olarak kontrol edilen alıcı tarafta doğru bir şekilde yeniden yapılandırıldığını doğruladığını unutmayın. doğrulama işleminin, bu seçeneğin aktarımdan önce yapması gereken "Bu dosyanın güncellenmesi gerekiyor mu?" kontrol edin.
Michael Mrozek

7
Bu cevap, kopyadan sonra dosyayı gerçekten doğrulayıp doğrulamadığını netleştirmez. Sağlama toplamı dosya alınırken hesaplanırsa, kopya sonrası sağlama toplamı değildir ve dosyanın doğru yazıldığından emin olamazsınız. Daha sonra ek bir karşılaştırma yapmanız gerekir.
Andre Miller

7
Aşağı oylama, çünkü bu cevabın iyi yazılmış, teknik olarak doğru ve aynı zamanda okurları yanlış yönlendiren konuların ayrıntılı bir şekilde açıklanmasından hoşlanmıyorum. Sorun cevap sırasında ne olduğuna ilişkin ayrıntılı gider olmasıdır transferi sorgulayıcı özellikle o umurunda belirtmesine karşın , yerel kopya ve değil ağ transferleri. Eminim ki Kyle Jones kimseyi yanıltmak istemedi ama bu cevap (IMHO).
ndemou

4
Kyle, cevaplarının yanlış olduğuna inanmıyorum. "İyi yazılmış ve teknik olarak doğru detaylandırılmış" demiştim ancak okuyucunun gereksiz yere odaklanmasını ve dikkatli olmasını gerektiriyor. Neden başka bir alakasız doğrulama sürecini tekrar tekrar tanımlayan 117 kelimeden sonra cevabınız boyunca yarı yarıya sorgulanan disk verilerinin doğrulanmamasını kapsar? Yine de zaman ayırdığınız ve bu tartışmaya gösterdiğiniz ilgi için teşekkür ederiz. Ben içtenlikle takdir ediyorum.
ndemou

40

rsyncyok değil yerel dosya kopyalar için sonrası kopya doğrulama yapmak. rsyncBüyük bir dosyayı yavaş (yani USB) sürücüye kopyalamak için kullanıp kullanmadığınızı ve ardından aynı dosyayı kopyaladığınızı doğrulayabilirsiniz cp:

time rsync bigfile /mnt/usb/bigfile

time cp bigfile /mnt/usb/bigfile

Her iki komut da aynı miktarda zaman alır, bu nedenle büyük rsyncolasılıkla sağlama toplamı yapamazsınız; çünkü bu, hedef dosyayı yavaş diskten yeniden okumayı içerir.

manSayfa bu konuda maalesef yanıltıcı. Ben de bu doğrulanmış strace, kopya tamamlandıktan sonra- rsyncsorunları hiçbir read()hedef dosya üzerinde çağrılar, bu yüzden onu checksumming edilemez. Bunun gibi bir şey olduğunu doğrulayabilirsiniz iotop: rsyncaynı anda okuma ve yazma (kaynaktan hedefe kopyalama) yaptığınızı görür , sonra çıkar. Bütünlüğü doğrulıyor olsaydı, salt okunur bir aşama olurdu.


1
“Adam sayfası ne yazık ki bu konuda yanıltıcı. Bunu da strace ile doğruladım. İki tane var ... biri hedefte çalışıyor, ssh kullanıyor olsanız bile.
user129070

8
Yerel veya uzak herhangi bir kopya için kopya sonrası doğrulama yoktur. rsync -cKontrol etmeye zorlamak istersen tekrar koş .
psusi

Doğrulama, gelen akışta olduğu gibi yapılır. Dosya sistemi yazılmış olduğunu onayladıysa, onu diskten okumak gerekli değildir.
OrangeDog

17

rsynczaten olanları kopyalamaktan kaçınmak için kopyalamadan önce (bazı durumlarda) bir sağlama toplamı karşılaştırması yapar . Sağlama toplamı karşılaştırmasının amacı, kopyanın başarılı olduğunu doğrulamak değildir. Altta yatan altyapının işi bu: dosya sistemi sürücüleri, disk sürücüleri, ağ sürücüleri vb rsync. Bu delilikle uğraşmanıza gerek kalmayan bireysel uygulamalar . Tüm rsynchiçbir hata oluştu emin olmak için çağırır yapması gereken (ve öyle!) Sistemin dönüş değerlerini kontrol etmektir.


1
Bu kabul edilen cevaba aykırı görünüyor ...
djule5

2
@ djule5 Ne şekilde? Kabul edilen cevap çoğunlukla rsync'in aktarılan dosyaları nasıl kontrol ettiği ile ilgili görünüyor , ancak soru ve benim cevabım yerel kopyalarla ilgili.
Gilles

3
Tamam, bu bağlamda daha mantıklı olduğunu kabul ediyorum. Bu nedenle, "sağlama toplamı karşılaştırmasının amacı, kopyanın başarılı olduğunu doğrulamak değildir" sadece yerel kopyalar için geçerlidir ; ve "sağlama toplamları her zaman gönderme ve alma rsync işlemleri arasında aktarılan verilerde kullanılır" yalnızca aktarılan kopyalar için geçerlidir . Soruyla ilgili olarak yanıltıcı olarak kabul edilen cevabı buluyorum ve cevabınızın kabul edilen cevap olması gerektiğine inanıyorum (sadece 2 sentim).
djule5,

Hala bu cevabın biraz yanıltıcı olduğunu düşünüyorum. Örneğin, özellikle ağ sürücülerinin kopyanın başarılı olup olmadığını doğruladığını söylüyor - ancak sağlama toplamı karşılaştırmasının, kopyanın yalnızca yerel için başarılı olup olmadığını doğrulamadığını söylüyorsanız, ağ sürücüleri devreye girmez.
Ken

1
@Ken Yapmaya çalıştığınız noktayı anlamıyorum. Bir şeyi yanlış anladığından şüpheleniyorum. Ağ sürücüleri, yalnızca bir ağ kopyası varsa devreye girer. Rsync , kopyalanıp kopyalanmayacağına karar vermek için herhangi bir kopya yapmadan önce sağlama toplamı karşılaştırması yapar . Rsync, kopyaladıktan sonra herhangi bir sağlama toplamı karşılaştırması yapmaz (çünkü anlamsız olurdu: ne kopyalandığını bilir).
Gilles,

4

Doğrudan sorulara hızlı ve kirli cevaplar.

S: rsyncDosyaları iki yerel sürücü arasında kopyalarken karşılaştırma yapacak mı? C: Neyin kopyalanacağını bulmak için karşılaştırma yapacak.

S: Doğrulama yapıyorsa - güvenli bir bahis mi? Yoksa bayt karşılaştırmalı bayt yapmak daha mı iyidir? C: MD5 sağlama toplamının ardındaki matematik kadar güvenli. Aracı öğrenmek ve güvenmek için basit deneyler deneyebilirsiniz.

Uzun cevap: Sanırım, rsyncdosyaları kopyaladıktan sonra dosya karşılaştırma (bit veya bit sağlama toplamı) yapmak istediniz . Bu değer veri bütünlüğünden az sayıdaysanız, aşağıdakileri yararlı bulabilirsiniz:

rsync -avh [source] [destination] && rsync -avhc [source] [destination] 

rsyncilk çalıştırmada kod dosyaları klasörünün üzerinde ve sorunsuz olarak tamamlandıysa, rsyncaynı dosya adı karşılaştırması yapılırken derhal tüm dosyanın hashını kullanarak tekrar çalışacaktır .


1

Bir kopyanın bütünlüğünü doğrulamak için rsync kullanma

Bu testin, dosyaları sürücü ortamından fiziksel olarak yeniden okuduğunu garanti etmek için, bu testi çalıştırmadan önce her iki sürücüyü de kapatmayı ve yeniden başlatmayı öneriyorum. Bu onların iç geçici önbelleklerini temizleyecektir.

Ayrıca, Linux'u yeniden başlatmazsanız, en azından önbellekleri ( * ) aşağıdakilere bırakmalısınız :

sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

Sonra her iki ağacı da yeniden okumak ve sağlama toplamlarını karşılaştırmak için:

rsync --dry-run --checksum --itemize-changes --archive SRC DEST

Modern rsync sağlama toplamı, 128 bit olan MD5'i kullanır. Bunun tek bir dosyada bir hatayı tespit edememe olasılığı astronomik olarak düşüktür ( burada bazı tartışmalar ), ancak imkansız değildir.



İzinde eğik çizgi olması iyi şanslar.
nobar

Hiçbir haber iyi haber değildir.
nobar

--checksumTest olmadan geçene kadar uğraşmayın .
Nobar
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.