it-swarm.com.de

Kann rsync nach einer Unterbrechung fortgesetzt werden?

Ich habe rsync verwendet, um eine große Anzahl von Dateien zu kopieren, aber mein Betriebssystem (Ubuntu) wurde unerwartet neu gestartet.

Nach dem Neustart habe ich rsync erneut ausgeführt, aber bei der Ausgabe auf dem Terminal habe ich festgestellt, dass rsync die bereits zuvor kopierten noch kopiert hat. Aber ich habe gehört, dass rsync Unterschiede zwischen Quelle und Ziel finden und daher nur die Unterschiede kopieren kann. Also frage ich mich in meinem Fall, ob rsync wieder aufnehmen kann, was beim letzten Mal übrig war?

203
Tim

In Bezug auf den Teil "Lebenslauf" Ihrer Frage weist --partial Das empfangende Ende zunächst an, teilweise übertragene Dateien aufzubewahren, wenn das sendende Ende verschwindet, als wären sie vollständig übertragen worden.

Während der Übertragung werden Dateien vorübergehend als versteckte Dateien in ihren Zielordnern (z. B. .TheFileYouAreSending.lRWzDC) Oder in einem speziell ausgewählten Ordner gespeichert, wenn Sie den Schalter --partial-dir Einstellen. Wenn eine Übertragung fehlschlägt und --partial Nicht festgelegt ist, verbleibt diese versteckte Datei im Zielordner unter diesem kryptischen Namen. Wenn jedoch --partial Festgelegt ist, wird die Datei in die tatsächliche Zieldatei umbenannt Name (in diesem Fall TheFileYouAreSending), obwohl die Datei nicht vollständig ist. Der Punkt ist, dass Sie die Übertragung später abschließen können, indem Sie rsync entweder mit --append Oder --append-verify Erneut ausführen.

--partial Setzt also selbst eine fehlgeschlagene oder abgebrochene Übertragung nicht fort. Um es fortzusetzen, müssen Sie beim nächsten Lauf eines der oben genannten Flags verwenden. Wenn Sie also sicherstellen müssen, dass das Ziel niemals Dateien enthält, die in Ordnung zu sein scheinen, aber tatsächlich unvollständig sind, sollten Sie --partial Nicht verwenden. Umgekehrt hilft Ihnen --partial, Wenn Sie sicherstellen möchten, dass Sie niemals fehlerhafte Dateien zurücklassen, die im Zielverzeichnis versteckt sind, und Sie wissen, dass Sie die Übertragung später abschließen können.

In Bezug auf den oben erwähnten Schalter --append Ist dies der eigentliche "Resume" -Schalter, und Sie können ihn verwenden, unabhängig davon, ob Sie auch --partial Verwenden oder nicht. Wenn Sie --append Verwenden, werden niemals temporäre Dateien erstellt. Dateien werden direkt auf ihre Ziele geschrieben. In dieser Hinsicht liefert --append Das gleiche Ergebnis wie --partial Bei einer fehlgeschlagenen Übertragung, jedoch ohne diese versteckten temporären Dateien zu erstellen.

Zusammenfassend lässt sich sagen, dass Sie den --append Verwenden müssen, wenn Sie große Dateien verschieben und die Option möchten, einen abgebrochenen oder fehlgeschlagenen Rsync-Vorgang an dem Punkt fortzusetzen, an dem rsync gestoppt wurde. oder --append-verify beim nächsten Versuch einschalten.

Wie @Alex weiter unten ausführt, hat rsync seit Version 3.0.0 jetzt eine neue Option, --append-verify, Die sich wie --append Verhält, bevor dieser Schalter existierte. Sie möchten wahrscheinlich immer das Verhalten von --append-verify, Überprüfen Sie also Ihre Version mit rsync --version. Wenn Sie auf einem Mac arbeiten und nicht rsync von homebrew verwenden, haben Sie (zumindest bis einschließlich El Capitan) eine ältere Version und müssen --append statt --append-verify. Warum sie das Verhalten bei --append Nicht beibehalten und stattdessen den Newcomer --append-no-verify Benannt haben, ist ein bisschen rätselhaft. In beiden Fällen ist --append In rsync vor Version 3 dasselbe wie --append-verify In den neueren Versionen.

--append-verify Ist nicht gefährlich: Es werden immer die Daten an beiden Enden gelesen und verglichen und nicht nur angenommen, dass sie gleich sind. Dies geschieht mithilfe von Prüfsummen, ist also für das Netzwerk einfach, erfordert jedoch das Lesen der gemeinsam genutzten Datenmenge an beiden Enden des Kabels, bevor die Übertragung durch Anhängen an das Ziel tatsächlich fortgesetzt werden kann.

Zweitens sagten Sie, Sie hätten "gehört, dass rsync Unterschiede zwischen Quelle und Ziel finden und daher nur die Unterschiede kopieren kann".

Das ist richtig und heißt Delta-Transfer, aber es ist eine andere Sache. Um dies zu aktivieren, fügen Sie den Schalter -c Oder --checksum Hinzu. Sobald dieser Schalter verwendet wird, überprüft rsync Dateien, die an beiden Enden des Kabels vorhanden sind. Dies geschieht in Blöcken, vergleicht die Prüfsummen an beiden Enden und überträgt, wenn sie sich unterscheiden, nur die unterschiedlichen Teile der Datei. Wie @Jonathan weiter unten ausführt, wird der Vergleich jedoch nur durchgeführt, wenn die Dateien an beiden Enden dieselbe Größe haben. Unterschiedliche Größen führen dazu, dass rsync die gesamte Datei hochlädt und das Ziel mit demselben Namen überschreibt.

Dies erfordert anfangs ein wenig Berechnung an beiden Enden, kann jedoch die Netzwerklast äußerst effizient reduzieren, wenn Sie beispielsweise häufig sehr große Dateien mit fester Größe sichern, die häufig geringfügige Änderungen enthalten. Beispiele, die in den Sinn kommen, sind Image-Dateien für virtuelle Festplatten, die in virtuellen Maschinen oder iSCSI-Zielen verwendet werden.

Es ist bemerkenswert, dass rsync bei Verwendung von --checksum Zum Übertragen eines Stapels von Dateien, die für das Zielsystem völlig neu sind, die Prüfsummen auf dem Quellsystem berechnet, bevor sie übertragen werden. Warum ich nicht weiß :)

Kurz gesagt:

Wenn Sie rsync häufig verwenden, um nur "Dinge von A nach B zu verschieben" und die Option möchten, diesen Vorgang abzubrechen und später fortzusetzen, nicht verwenden Sie --checksum, Aber - do benutze --append-verify.

Wenn Sie rsync häufig zum Sichern verwenden, wird die Verwendung von --append-verify Wahrscheinlich nicht viel für Sie tun, es sei denn, Sie haben die Gewohnheit, große Dateien zu senden, deren Größe kontinuierlich zunimmt, die jedoch nach dem Schreiben nur selten geändert werden . Als Bonus-Tipp können Sie beim Hinzufügen eines Speichers, der Snapshots wie btrfs oder zfs unterstützt, durch Hinzufügen des Schalters --inplace Die Snapshot-Größe seit geänderten Dateien reduzieren werden nicht neu erstellt, sondern die geänderten Blöcke werden direkt über die alten geschrieben. Dieser Schalter ist auch nützlich, wenn Sie vermeiden möchten, dass rsync Kopien von Dateien auf dem Ziel erstellt, wenn nur geringfügige Änderungen vorgenommen wurden.

Bei Verwendung von --append-verify Verhält sich rsync wie immer bei allen Dateien gleicher Größe. Wenn sie sich in Änderungen oder anderen Zeitstempeln unterscheiden, wird das Ziel mit der Quelle überschrieben, ohne diese Dateien weiter zu überprüfen. --checksum Vergleicht den Inhalt (Prüfsummen) jedes Dateipaars mit identischem Namen und identischer Größe.

AKTUALISIERT am 01.09.2015 Geändert, um die von @Alex gemachten Punkte wiederzugeben (danke!)

AKTUALISIERT am 14.07.2017 Geändert, um die von @Jonathan gemachten Punkte wiederzugeben (danke!)

307

TL; DR:

Geben Sie einfach ein Teilverzeichnis an, wie in den rsync-Manpages empfohlen:

--partial-dir=.rsync-partial

Längere Erklärung:

Es gibt tatsächlich eine integrierte Funktion, um dies mit der Option --partial-dir Zu tun, die gegenüber der Alternative --partial Und --append-verify/--append Mehrere Vorteile bietet.

Auszug aus den rsync-Manpages:

--partial-dir=DIR
      A  better way to keep partial files than the --partial option is
      to specify a DIR that will be used  to  hold  the  partial  data
      (instead  of  writing  it  out to the destination file).  On the
      next transfer, rsync will use a file found in this dir  as  data
      to  speed  up  the resumption of the transfer and then delete it
      after it has served its purpose.

      Note that if --whole-file is specified (or  implied),  any  par-
      tial-dir  file  that  is  found for a file that is being updated
      will simply be removed (since rsync  is  sending  files  without
      using rsync's delta-transfer algorithm).

      Rsync will create the DIR if it is missing (just the last dir --
      not the whole path).  This makes it easy to use a relative  path
      (such  as  "--partial-dir=.rsync-partial")  to have rsync create
      the partial-directory in the destination file's  directory  when
      needed,  and  then  remove  it  again  when  the partial file is
      deleted.

      If the partial-dir value is not an absolute path, rsync will add
      an  exclude rule at the end of all your existing excludes.  This
      will prevent the sending of any partial-dir files that may exist
      on the sending side, and will also prevent the untimely deletion
      of partial-dir items on the receiving  side.   An  example:  the
      above  --partial-dir  option would add the equivalent of "-f '-p
      .rsync-partial/'" at the end of any other filter rules.

Standardmäßig verwendet rsync einen zufälligen temporären Dateinamen, der gelöscht wird, wenn eine Übertragung fehlschlägt. Wie bereits erwähnt, können Sie mit --partial Rsync veranlassen, die unvollständige Datei als ob sie erfolgreich übertragen wurde zu behalten, damit Sie sie später mit --append-verify Anhängen können./--append Optionen. Es gibt jedoch mehrere Gründe, warum dies nicht optimal ist.

  1. Ihre Sicherungsdateien sind möglicherweise nicht vollständig, und ohne die Remote-Datei zu überprüfen, die noch unverändert sein muss, können Sie dies nicht feststellen.

  2. Wenn Sie versuchen, --backup Und --backup-dir Zu verwenden, haben Sie gerade eine neue Version dieser Datei hinzugefügt, die noch nie zuvor in Ihrem Versionsverlauf beendet wurde.

Wenn wir jedoch --partial-dir Verwenden, behält rsync die temporäre Teildatei bei und setzt das Herunterladen mit dieser Teildatei fort, wenn Sie sie das nächste Mal ausführen, und wir leiden nicht unter den oben genannten Problemen.

67

Möglicherweise möchten Sie Ihrem Befehl die Option -P Hinzufügen.

Von der Seite man:

--partial By default, rsync will delete any partially transferred file if the transfer
         is interrupted. In some circumstances it is more desirable to keep partially
         transferred files. Using the --partial option tells rsync to keep the partial
         file which should make a subsequent transfer of the rest of the file much faster.

  -P     The -P option is equivalent to --partial --progress.   Its  pur-
         pose  is to make it much easier to specify these two options for
         a long transfer that may be interrupted.

Also statt:

Sudo rsync -azvv /home/path/folder1/ /home/path/folder2

Tun:

Sudo rsync -azvvP /home/path/folder1/ /home/path/folder2

Wenn Sie die Fortschrittsaktualisierungen nicht möchten, können Sie natürlich einfach --partial Verwenden, d. H.:

Sudo rsync --partial -azvv /home/path/folder1/ /home/path/folder2
39
N2O

Ich bin spät dran, aber ich hatte die gleiche Frage und fand eine andere Antwort.

Das --partial flag ("teilweise übertragene Dateien behalten" in rsync -h) ist nützlich für große Dateien, ebenso wie --append ("Daten an kürzere Dateien anhängen"), aber die Frage betrifft eine große Anzahl von Dateien.

Um zu vermeiden, dass bereits kopierte Dateien verwendet wurden, verwenden Sie -u (oder --update: "Dateien überspringen, die auf dem Empfänger neuer sind").

2
lazysoundsystem

Ich benutze dieses einfache Skript. Fühlen Sie sich frei, bestimmte Flags anzupassen und/oder zu parametrisieren.

#!/bin/bash

while [ 1 ]
do
    rsync -avz --partial [source] [dest]:
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 180
    fi
done
1

Ich denke, Sie rufen gewaltsam rsync auf und daher werden alle Daten heruntergeladen, wenn Sie sie erneut aufrufen. verwenden --progress Option zum Kopieren nur der nicht kopierten Dateien und --delete Option zum Löschen von Dateien, wenn diese bereits kopiert wurden und jetzt nicht im Quellordner vorhanden sind ...

rsync -avz --progress --delete -e  /home/path/folder1/ /home/path/folder2

Wenn Sie sich mit ssh bei einem anderen System anmelden und die Dateien kopieren,

rsync -avz --progress --delete -e "ssh -o UserKnownHostsFile=/dev/null -o \
StrictHostKeyChecking=no" /home/path/folder1/ /home/path/folder2

lassen Sie mich wissen, wenn mein Verständnis dieses Konzepts fehlerhaft ist ...

1
Yadunandana