Setzen Sie die Übertragung einer einzelnen Datei durch rsync fort

52

In Ubuntu möchte ich eine große Datei von meiner Festplatte auf ein Wechseldatenträger kopieren rsync. Aus einem anderen Grund kann der Vorgang nicht in einem Durchgang abgeschlossen werden. Ich versuche also herauszufinden, wie ich das rsyncKopieren der Datei dort fortsetzen kann, wo sie beim letzten Mal aufgehört hat.

Ich habe versucht , die Möglichkeit zu nutzen --partialoder --inplaceaber zusammen mit --progress, fand ich rsyncmit --partialoder --inplacetatsächlich beginne von Anfang an statt von dem, was zuletzt gelassen. Manuelles rsyncvorzeitiges Stoppen und Überprüfen der Größe der empfangenen Datei bestätigte ebenfalls, was ich gefunden hatte.

Aber mit --appendgeht rsync von dem aus, was beim letzten Mal übrig war.

Ich bin verwirrt, wie ich auf der Manpage gesehen habe --partial , --inplaceund es --appendscheint, als würde ich das Kopieren von dem fortsetzen, was beim letzten Mal übrig war. Kann jemand den Unterschied erklären? Warum nicht --partialoder --inplacearbeiten Sie daran, das Kopieren fortzusetzen? Stimmt es, dass zum Fortsetzen des Kopierens rsyncmit der --appendOption gearbeitet werden muss?

Auch wenn eine Teildatei von mvoder cpnicht von rsync zurückgelassen wurde, wird das rsync --appendKopieren der Datei dann korrekt fortgesetzt?

Tim
quelle

Antworten:

39

Um eine unterbrochene Kopie fortzusetzen, sollten Sie verwenden rsync --append. Aus der Erklärung der Manpage von --append:

Dies bewirkt, dass rsync eine Datei aktualisiert, indem Daten an das Ende der Datei angehängt werden. Dabei wird vorausgesetzt, dass die bereits auf der empfangenden Seite vorhandenen Daten mit dem Dateianfang auf der sendenden Seite identisch sind. [...] impliziert --inplace, [...]

Die Option --inplacebewirkt rsync, dass der Inhalt der Zieldatei direkt (überschrieben) wird. ohne --inplace , rsyncwürde:

  1. eine neue Datei mit einem temporären Namen erstellen,
  2. Kopieren Sie aktualisierte Inhalte hinein,
  3. Tauschen Sie es mit der Zieldatei aus, und schließlich
  4. Löschen Sie die alte Kopie der Zieldatei.

Der normale Betriebsmodus verhindert hauptsächlich Konflikte mit Anwendungen, in denen die Zieldatei möglicherweise geöffnet ist, sowie einige andere Pannen, die ordnungsgemäß in der rsyncManpage aufgeführt sind.

Beachten Sie, dass, wenn ein Kopier- / Aktualisierungsvorgang in den Schritten 1.-3 fehlschlägt. oben rsyncwird die temporäre Zieldatei gelöscht; Die --partial Option deaktiviert dieses Verhalten und rsyncbelässt teilweise übertragene temporäre Dateien im Zieldateisystem. Das Fortsetzen eines Kopiervorgangs für eine einzelne Datei wird daher nur dann von Vorteil sein, wenn Sie den ersten Vorgang rsyncmit --partialoder aufgerufen haben --partial-dir(der gleiche Effekt wie --partialbei der Anweisung rsync , alle temporären Dateien in einem bestimmten Verzeichnis zu erstellen).

Riccardo Murri
quelle
Vielen Dank! Wenn eine Teildatei von mv oder cp hinterlassen wurde, nicht von rsync, wird rsync --append das Kopieren der Datei korrekt fortsetzen?
Tim
1
@Tim Kurz gesagt, --appendnimmt man rsyncan, dass, wenn zwei entsprechende Dateien unterschiedliche Länge haben, die kürzere mit dem Anfangsteil der längeren identisch ist. Wenn Sie also mit dem Kopieren einer großen Datei beginnen cpund den Kopiervorgang unterbrechen, rsync --appendwird nur der verbleibende Teil der Datei kopiert. ( Hinweis: Wenn cpdas System durch einen Systemabsturz unterbrochen wird, besteht eine geringe Wahrscheinlichkeit, dass der Dateiinhalt und die Metadaten nicht synchron sind, dh die Datei ist beschädigt. In diesem Fall sollte das Problem behoben werden, rsyncwenn Sie erneut ohne ausgeführt --append werden.)
Riccardo Murri
2
Wenn ich das richtig verstehe, gibt es keine Möglichkeit, rsync anzuweisen, eine Teildatei zu überprüfen und die Übertragung auf diese Teildatei fortzusetzen ?
Winny
1
@Winny, sehr verspätet: Für eine lokale Kopie gibt es keinen vernünftigen Weg, dies zu tun. Bei einer Netzwerkkopie ist dies der Standardmodus, wenn Sie --partialohne angeben --append.
Roaima
1
@Winny --appendund --append-verifyhaben einen gefährlichen Fehlerfall : Wenn die Datei des Empfängers gleich groß oder größer ist, aber unterschiedliche Daten enthält. Ich schlage stattdessen eine Lösung vor--no-whole-file .
Tom Hale
21

Seien Sie sich dessen bewusst, was --appendimpliziert --inplace, was impliziert --partial.

  • Wenn Sie nur verwenden --partial, sollten Sie rsyncTeilübertragungen verlassen und sie bei nachfolgenden Versuchen fortsetzen.

  • Wenn --appendSie verwenden, sollten Sie rsyncbeide dazu veranlassen, Teildateien zu belassen und beim nächsten Mal fortzusetzen. Nach der Übertragung rsyncsollte nur die Prüfsumme der übertragenen Daten überprüft werden.

  • --append-verify Bezieht die gesamte Datei in die Prüfsummenüberprüfung ein, einschließlich aller Teile, die bei einer vorherigen Übertragung übertragen wurden.

  • Entweder mit --appendoder --append-verifyeiner gescheiterten Prüfsummenverifizierung sollte bewirken , dass die Datei komplett neu übertragen werden (mit --inplace)

Sie sollten in der Lage sein, eine Operation mvoder eine cpOperation mit rsyncfortzusetzen, möchten jedoch möglicherweise die --append-verifyOption für ein beruhigendes Gefühl verwenden.

Beachten Sie, dass durch die Verwendung von --appendUrsachen nur die Dateien rsynckopiert werden, deren Größe auf dem Empfänger kürzer ist als die Größe auf dem Absender (unabhängig von Zeitstempeln) oder die auf dem Empfänger nicht vorhanden sind. Durch Dokumentation zu dieser Option:

Wenn eine Datei übertragen werden muss und ihre Größe auf dem Empfänger gleich oder länger als die Größe auf dem Absender ist, wird die Datei übersprungen.

Mehr Infos in der Manpage

TomG
quelle
--appendund --append-verifyes liegt ein gefährlicher Fehlerfall vor: Wenn die Datei des Empfängers gleich groß oder größer ist, aber unterschiedliche Daten enthält. Ich schlage stattdessen eine Lösung vor--no-whole-file .
Tom Hale
@TomHale In der Dokumentation wird vorgeschlagen, dass eine Datei an beiden Enden genau dieselbe Größe und Änderungszeit haben muss, damit sie übersprungen werden kann. Wenn dies ein plausibles Anliegen ist, --checksumsollte es verwendet werden. Ich kann es nicht explizit angegeben finden, aber logischerweise sollte jede der wiederaufnahmefähigen Optionen implizieren, --no-whole-filedass --whole-filesie inkompatibel sein sollten.
TomG
--append-verifyüberspringt gleiche oder größere Dateien mit unterschiedlichen Daten , was "unerwartet" sein kann. Es sind nicht --checksum alle Dateien erforderlich , da rsyncohnehin eine ganze Dateiprüfsumme erstellt wird, sondern nur, was übertragen wird.
Tom Hale
--checksumWeist rsyncan, die Dateien vor dem Senden zu prüfen, um sicherzustellen, dass alle geänderten Dateien unabhängig von Größe und Zeit übertragen werden. Haben Sie eine Quelle für das unerwartete --append-verifyVerhalten, da das, was Sie beschreiben, nicht mit der Dokumentation oder meiner (eingeschränkten) Erfahrung übereinstimmt?
TomG
--append-verifyverweist auf --appenddie Aussage: 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.Auch wenn eine Datei wegen übertragen werden muss --checksum, kann sie dennoch übersprungen werden.
Tom Hale
6

David Schwartz ist richtig, --partial(oder besser -P) tut, was Sie wollen. Ich habe dies an einer 37G-Datei überprüft, die über ein Netzwerk mit ~ 8g angehalten wurde. rsync scannte schnell die ersten Teile des Teils (und zeigte den Fortschritt an, dank dem es lief -P) und setzte dann die Übertragung zum Ende der Teildatei fort.

Steve Byrne
quelle
Eine Netzwerkkopie wird anders behandelt als eine lokale Kopie, worum es hier geht.
Roaima
@roaima Haben Sie eine Quelle dafür oder ein Dokument, in dem die Unterschiede näher erläutert werden? Ich finde es nicht in der (riesigen) Manpage.
Jonas Schäfer
@ JonasWielicki Die Manpage spielt unter der --whole-fileOptionsbeschreibung darauf an.
Roaima
@roaima Vielen Dank! Dies bedeutet auch, dass die richtige Problemumgehung ist --no-W(was tatsächlich funktioniert!)
Jonas Schäfer
@JonasWielicki es ist außerordentlich ineffizient, weshalb es standardmäßig deaktiviert ist. Sie möchten wirklich nicht verwenden, --no-Wwenn Sie nicht genau wissen , welche Einstellung dies für lokale Dateien bedeutet. Siehe unix.stackexchange.com/a/181018/100397
roaima
2

Du hast es richtig gemacht, --partialmacht was du willst. Es scheint von vorne zu beginnen, da es immer am Anfang der Liste der zu kopierenden Dateidatenblöcke beginnt. Die --appendOption ist gefährlich und führt zu einer beschädigten Datei, wenn die Daten aus irgendeinem Grund nicht übereinstimmen.

David Schwartz
quelle
Lokale Kopien werden nicht verglichen, sie werden einfach überschrieben (oder --appendvom Byte-Offset an fortgesetzt).
Roaima
1

Standardmäßig rsyncaktiviert, --whole-filewenn von lokaler Festplatte zu lokaler Festplatte übertragen wird. Dadurch wird eine unterbrochene Übertragung von Anfang an neu gestartet, anstatt die bereits vorhandenen Teile zu überprüfen.

Um dies zu deaktivieren, verwenden Sie:

--no-whole-file

Wenn Sie dies entweder mit --inplaceoder --partialkombinieren, wird die Übertragung später fortgesetzt.

Mein Alias ​​für die Verwendung rsynczum Kopieren ist:

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

Achtung : Seien Sie vorsichtig verwenden , --append-verifyda es wird überspringen alle Zieldateien, die gleich groß oder größer sind.

Tom Hale
quelle
Bei Netzwerkübertragungen werden rsyncQuell- und entsprechende Zieldateien vor der Übertragung verglichen, um nur die Teile zu senden, die sich geändert haben (Delta-Übertragung). --no-whole-filefordert Sie rsyncauf, dasselbe für das Kopieren von lokal zu lokal zu tun. Die Dokumentation schlägt nicht vor, dass dies Auswirkungen auf die Wiederaufnahme der teilweisen Übertragung einzelner Dateien haben würde. rsyncüberspringt Dateien mit genau der gleichen Größe und den gleichen Zeitstempeln. Weder sollte --append-verifynoch --no-whole-filesollte dieses Verhalten geändert werden, sondern es --checksumsollte aus
Gründen der Sicherheit
--append-verifyüberspringt gleiche oder größere Dateien mit unterschiedlichen Daten , was "unerwartet" sein kann. Es sind nicht --checksum alle Dateien erforderlich , da rsyncohnehin eine ganze Dateiprüfsumme erstellt wird, sondern nur, was übertragen wird.
Tom Hale