Kiedyś rsync
kopiowałem dużą liczbę plików, ale mój system operacyjny (Ubuntu) uruchomił się nieoczekiwanie.
Po ponownym uruchomieniu uruchomiłem rsync
ponownie, ale z danych wyjściowych na terminalu odkryłem, że rsync
nadal kopiowały te już skopiowane wcześniej. Ale słyszałem, że rsync
jest w stanie znaleźć różnice między źródłem a miejscem docelowym, a zatem po prostu skopiować różnice. Zastanawiam się więc, czy rsync
mogę wznowić to, co zostało po raz ostatni?
sudo rsync -azvv /home/path/folder1/ /home/path/folder2
. (3) Zarówno źródło, jak i cel to NTFS, kup źródło to zewnętrzny dysk twardy, a cel to wewnętrzny dysk twardy. (3) Teraz działa i jeszcze się nie skończył.--modify-window
opcja pomaga w tym).Odpowiedzi:
Po pierwsze, jeśli chodzi o część „wznawiania” pytania,
--partial
po prostu mówi stronie odbierającej, aby zachowała częściowo przesłane pliki, jeśli strona wysyłająca zniknie, jakby zostały całkowicie przeniesione.Podczas przesyłania pliki są tymczasowo zapisywane jako pliki ukryte w folderach docelowych (np.
.TheFileYouAreSending.lRWzDC
) Lub w specjalnie wybranym folderze, jeśli ustawisz--partial-dir
przełącznik. Gdy przesyłanie się nie powiedzie i--partial
nie zostanie ustawione, ten ukryty plik pozostanie w folderze docelowym pod tą tajemniczą nazwą, ale jeśli--partial
zostanie ustawiony, nazwa pliku zostanie zmieniona na rzeczywistą nazwę pliku docelowego (w tym przypadkuTheFileYouAreSending
), nawet jeśli plik nie jest kompletny. Chodzi o to, że można później zakończyć przenoszenie ponownie uruchomiony z rsync albo--append
albo--append-verify
.Tak więc,
--partial
nie sama wznowić uszkodzonego lub odwołany transfer. Aby go wznowić, przy następnym uruchomieniu będziesz musiał użyć jednej z wyżej wymienionych flag. Tak więc, jeśli musisz upewnić się, że cel nigdy nie będzie zawierał plików, które wydają się być w porządku, ale w rzeczywistości są niekompletne, nie powinieneś używać--partial
. I odwrotnie, jeśli chcesz się upewnić, że nigdy nie pozostawisz zabłąkanych plików, które są ukryte w katalogu docelowym, i wiesz, że będziesz w stanie dokończyć transfer później,--partial
pomoże Ci to.W odniesieniu do
--append
wspomnianego powyżej przełącznika jest to rzeczywisty przełącznik „wznawiania” i możesz go używać, niezależnie od tego, czy korzystasz--partial
. W rzeczywistości, gdy korzystasz--append
, nigdy nie są tworzone pliki tymczasowe. Pliki są zapisywane bezpośrednio w swoich obiektach docelowych. Pod tym względem--append
daje taki sam wynik jak--partial
w przypadku nieudanego transferu, ale bez tworzenia ukrytych plików tymczasowych.Podsumowując, jeśli przenosisz duże pliki i chcesz wznowić anulowaną lub nieudaną operację rsync od dokładnego punktu, który został
rsync
zatrzymany, musisz użyć--append
lub--append-verify
włączyć kolejną próbę.Jak wskazuje @Alex poniżej, ponieważ wersja 3.0.0
rsync
ma teraz nową opcję--append-verify
, która zachowuje się tak,--append
jak przed wprowadzeniem tego przełącznika. Prawdopodobnie zawsze chcesz się zachowywać--append-verify
, więc sprawdź swoją wersję za pomocąrsync --version
. Jeśli jesteś na Macu i nie korzystarsync
zehomebrew
będziesz (przynajmniej włącznie El Capitan) masz starszą wersję i trzeba użyć--append
zamiast--append-verify
. Dlaczego nie utrzymywali tego zachowania--append
i zamiast tego nazwali przybysza,--append-no-verify
jest to nieco zagadkowe. Tak czy inaczej,--append
narsync
wcześniej wersja 3 jest taka sama jak--append-verify
w nowszych wersjach.--append-verify
nie jest niebezpieczne: zawsze będzie czytać i porównywać dane na obu końcach, a nie tylko zakładać, że są równe. Robi to za pomocą sum kontrolnych, więc jest to łatwe w sieci, ale wymaga odczytu udostępnionej ilości danych na obu końcach drutu, zanim będzie mógł faktycznie wznowić przesyłanie przez dołączenie do celu.Po drugie, powiedziałeś, że „słyszałeś, że rsync jest w stanie znaleźć różnice między źródłem a miejscem docelowym, a zatem po prostu skopiować różnice”.
Zgadza się i nazywa się to transferem delta, ale to inna sprawa. Aby to włączyć, dodaj przełącznik
-c
lub--checksum
. Po użyciu tego przełącznika rsync sprawdzi pliki, które istnieją na obu końcach drutu. Robi to w kawałkach, porównuje sumy kontrolne na obu końcach, a jeśli się różnią, przenosi tylko różne części pliku. Ale, jak wskazuje @Jonathan poniżej, porównanie jest wykonywane tylko wtedy, gdy pliki mają ten sam rozmiar na obu końcach - różne rozmiary powodują, że rsync prześle cały plik, zastępując cel o tej samej nazwie.Wymaga to początkowo trochę obliczeń na obu końcach, ale może być niezwykle skuteczne w zmniejszaniu obciążenia sieci, jeśli na przykład często tworzysz kopie zapasowe bardzo dużych plików o stałym rozmiarze, które często zawierają niewielkie zmiany. Przykładami, które przychodzą na myśl, są pliki obrazów wirtualnych dysków twardych używane w maszynach wirtualnych lub obiektach docelowych iSCSI.
Warto zauważyć, że jeśli użyjesz
--checksum
do przeniesienia partii plików, które są całkowicie nowe do systemu docelowego, rsync nadal obliczy ich sumy kontrolne w systemie źródłowym przed przesłaniem ich. Dlaczego nie wiem :)Krótko mówiąc:
Jeśli często za pomocą rsync po prostu „przenieść rzeczy z punktu A do B” i chcą możliwość anulowania tej operacji a potem wznowić go nie używać
--checksum
, ale nie używać--append-verify
.Jeśli używasz rsync do częstego tworzenia kopii zapasowych,
--append-verify
prawdopodobnie nie zrobisz dla ciebie wiele, chyba że masz zwyczaj wysyłania dużych plików, które stale rosną, ale rzadko są modyfikowane po napisaniu. Jako dodatkową wskazówkę, jeśli tworzysz kopię zapasową w pamięci, która obsługuje migawki, takie jakbtrfs
lubzfs
, dodanie--inplace
przełącznika pomoże zmniejszyć rozmiary migawek, ponieważ zmienione pliki nie są odtwarzane, ale zmienione bloki są zapisywane bezpośrednio nad starymi. Ten przełącznik jest także przydatny, jeśli chcesz uniknąć rsync tworzenia kopii plików w systemie docelowym, gdy wystąpiły tylko niewielkie zmiany.Podczas używania
--append-verify
rsync zachowuje się tak samo jak zawsze we wszystkich plikach o tym samym rozmiarze. Jeśli różnią się modyfikacją lub innymi znacznikami czasu, zastąpi cel źródłem bez dalszego sprawdzania tych plików.--checksum
porówna zawartość (sumy kontrolne) każdej pary plików o identycznej nazwie i rozmiarze.ZAKTUALIZOWANO 01.01.2015 Zmieniono, aby odzwierciedlać punkty wykonane przez @Alex (dzięki!)
ZAKTUALIZOWANO 2017-07-14 Zmieniono, aby odzwierciedlać punkty poczynione przez @Jonathan (dzięki!)
źródło
--partial
wystarczy.--partial-dir
- wygląda na to, że jest to idealna kula do tego. Mogłem coś całkowicie przeoczyć;)--partial
: rsync kopiuje plik do nazwy tymczasowej, połączenie zostaje przerwane, zdalne rsync ostatecznie przenosi ten plik do zwykłej nazwy i kończy, a następnie ponownie uruchomiony z--partial
lub bez--append
, nowy plik tymczasowy jest inicjowany kopią częściowo przesłanego pliku zdalnego, a następnie kopia jest kontynuowana od miejsca, w którym nastąpiło połączenie. (Ubuntu 14.04 / rsync 3.1)--checksum
? Zgodnie zman
tym ma to więcej wspólnego z decydowaniem, które pliki oznaczyć do przesłania, niż z transferem delta (co jest prawdopodobniersync
domyślnym zachowaniem).TL; DR:
Po prostu określ katalog częściowy, zgodnie z zaleceniami stron podręcznika rsync:
Dłuższe wyjaśnienie:
W rzeczywistości jest wbudowana funkcja umożliwiająca to przy użyciu
--partial-dir
opcji, która ma kilka zalet w porównaniu z /--partial
i .--append-verify
--append
Fragment stron man rsync:
Domyślnie rsync używa losowej nazwy pliku tymczasowego, która jest usuwana w przypadku niepowodzenia transferu. Jak wspomniano, za pomocą polecenia
--partial
rsync można zachować niekompletny plik tak, jakby został pomyślnie przesłany , aby można było później dołączyć go za pomocą opcji--append-verify
/--append
. Jest jednak kilka powodów, dla których nie jest to optymalne.Pliki kopii zapasowej mogą być niekompletne i bez sprawdzenia zdalnego pliku, który musi być niezmieniony, nie ma sposobu, aby się dowiedzieć.
Jeśli próbujesz użyć
--backup
i--backup-dir
, właśnie dodałeś nową wersję tego pliku, która nigdy nawet nie wychodziła z historii wersji.Jeśli jednak użyjemy
--partial-dir
, rsync zachowa tymczasowy plik częściowy i wznowi pobieranie przy użyciu tego pliku częściowego przy następnym uruchomieniu, a my nie cierpimy z powodu powyższych problemów.źródło
Możesz dodać
-P
opcję do swojego polecenia.Ze
man
strony:Więc zamiast:
Zrobić:
Oczywiście, jeśli nie chcesz aktualizacji postępu, możesz po prostu użyć
--partial
, tj .:źródło
rsync
. Należy jednak podkreślić, że--partial
samo nie wznawia nieudanego transferu. Zobacz moją odpowiedź, aby poznać szczegóły :)-P
to wystarczy w moim przypadku. Wersje: klient ma 3.1.0, a serwer 3.1.1. Przerwałem przesyłanie pojedynczego dużego pliku za pomocą Ctrl-C. Chyba coś mi umknęło.vv
? tj.v
użyty 2 razy?-azvvP
?Myślę, że siłą dzwonisz
rsync
i dlatego wszystkie dane są pobierane, gdy je ponownie przywołujesz. użyj--progress
opcji, aby skopiować tylko te pliki, które nie zostały skopiowane, i--delete
opcji usunięcia plików, jeśli zostały już skopiowane, a teraz nie istnieje w folderze źródłowym ...Jeśli używasz ssh do logowania do innego systemu i kopiowania plików,
daj mi znać, jeśli mam jakiś błąd w moim rozumieniu tej koncepcji ...
źródło
--delete
usunie pliki w miejscu docelowym , które nie istnieją w źródle. Mniej poważne jest to, że--progress
nie modyfikuje sposobu kopiowania rzeczy; po prostu daje raport postępu dla każdego pliku podczas kopiowania. (Naprawiłem poważny błąd; zastąpiłem go--remove-source-files
).Używam tego prostego skryptu. Dostosuj niektóre flagi i / lub sparametryzuj je.
źródło
Spóźniłem się na to, ale miałem to samo pytanie i znalazłem inną odpowiedź.
--partial
Flag ( „keep częściowo przeniesione pliki” wrsync -h
) jest przydatne w przypadku dużych plików, co jest--append
( „dołączyć dane na krótszych plików”), ale pytanie jest o wiele plików.Aby uniknąć skopiowania plików, użyj
-u
(lub--update
: „pomiń pliki, które są nowsze w odbiorniku”).źródło