Czy rsync weryfikuje pliki skopiowane między dwoma dyskami lokalnymi?

65

Chcę zrobić nową kopię dużej liczby plików z jednego dysku lokalnego na inny.

Czytałem, że rsync porównuje sumę kontrolną plików podczas wysyłania ich do zdalnego komputera przez sieć.

  1. Czy rsync dokona porównania podczas kopiowania plików między dwoma dyskami lokalnymi?

  2. Jeśli przeprowadzi weryfikację - czy jest to bezpieczny zakład? A może lepiej jest porównywać bajty po bajtach?

Frez
źródło

Odpowiedzi:

77

rsync zawsze używa sum kontrolnych do sprawdzenia, czy plik został poprawnie przesłany. Jeśli plik docelowy już istnieje, rsync może pominąć aktualizację pliku, jeśli czas i rozmiar modyfikacji są zgodne z plikiem źródłowym, ale jeśli rsync zdecyduje, że dane muszą zostać przesłane, sumy kontrolne są zawsze wykorzystywane na danych przesyłanych między procesami wysyłającymi i odbierającymi rsync . To weryfikuje, czy otrzymane dane są takie same jak dane wysłane z dużym prawdopodobieństwem, bez dużego obciążenia związanego z porównywaniem poziomu bajtów w sieci.

Po otrzymaniu danych pliku rsync zapisuje dane do pliku i ufa, że ​​jeśli jądro wskazuje na pomyślny zapis, dane zostały zapisane bez uszkodzenia na dysku. rsync nie odczytuje danych ponownie i nie porównuje ze znaną sumą kontrolną jako dodatkową kontrolę.

Jeśli chodzi o samą weryfikację, w przypadku protokołu 30 i późniejszych (pierwszy obsługiwany w 3.0.0) rsync używa MD5 . W przypadku starszych protokołów używana jest suma kontrolna MD4 .

Choć od dawna uważany za przestarzały dla bezpiecznych skrótów kryptograficznych, MD5 i MD4 pozostają odpowiednie do sprawdzania uszkodzenia plików.

Źródło: strona podręcznika i sprawdzanie kodu źródłowego rsync w celu weryfikacji.

Kyle Jones
źródło
3
Nienawidzę rozrywać wszystkich bąbelków, ale rsync sprawdza weryfikację sumy tylko, jeśli dodana jest flaga -c!
27
@clint Nie, odpowiedź jest prawidłowa. Z objaśnienia -cflagi strony podręcznika : „Zauważ, że rsync zawsze sprawdza, czy każdy przesłany plik został poprawnie zrekonstruowany po stronie odbierającej, sprawdzając sumę kontrolną całego pliku, która jest generowana podczas przesyłania pliku, ale ten automatyczny po przesłaniu plik weryfikacja nie ma nic wspólnego z opcją przed przesłaniem „Czy ten plik wymaga aktualizacji?” sprawdź.
Michael Mrozek
7
Ta odpowiedź nie wyjaśnia, czy faktycznie weryfikuje plik po kopii. Jeśli suma kontrolna jest obliczana podczas odbierania pliku, to nie jest to suma kontrolna po skopiowaniu i nie można mieć pewności, że plik został poprawnie zapisany. Musisz wtedy wykonać dodatkowe porównanie.
Andre Miller
7
Głosowanie w dół, ponieważ nie podoba mi się fakt, że ta odpowiedź jest szczegółowa, dobrze napisana i technicznie poprawna, a jednocześnie tak bardzo nie na temat, że wprowadza w błąd czytelników. Problem polega na tym, że odpowiedź zawiera bardzo szczegółowe informacje na temat tego, co dzieje się podczas przesyłania, podczas gdy pytający wyraźnie stwierdza, że ​​zależy mu na lokalnych kopiach, a nie na transferach sieciowych. Jestem prawie pewien, że Kyle Jones nie chciał nikogo wprowadzać w błąd, ale taka odpowiedź (IMHO) tak.
ndemou
4
Kyle Nie wierzę, że odpowiedź jest zła. Już zauważyłem, że jest „szczegółowy dobrze napisany i poprawny technicznie”, ale wymaga od czytelnika niepotrzebnego skupienia i ostrożności. Po co uwzględniać brak weryfikacji danych na dysku, która jest kwestionowana w połowie odpowiedzi po 117 słowach, które wielokrotnie opisują inny nieistotny proces weryfikacji? W każdym razie dziękuję za poświęcony czas i zainteresowanie tą dyskusją. Szczerze to doceniam.
ndemou
40

rsyncma nie robić weryfikację po kopiowania dla lokalnych kopii plików. Możesz sprawdzić, czy tak nie jest, rsynckopiując duży plik na wolny dysk (np. USB), a następnie kopiując ten sam plik cp, np .:

time rsync bigfile /mnt/usb/bigfile

time cp bigfile /mnt/usb/bigfile

Oba polecenia zajmują tyle samo czasu, dlatego też rsyncprawdopodobnie nie można wykonać sumy kontrolnej - ponieważ wymagałoby to ponownego odczytania pliku docelowego z wolnego dysku.

manStrona jest niestety mylące na ten temat. Sprawdziłem to również za pomocą strace- po zakończeniu kopiowania rsyncnie read()wywołuje żadnych wywołań w pliku docelowym, więc nie można go sprawdzić . Jeszcze raz możesz to sprawdzić za pomocą czegoś takiego iotop: widzisz rsyncrobienie odczytu i zapisu jednocześnie (kopiowanie ze źródła do miejsca docelowego), a następnie wyjście. Gdyby weryfikował integralność, istniałaby faza tylko do odczytu.

Felix
źródło
1
„Strona podręcznika jest niestety wprowadzająca w błąd w tej kwestii. Sprawdziłem to również za pomocą strace” Czy podążałeś za zdalnym, uruchomionym procesem rsync czy lokalnym? Istnieją dwa ... jeden działa na miejscu docelowym, nawet jeśli używasz ssh.
user129070
8
Nie ma weryfikacji po kopii dla żadnych kopii, lokalnych ani zdalnych. Uruchom rsync -cponownie, jeśli chcesz zmusić go do sprawdzenia.
psusi
Weryfikacja odbywa się na przychodzącym strumieniu w miarę jego przesyłania. Nie jest konieczne ponowne czytanie go z dysku, jeśli system plików potwierdził, że został zapisany.
OrangeDog,
17

rsyncdokonuje porównania sumy kontrolnej przed kopiowaniem (w niektórych przypadkach), aby uniknąć kopiowania tego, co już istnieje. Celem porównania sum kontrolnych nie jest sprawdzenie, czy kopiowanie powiodło się. Na tym polega podstawowa infrastruktura: sterowniki systemu plików, sterowniki dysków, sterowniki sieciowe itp. Poszczególne aplikacje rsyncnie muszą zawracać sobie głowy tym szaleństwem. Wszystko, co rsyncnależy zrobić (i robi to!), To sprawdzić zwracane wartości wywołań systemowych, aby upewnić się, że nie wystąpił błąd.

Gilles
źródło
1
Wydaje się to przeczyć przyjętej odpowiedzi ...
djule5
2
@ djule5 W jaki sposób? Akceptowana odpowiedź wydaje się dotyczyć głównie sprawdzania przesłanych plików przez rsync , ale pytanie i moja odpowiedź dotyczą kopii lokalnych .
Gilles
3
Ok, w tym kontekście zgadzam się, że ma to większy sens. Tak więc „celem porównania sum kontrolnych nie jest sprawdzenie, czy kopiowanie się powiodło” jest prawdziwe tylko dla kopii lokalnych ; a „sumy kontrolne są zawsze używane w danych przesyłanych między procesami rsync wysyłającymi i odbierającymi” jest prawdziwe tylko w przypadku przesłanych kopii. Uważam, że przyjęta odpowiedź jest myląca w odniesieniu do pytania i uważam, że twoja odpowiedź powinna być zaakceptowana (tylko moje 2 centy).
djule5
Nadal uważam, że ta odpowiedź jest nieco myląca. Mówi na przykład, że sterowniki sieciowe w szczególności sprawdzają, czy kopiowanie się powiodło - ale jeśli mówisz, że porównanie sumy kontrolnej nie weryfikuje, czy kopiowanie się powiodło tylko dla lokalnego, sterowniki sieciowe nie wejdą w grę.
Ken
1
@Ken Nie rozumiem, o co ci chodzi. Podejrzewam, że coś źle odczytałeś. Sterowniki sieciowe wchodzą w grę tylko wtedy, gdy istnieje kopia sieciowa. Sam Rsync porównuje sumę kontrolną przed wykonaniem jakiejkolwiek kopii, aby zdecydować, czy skopiować. Rsync nie dokonuje porównania sumy kontrolnej po skopiowaniu (ponieważ byłoby to bezcelowe: wie, co właśnie skopiowano).
Gilles,
4

Szybkie i brudne odpowiedzi, bezpośrednio na pytania.

P: Czy rsyncporówna się podczas kopiowania plików między dwoma dyskami lokalnymi? Odp .: Przeprowadzi porównanie, aby dowiedzieć się, co skopiować.

P: Jeśli przeprowadzi weryfikację - czy jest to bezpieczny zakład? A może lepiej jest porównywać bajty po bajtach? Odp .: Tak bezpieczny jak matematyka za sumą kontrolną pliku MD5. Możesz spróbować wykonać prosty eksperyment, aby nauczyć się i ufać narzędziu.

Długa odpowiedź: myślę, że chciałeś rsynczrobić porównanie plików (krok po kroku lub suma kontrolna) po skopiowaniu plików. Jeśli jesteś jednym z niewielu, którzy cenią integralność danych, poniższe informacje mogą okazać się przydatne:

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

powyższy rsyncfolder plików kodu przy pierwszym uruchomieniu i jeśli zostanie ukończony bez problemu, uruchomi się rsyncponownie natychmiast, wykonując porównanie nazw plików przy użyciu skrótu całego pliku.

MN
źródło
1

Użycie rsync do sprawdzenia integralności duplikatu

Aby zagwarantować, że ten test fizycznie ponownie odczyta pliki z nośnika dysku, sugeruję wyłączenie obu dysków i ich ponowne uruchomienie przed uruchomieniem tego testu. Spowoduje to wyczyszczenie ich wewnętrznych lotnych pamięci podręcznych.

Jeśli nie zrestartujesz również Linuksa, powinieneś przynajmniej upuścić pamięć podręczną ( * ) za pomocą:

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

Następnie ponownie przeczytaj oba drzewa i porównaj ich sumy kontrolne:

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

Nowoczesna suma kontrolna rsync wykorzystuje MD5, który ma 128 bitów. Prawdopodobieństwo tego, że nie wykryje błędu w pojedynczym pliku, jest astronomicznie niskie ( tutaj trochę dyskusji ), ale nie niemożliwe.

nobar
źródło
Powodzenia w poprawianiu cięć końcowych.
nobar
Brak wiadomości to dobra wiadomość.
nobar
Nie przejmuj się, --checksumdopóki test nie przejdzie bez niego.
nobar