Wznów przesyłanie pojedynczego pliku przez rsync

52

W Ubuntu chcę skopiować duży plik z mojego dysku twardego na dysk wymienny rsync. Z innego powodu operacja nie może zostać zakończona w jednym przebiegu. Próbuję więc wymyślić, jak użyć, rsyncaby wznowić kopiowanie pliku od miejsca, w którym został ostatnio przerwany.

Próbowałem użyć opcji --partiallub --inplace, ale wraz z --progress, znalazłem rsyncz --partiallub --inplacefaktycznie zaczyna się od początku zamiast od tego, co zostało po raz ostatni. Ręczne zatrzymanie rsyncwcześniej i sprawdzenie rozmiaru otrzymanego pliku również potwierdziło to, co znalazłem.

Ale z --appendrsync zaczyna się od tego, co zostało po raz ostatni.

Jestem zdezorientowany, jak widziałem na stronie man --partial , --inplacei --appendwydaje się odnosić do wznowienia kopiowanie z tego, co zostało po raz ostatni. Czy ktoś jest w stanie wyjaśnić różnicę? Dlaczego nie chcesz pracować --partiallub --inplacewznowić kopiowania? Czy to prawda, że ​​aby wznowić kopiowanie, rsyncmusi działać z tą --appendopcją?

Ponadto, czy plik częściowy został pozostawiony przez, mvczy cpnie przez rsync, czy rsync --appendpoprawnie wznowi kopiowanie pliku?

Tim
źródło

Odpowiedzi:

39

Aby wznowić przerwaną kopię, należy użyć rsync --append. Z objaśnienia strony podręcznika --append:

Powoduje to, że rsync aktualizuje plik, dołączając dane na końcu pliku, co zakłada, że ​​dane, które już istnieją po stronie odbierającej, są identyczne z początkiem pliku po stronie wysyłającej. [...] Implikuje --inplace, [...]

Opcja --inplacepowoduje rsync(nad) bezpośrednie zapisanie zawartości pliku docelowego; bez --inplace , rsyncby:

  1. utwórz nowy plik o tymczasowej nazwie,
  2. skopiuj do niego zaktualizowaną treść,
  3. zamień go na plik docelowy i na koniec
  4. usuń starą kopię pliku docelowego.

Normalny tryb działania zapobiega przede wszystkim konfliktom z aplikacjami, które mogą mieć otwarty plik docelowy, oraz kilkoma innymi wpadkami, które są należycie wymienione na stronie rsyncpodręcznika.

Należy pamiętać, że jeśli operacja kopiowania / aktualizacji zakończy się niepowodzeniem w krokach 1.-3. powyżej rsyncusunie tymczasowy plik docelowy; --partial opcja wyłącza to zachowanie i rsyncpozostawi częściowo przeniesione pliki tymczasowe na docelowym systemie. Dlatego wznowienie operacji kopiowania pojedynczego pliku nie przyniesie wiele, chyba że wywołasz pierwszą rsyncz --partiallub lub --partial-dir(taki sam efekt, jak --partialdodatkowo nakazuje rsync utworzenie wszystkich plików tymczasowych w określonym katalogu).

Riccardo Murri
źródło
Dzięki! Jeśli plik częściowy został pozostawiony przez mv lub cp, a nie przez rsync, czy rsync --append poprawnie wznowi kopiowanie pliku?
Tim
1
@Tim W skrócie, --appendsprawia, że rsyncwierzę, że jeśli dwa odpowiednie pliki mają różną długość, wówczas krótszy jest identyczny z początkowej części dłuższa. Tak, jeśli zaczniesz kopiować duży plik cpi przerwiesz proces kopiowania, rsync --appendskopiujesz tylko pozostałą część pliku. ( Uwaga: jeśli cpzostanie przerwana przez awarię systemu, istnieje niewielka szansa, że treść i metadane plików nie są zsynchronizowane, to znaczy, że plik jest uszkodzony W tym przypadku działa. rsyncPo raz kolejny bez --append powinno rozwiązać problem.)
Riccardo Murri
2
Więc jeśli dobrze to rozumiem, nie ma sposobu, aby powiedzieć rsync, aby zweryfikował częściowy plik i wznowił przesyłanie do tego częściowo przesłanego pliku ?
Winny
1
@ Winny, bardzo spóźnione: w przypadku lokalnej kopii nie ma rozsądnego sposobu, aby to zrobić. W przypadku kopii sieciowej jest to tryb domyślny, jeśli wybierzesz opcję --partialbez --append.
roaima 17.04.16
1
@ Zachowaj spokój --appendi --append-verifymiej niebezpieczny przypadek awarii: gdy plik odbiorcy ma ten sam rozmiar lub większy, ale zawiera inne dane. Zamiast tego sugeruję rozwiązanie oparte na--no-whole-file .
Tom Hale
21

Pamiętaj, że to --appendsugeruje --inplace, co samo w sobie sugeruje --partial.

  • Używając tylko --partialpowinieneś spowodować rsyncpozostawienie częściowych transferów i wznowienie ich w kolejnych próbach.

  • Korzystając z niego --append, powinieneś spowodować rsyncpozostawienie częściowych plików i wznowienie ich następnym razem. Po przesłaniu rsyncnależy zweryfikować sumę kontrolną tylko przesłanych danych.

  • --append-verify włącza cały plik do weryfikacji sumy kontrolnej, w tym każdą część przesłaną w poprzednim transferze.

  • Z jedną weryfikacją sumy kontrolnej --appendlub --append-verifyjej nieudaną weryfikacją powinno spowodować całkowite ponowne przesłanie pliku (za pomocą --inplace)

Powinieneś być w stanie wznowić operację mvlub cpoperację, rsyncale możesz chcieć skorzystać z tej --append-verifyopcji dla spokoju ducha.

Zauważ, że użycie --appendpowoduje rsyncskopiowanie tylko tych plików, które mają rozmiar odbiornika krótszy niż rozmiar nadawcy (niezależnie od znaczników czasu) lub są nieobecne w odbiorniku. Dokumentując tę ​​opcję:

Jeśli plik musi zostać przesłany, a jego rozmiar w odbiorniku jest taki sam lub dłuższy niż rozmiar nadawcy, plik jest pomijany.

Więcej informacji na stronie man

TomG
źródło
--appendi --append-verifymieć niebezpieczny przypadek awarii: gdy plik odbiornika jest tego samego rozmiaru lub większy, ale ma inne dane. Zamiast tego sugeruję rozwiązanie oparte na--no-whole-file .
Tom Hale
@TomHale dokumentacja sugeruje, że aby plik został pominięty, musiałby mieć dokładnie taki sam rozmiar i czas modyfikacji na obu końcach. Jeśli jest to prawdopodobne, --checksumnależy je zastosować. Nie mogę znaleźć tego wyraźnie, ale logicznie, każda z opcji, które można wznowić, powinna sugerować, --no-whole-fileponieważ --whole-filepowinna być niekompatybilna.
TomG
--append-verifypominie pliki o tym samym lub większym rozmiarze z różnymi datami , co może być „nieoczekiwane”. Nie --checksum wszystkie pliki są potrzebne, ponieważ i tak rsynczrobi całą sumę kontrolną, ale tylko to, co przesyła.
Tom Hale
--checksumnakazuje rsyncsumę kontrolną plików przed wysłaniem, co gwarantuje, że wszystkie zmienione pliki zostaną przesłane, niezależnie od rozmiaru / czasu. Czy masz źródło nieoczekiwanego --append-verifyzachowania, ponieważ to, co opisujesz, nie pasuje do dokumentacji lub mojego (ograniczonego) doświadczenia?
TomG
--append-verifyodnosi się do tego, --appendco mówi: If a file needs to be transferred and its size on the receiver is the same or longer than the size on the sender, the file is skipped.Nawet jeśli plik musi zostać przesłany z tego powodu --checksum, nadal może zostać pominięty.
Tom Hale
6

David Schwartz ma rację --partial(lub lepiej -P) robi to, co chcesz. Sprawdziłem to na pliku 37G, który został w nim zatrzymany ~ 8g, przez sieć. rsync szybko przeskanował pierwsze części części (pokazując postęp, dzięki czemu -P), a następnie wznowił przesyłanie do końca pliku częściowego.

Steve Byrne
źródło
Kopia sieciowa jest traktowana inaczej niż kopia lokalna, co jest tutaj problemem.
roaima,
@roaima Czy masz na to źródło lub dokument, który wyjaśnia bardziej szczegółowo, jakie są różnice? Nie udaje mi się go znaleźć na (ogromnej) stronie.
Jonas Schäfer
@JonasWielicki strona man odnosi się do niej pod --whole-fileopisem opcji.
roaima
@roaima Dziękuję bardzo! Oznacza to również, że właściwym obejściem jest --no-W(co w rzeczywistości działa!)
Jonas Schäfer
@JonasWielicki jest niezwykle nieefektywny, dlatego domyślnie jest wyłączony. Naprawdę nie chcesz używać, --no-Wchyba że dokładnie rozumiesz, co to ustawienie oznacza dla plików lokalnych. Zobacz unix.stackexchange.com/a/181018/100397
roaima
2

Robiłeś to dobrze, --partialrobi to, co chcesz. Wygląda na to, że zaczyna się od początku, ponieważ zawsze zaczyna się na początku listy fragmentów danych plików, które należy skopiować. Ta --appendopcja jest niebezpieczna i spowoduje uszkodzenie pliku, jeśli dane z jakiegoś powodu nie będą pasować.

David Schwartz
źródło
Lokalne kopie nie są porównywane, są po prostu nadpisywane (lub --appendkontynuowane od przesunięcia bajtu).
roaima 17.04.16
1

Domyślnie rsyncwłącza się w --whole-fileprzypadku przesyłania z dysku lokalnego na dysk lokalny. Spowoduje to ponowne uruchomienie przerwanego transferu od początku, zamiast sprawdzania części, które już tam są.

Aby to wyłączyć, użyj:

--no-whole-file

Łącząc to z albo --inplaceczy --partialpozwoli wznawianie transferu później.

Mój alias używany rsyncdo kopiowania to:

rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'

Ostrzeżenie : używaj ostrożnie, --append-verifyponieważ pomija pliki docelowe o tym samym rozmiarze lub większym.

Tom Hale
źródło
W przypadku transferów sieciowych rsyncporównuje pliki źródłowe i odpowiednie pliki docelowe przed przesłaniem, aby wysłać tylko te części, które uległy zmianie (transfer delta). --no-whole-filemówi, rsyncaby zrobić to samo w przypadku kopiowania z lokalnego na lokalny. Dokumentacja nie sugeruje, że wpłynęłoby to na wznowienie częściowych transferów pojedynczych plików. rsyncpominie pliki o dokładnie takim samym rozmiarze i znacznikach czasu według projektu. Ani to --append-verifynie --no-whole-filepowinno, ani nie powinno zmieniać tego zachowania, ale --checksumpowinno działać na rzecz spokoju ducha kosztem IO dysku
TomG
--append-verifypominie pliki o tym samym lub większym rozmiarze z różnymi datami , co może być „nieoczekiwane”. Nie --checksum wszystkie pliki są potrzebne, ponieważ i tak rsynczrobi całą sumę kontrolną, ale tylko to, co przesyła.
Tom Hale