Rsync różnica między opcjami --checksum i --ignore-times

95

Czy ktoś może wyjaśnić różnice między opcjami --checksumi --ignore-timesrsync?

Moje rozumienie jest następujące:

--checksum
Jeśli rozmiar pliku i czas są zgodne, wykona sumę kontrolną na obu końcach, aby sprawdzić, czy pliki są naprawdę identyczne.

--ignore-times
„Przenieś” każdy plik, niezależnie od tego, czy czas pliku jest taki sam na obu końcach. Ponieważ nadal będzie korzystał z algorytmu transferu delta, jeśli plik faktycznie jest identyczny, nic nie zostanie przesłane.

To różnica techniczna, ale o ile mogę stwierdzić, są semantycznie takie same.

Zastanawiam się więc:

  • Jaka jest praktyczna różnica między tymi dwiema opcjami?
  • W jakich przypadkach używałbyś jednego zamiast drugiego?
  • Czy jest między nimi jakaś różnica w wydajności?
Andy Madge
źródło

Odpowiedzi:

99

Zwykle rsyncpomija pliki, gdy pliki mają identyczne rozmiary i czasy po stronie źródłowej i docelowej. Jest to heurystyka, która zazwyczaj jest dobrym pomysłem, ponieważ zapobiega rsynckonieczności sprawdzania zawartości plików, które najprawdopodobniej są identyczne po stronie źródłowej i docelowej.

--ignore-timeskaże rsyncwyłączyć heurystykę czasów i rozmiarów plików, a tym samym bezwarunkowo przesłać WSZYSTKIE pliki ze źródła do miejsca docelowego. rsyncprzejdzie następnie do odczytu każdego pliku po stronie źródłowej, ponieważ będzie musiał albo użyć algorytmu transferu delta, albo po prostu wysłać każdy plik w całości, w zależności od tego, czy --whole-filepodano opcję.

--checksummodyfikuje także heurystykę czasów i rozmiarów plików, ale tutaj ignoruje czasy i sprawdza tylko rozmiary. Pliki po stronie źródłowej i docelowej, które różnią się rozmiarem, są przesyłane, ponieważ są oczywiście różne. Pliki o tym samym rozmiarze są rsyncsumowane (z MD5 w wersji 3.0.0+ lub z MD4 we wcześniejszych wersjach), a pliki, które mają różne sumy, są również przesyłane.

W przypadkach, gdy strony źródłowa i docelowa są w większości takie same, --checksumspowoduje to , że większość plików zostanie sprawdzona po obu stronach. Może to zająć dużo czasu, ale wynik jest taki, że najdrobniejsze minimum danych zostanie faktycznie przesłane przewodem, szczególnie jeśli zostanie użyty algorytm transferu delta. Oczywiście jest to tylko zwycięstwo, jeśli masz bardzo wolne sieci i / lub bardzo szybki procesor.

--ignore-timesz drugiej strony wyśle ​​więcej danych przez sieć i spowoduje odczyt wszystkich plików źródłowych, ale przynajmniej nie nałoży dodatkowego obciążenia związanego z obliczeniem wielu silnie kryptograficznie silnych sum na procesorach źródłowych i docelowych. Spodziewałbym się, że ta opcja będzie działać lepiej niż --checksumwtedy, gdy twoje sieci są szybkie i / lub procesor stosunkowo wolny.

Wydaje mi się, że kiedykolwiek używałbym --checksumlub --ignore-timesgdybym przesyłał pliki do miejsca docelowego, w którym podejrzewano, że zawartość niektórych plików była uszkodzona, ale których czasy modyfikacji nie uległy zmianie. Naprawdę nie mogę wymyślić żadnego innego dobrego powodu, aby użyć którejkolwiek z tych opcji, chociaż prawdopodobnie istnieją inne przypadki użycia.

Steven Monday
źródło
12
Uważam, że --checksumprzydatne wraz z --itemize-changesweryfikacją kopii zapasowych. Co jakiś czas moje skrypty kopii zapasowej uruchamiają pełne porównanie w ten sposób po zakończeniu bieżących codziennych / tygodniowych aktualizacji. Dostaję wiadomość e-mail oznaczoną jako pilna, jeśli --itemize-changeswydarzy się coś nieoczekiwanego, więc wiem, że istnieje potencjalny problem, który powinienem sprawdzić.
David Spillett,
10
--checksum jest użyteczny podczas pracy w Git i przełączania między gałęziami ze zmienionymi plikami, co powoduje zmianę czasów aktualizacji plików, których nie zamierzasz wysyłać z określonej gałęzi.
FriendlyDev
6
--ignore-timesa szczególnie --checksumsą konieczne, jeśli jeden z „plików” jest kontenerem plików Truecrypt, ponieważ domyślnie znacznik czasu pliku nie jest aktualizowany. Zobacz productforums.google.com/forum/#!topic/drive/gnmDp3UXEgs i ask-leo.com/why_wont_my_truecrypt_volume_backup.html
Marcus Junius Brutus
Uwaga: Zrobiłem szybki eksperyment i ctime nie jest porównywany, tylko mtime. Przynajmniej na Macu. Warto to wiedzieć. Dlatego mam tak wiele problemów z systemami plików Windows, które zgłaszają ten sam czas (ctime) dla atime, mtime i ctime.
Edward Falk,
Czy --checksumsuma kontrolna dotyczy tylko nazw plików źródłowych na komputerze docelowym lub wszystkich plików w katalogu docelowym?
Greg
16

suma kontrolna jest również przydatna, jeśli używasz innego systemu do synchronizacji plików, który nie zachował znaczników czasu. Suma kontrolna będzie przenosić tylko pliki, które są różne ORAZ zaktualizować wszystkie znaczniki czasu po stronie odbierającej, aby były zgodne

Paulus
źródło
4

Jeden szczegół: opcja sumy kontrolnej sprawdza cały plik na jednym końcu, a następnie cały plik na drugim końcu. Jeśli twoje pliki są dość duże, ten rodzaj zabija równoległość.

Ponadto, jeśli masz ogromne pliki, najprawdopodobniej skończy się limit czasu --checksum, ponieważ tak nie jest -I.

Francois
źródło
2

W info rsyncodniesieniu do --checksumopcji - „Ponieważ to sumowanie wszystkich plików po obu stronach połączenia ma miejsce oprócz automatycznych weryfikacji sum kontrolnych, które występują podczas przesyłania pliku, ta opcja może być dość wolna”.

LeoB
źródło
1
To zdanie nie wydaje się znajdować na moich stronach man ... więc czy to oznacza, że ​​opcja sumy kontrolnej użyje sum kontrolnych do zidentyfikowania, czy pliki są identyczne, a jeśli nie, to przeniesie się, generując w ten sposób sumy kontrolne jako część przeniesienia? Opcja --ignore-times pomija czek i zakłada, że ​​się zmieniły? Dlatego pod względem wydajności - czasy-czasy jest lepszym sposobem na osiągnięcie tego samego? Wciąż próbuję zrozumieć, dlaczego istnieją 2 różne opcje (poza tym, że - suma kontrolna jest bardziej przejrzysta)
Andy Madge
Powinieneś spojrzeć na najnowszą edycję dokumentacji: gitweb.samba.org/…
Aleksandr Levchuk,
2

Ta --ignore-timesopcja prawdopodobnie spowoduje, że wszystkie pliki zostaną zakodowane w formacie delta, a algorytm transferu delta (kodowanie delta) będzie co najmniej tak wolny, jak sumowanie kontrolne.

Nie wiem, czy rsync --ignore-timesjest wystarczająco inteligentny, aby uniknąć „automatycznej weryfikacji po przesłaniu” w częstym przypadku, gdy przeniesienie delta spowoduje, że nic nie zostanie przeniesione.

Dla --ignore-times:

  • W przypadku, gdy rsync nie jest inteligentny (lub nie ufa kodowaniu delta), sprawdzanie (sumowanie i kodowanie) zostanie wykonane dwukrotnie.
  • Może być również tak, że kodowanie delta jest znacznie wolniejsze niż 128-bitowe sumowanie kontrolne MD4.

Zarówno --checksumi --ignore-timesbędzie „dość powolna”, ale --ignore-timesjest prawdopodobne, nawet wolniej (ze względu na możliwości 2 powyżej).

Dobre pytanie - proszę pisać, jeśli znajdziesz jakieś różnice w wydajności w praktyce.

Aleksandr Levchuk
źródło
Rozumiem, co masz na myśli. Przeprowadzę testy i prześlę z powrotem.
Andy Madge,