Kann rsync nach einer Unterbrechung fortgesetzt werden?

188

Früher habe ich rsyncviele Dateien kopiert, aber mein Betriebssystem (Ubuntu) wurde unerwartet neu gestartet.

Nach dem Neustart lief ich rsyncwieder, aber von der Ausgabe auf dem Terminal stellte ich fest, dass rsyncnoch die zuvor kopierten kopiert wurden. Aber ich habe gehört, dass rsynces möglich ist, Unterschiede zwischen Quelle und Ziel zu finden und daher die Unterschiede nur zu kopieren. Also frage ich mich in meinem Fall, ob ich rsyncwieder aufnehmen kann, was das letzte Mal übrig geblieben ist?

Tim
quelle
Ja, rsync kopiert keine Dateien mehr, die bereits kopiert wurden. Es gibt einige Randfälle, in denen die Erkennung fehlschlagen kann. Wurden alle bereits kopierten Dateien kopiert? Welche Möglichkeiten haben Sie genutzt? Was waren die Quell- und Zieldateisysteme? Wenn Sie rsync erneut ausführen, nachdem alles kopiert wurde, wird es dann erneut kopiert?
Gilles
@ Gilles: Danke! (1) Ich glaube, ich habe gesehen, wie rsync die gleichen Dateien von seiner Ausgabe auf dem Terminal kopiert hat. (2) Optionen sind die gleichen wie in meinem anderen Beitrag, dh sudo rsync -azvv /home/path/folder1/ /home/path/folder2. (3) Quelle und Ziel sind beide NTFS, Kaufquelle ist eine externe Festplatte und Ziel ist eine interne Festplatte. (3) Es läuft jetzt und ist noch nicht fertig.
Tim,
Es gibt auch das Flag --partial, um teilweise übertragene Dateien fortzusetzen (nützlich für große Dateien)
jwbensley
3
@Tim Auf den ersten Blick gibt es zumindest einen Zeitversatz und Unterschiede in der Zeitauflösung (ein häufiges Problem bei FAT-Dateisystemen, bei denen die Zeiten in 2-Sekunden-Schritten gespeichert werden. Die --modify-windowOption hilft dabei).
Gilles
1
wenn du nicht / oder / hattest. Am Ende des
Dateiquellpfad-

Antworten:

285

In Bezug auf den Teil "Wiederaufnahme" Ihrer Frage --partialweist Sie das empfangende Ende lediglich an, teilweise übertragene Dateien beizubehalten, wenn das sendende Ende verschwindet, als wären sie vollständig übertragen worden.

Während der Übertragung von Dateien werden diese vorübergehend als versteckte Dateien in ihren Zielordnern (z. B. .TheFileYouAreSending.lRWzDC) oder in einem speziell ausgewählten Ordner gespeichert, wenn Sie den --partial-dirSchalter einstellen . Wenn eine Übertragung fehlschlägt und --partialnicht festgelegt ist, verbleibt diese versteckte Datei im Zielordner unter diesem kryptischen Namen. Wenn dies festgelegt --partialist, wird die Datei jedoch in den tatsächlichen Zieldateinamen umbenannt (in diesem Fall TheFileYouAreSending), obwohl die Datei ist nicht vollständig. Der Punkt ist, dass Sie die Übertragung später abschließen können, indem Sie rsync erneut mit --appendoder ausführen --append-verify.

Also, --partialnicht selbst einen fehlgeschlagenen oder abgebrochenen Übertragung fortzusetzen. 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 nicht verwenden --partial. Umgekehrt, wenn Sie sicherstellen möchten, dass keine fehlgeschlagenen Dateien im Zielverzeichnis zurückbleiben und Sie wissen, dass Sie die Übertragung später abschließen können, können Sie dies tun --partial.

In Bezug auf den --appendoben genannten Schalter ist dies der eigentliche "Resume" -Schalter, und Sie können ihn unabhängig davon verwenden, ob Sie ihn auch verwenden oder nicht --partial. Tatsächlich werden bei der Verwendung --appendkeine temporären Dateien erstellt. Dateien werden direkt auf ihre Ziele geschrieben. In dieser Hinsicht erhalten Sie --appenddasselbe Ergebnis wie --partialbei einer fehlgeschlagenen Übertragung, jedoch ohne die ausgeblendeten temporären Dateien zu erstellen.

Also, um es zusammenzufassen, wenn Sie große Dateien in Bewegung sind und Sie wollen , dass die Option eine abgebrochene oder nicht von der exakten Punkt rsync Betrieb wieder aufnehmen , die rsyncgestoppt wird , müssen Sie die verwenden --appendoder --append-verifyschalten Sie den nächsten Versuch.

Wie @Alex weiter unten ausführt, gibt es seit Version 3.0.0 rsynceine neue Option --append-verify, die sich so verhält, wie --appendvor dem Bestehen dieses Schalters. Sie möchten wahrscheinlich immer das Verhalten von --append-verify, also überprüfen Sie Ihre Version mit rsync --version. Wenn Sie einen Mac verwenden und nicht rsyncvon verwenden homebrew, verfügen Sie (mindestens bis einschließlich El Capitan) über eine ältere Version und müssen diese verwenden, --appendanstatt --append-verify. Warum sie das Verhalten nicht beibehalten --appendund stattdessen den Neuling genannt haben, --append-no-verifyist ein bisschen rätselhaft. So oder so, --appendauf dem rsyncvor Version 3 ist das gleiche wie --append-verifybei den neueren Versionen.

--append-verifyist nicht gefährlich: Es liest und vergleicht immer die Daten an beiden Enden und geht nicht nur davon aus, dass sie gleich sind. Dabei werden Prüfsummen verwendet, wodurch das Netzwerk entlastet wird. Es muss jedoch die gemeinsam genutzte Datenmenge an beiden Enden der Leitung gelesen werden, bevor die Übertragung durch Anhängen an das Ziel fortgesetzt werden kann.

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

Das ist richtig, und es heißt Delta-Transfer, aber es ist eine andere Sache. Um dies zu aktivieren, fügen Sie den Schalter -coder hinzu --checksum. Sobald dieser Schalter verwendet wird, überprüft rsync Dateien, die an beiden Enden der Leitung vorhanden sind. Dies geschieht in Stücken, vergleicht die Prüfsummen an beiden Enden und überträgt, wenn sie unterschiedlich sind, nur die unterschiedlichen Teile der Datei. Wie @Jonathan 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 auf beiden Seiten, kann jedoch bei der Reduzierung der Netzwerklast äußerst effizient sein, wenn Sie beispielsweise häufig sehr große Dateien mit fester Größe sichern, die häufig geringfügige Änderungen enthalten. Beispiele dafür sind Image-Dateien für virtuelle Festplatten, die in virtuellen Maschinen oder iSCSI-Zielen verwendet werden.

Es ist bemerkenswert, dass --checksumrsync beim Übertragen eines Stapels völlig neuer Dateien auf das Zielsystem deren Prüfsummen vor dem Übertragen auf dem Quellsystem berechnet. Warum weiß ich nicht :)

Also, kurz gesagt:

Wenn Sie verwenden oft rsync nur „Sachen von A nach B bewegen“ und wollen die Möglichkeit , dass die Operation abzubrechen und später wieder aufnehmen, nicht zu verwenden --checksum, aber nicht verwenden --append-verify.

Wenn Sie rsync häufig zum Sichern von Daten verwenden, wird die Verwendung --append-verifywahrscheinlich nicht viel für Sie bedeuten, es sei denn, Sie haben die Angewohnheit, große Dateien zu senden, die ständig größer werden, aber nach dem Schreiben selten geändert werden. Wenn Sie ein Backup auf einen Speicher erstellen, der Snapshots wie btrfsoder unterstützt zfs, können --inplaceSie die Snapshot-Größe verringern , indem Sie den Schalter hinzufügen, da geänderte Dateien nicht neu erstellt werden, sondern die geänderten Blöcke direkt über die alten geschrieben werden. Diese Option 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-verifyverhält sich rsync genauso wie immer bei allen Dateien gleicher Größe. Wenn sich Änderungen oder andere Zeitstempel unterscheiden, wird das Ziel mit der Quelle überschrieben, ohne dass diese Dateien weiter überprüft werden. --checksumvergleicht den Inhalt (Prüfsummen) jedes Dateipaares mit identischem Namen und identischer Größe.

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

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

DanielSmedegaardBuus
quelle
4
Das sagt --partialist genug.
Cees Timmerman
2
@CMCDragonkai Schauen Sie sich Alexanders Antwort unten an --partial-dir: Sieht so aus, als wäre es die perfekte Kugel dafür. Ich kann etwas völlig verpasst haben;)
DanielSmedegaardBuus
2
@DanielSmedegaardBuus Ich habe es selbst auf einer langsamen Verbindung getestet, und dies sehe ich nur mit --partial : rsync kopiert die Datei in den temporären Namen, die Verbindung wird unterbrochen, der Remote-Rsync verschiebt diese Datei schließlich auf den regulären Namen und beendet sie dann Wird die neue temporäre Datei mit --partialund ohne erneut ausgeführt --append , wird sie mit einer Kopie der teilweise übertragenen Remote-Datei initialisiert. Anschließend wird die Kopie an der Stelle fortgesetzt, an der die Verbindung unterbrochen wurde. (Ubuntu 14.04 / rsync 3.1)
Izkata
4
Was ist Ihr Vertrauen in das beschriebene Verhalten von --checksum? Demnach manhat es mehr mit der Entscheidung zu tun, welche Dateien für die Übertragung markiert werden sollen, als mit der Delta-Übertragung (was vermutlich rsyncdas Standardverhalten ist).
Jonathan Y.
56

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 eingebaute Funktion, um dies mit der --partial-dirOption zu tun , die mehrere Vorteile gegenüber --partialund --append-verify/ oder --appendAlternative hat.

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 --partialSie mit rsync festlegen, dass die unvollständige Datei so bleibt, als ob sie erfolgreich übertragen wurde , sodass sie später mit den Optionen --append-verify/ --appendangehängt werden kann. Dies ist jedoch aus mehreren Gründen nicht optimal.

  1. Ihre Sicherungsdateien sind möglicherweise nicht vollständig, und ohne Überprüfung der Remote-Datei, die noch unverändert sein muss, ist dies nicht möglich.

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

Wenn wir jedoch verwenden --partial-dir, behält rsync die temporäre Teildatei bei und setzt den Download mit dieser Teildatei fort, wenn Sie sie das nächste Mal ausführen. Die oben genannten Probleme treten bei uns nicht auf.

Alexander O'Mara
quelle
38

Möglicherweise möchten Sie die -POption zu Ihrem Befehl hinzufügen .

Von der manSeite:

--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

Machen:

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

Wenn Sie die Fortschrittsaktualisierungen nicht möchten, können Sie natürlich einfach --partialFolgendes verwenden:

sudo rsync --partial -azvv /home/path/folder1/ /home/path/folder2
N2O
quelle
@Flimm nicht ganz richtig. Bei einer Unterbrechung (Netzwerk- oder Empfangsseite) wird bei Verwendung von --partial die Teildatei beibehalten UND bei Wiederaufnahme von rsync verwendet. Auf der Hilfeseite: "Mit der Option --partial wird rsync angewiesen, die Teildatei beizubehalten, wodurch <b> eine spätere Übertragung des Restes der Datei viel schneller </ b> erfolgen soll."
Gaoithe
2
@Flimm und @gaoithe, meine Antwort war nicht ganz richtig und definitiv nicht aktuell. Ich habe es aktualisiert, um Version 3 + von zu reflektieren rsync. Es ist wichtig zu betonen aber, dass --partialsie nicht selbst ein ausgefallenes Übertragung fortzusetzen. Siehe meine Antwort für Details :)
DanielSmedegaardBuus
2
@DanielSmedegaardBuus Ich habe es versucht und das -Preicht in meinem Fall. Versionen: Client hat 3.1.0 und Server hat 3.1.1. Ich habe die Übertragung einer einzelnen großen Datei mit Strg-C unterbrochen. Ich vermisse etwas.
Guettli
Warum vv? dh v2 mal benutzt?
Mrgloom
Wo rsync einen Teil der Datei mit speichern -azvvP?
Mrgloom
1

Ich glaube, Sie rufen die gewaltsam an rsyncund daher werden alle Daten heruntergeladen, wenn Sie sie erneut abrufen. Verwenden Sie die --progressOption, um nur die Dateien zu kopieren, die nicht kopiert wurden, und die --deleteOption, um alle Dateien zu löschen, wenn sie bereits kopiert wurden und jetzt nicht mehr 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, ob ich dieses Konzept falsch verstanden habe ...

Yadunandana
quelle
1
Können Sie bitte Ihre Antwort bearbeiten und erklären, was Ihr spezieller SSH-Aufruf bewirkt und warum Sie raten, dies zu tun?
Fabien
2
@Fabien Er weist rsync an, zwei ssh-Optionen festzulegen (rsync verwendet ssh, um eine Verbindung herzustellen). Der zweite Befehl weist ssh an, keine Bestätigung anzufordern, wenn der Host, zu dem er eine Verbindung herstellt, nicht bereits bekannt ist (indem er in der Datei "known hosts" vorhanden ist). Der erste Befehl weist ssh an, die Standarddatei für bekannte Hosts (~ / .ssh / known_hosts) nicht zu verwenden. Er benutzt stattdessen / dev / null, was natürlich immer leer ist, und da ssh dann den Host dort nicht finden würde, würde es normalerweise zur Bestätigung auffordern, daher Option zwei. Beim Verbinden schreibt ssh den jetzt bekannten Host nach / dev / null und vergisst ihn sofort :)
DanielSmedegaardBuus
1
... aber Sie haben sich wahrscheinlich gefragt, welche Auswirkungen dies auf den Rsync-Vorgang selbst hat. Die Antwort ist keine. Es wird lediglich der Host, mit dem Sie eine Verbindung herstellen, nicht zu Ihrer Datei mit bekannten SSH-Hosts hinzugefügt. Vielleicht ist er ein Systemadministrator, der sich oft mit einer großen Anzahl neuer Server, temporärer Systeme oder so weiter verbindet. Ich weiß nicht :)
DanielSmedegaardBuus
4
"benutze die --progress Option um nur die Dateien zu kopieren, die nicht kopiert wurden" Was?
moi
1
Hier gibt es ein paar Fehler; Eins ist sehr ernst: --deleteLöscht Dateien im Ziel , die in der Quelle nicht vorhanden sind. Das weniger ernste ist, dass --progresses nicht ändert, wie Dinge kopiert werden; Sie erhalten lediglich einen Fortschrittsbericht zu jeder kopierten Datei. (Ich habe den schwerwiegenden Fehler behoben und durch ersetzt --remove-source-files.)
Paul d'Aoust,
1

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
NeverEndingQueue
quelle
1

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

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

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

lazysoundsystem
quelle