Setzen Sie den unterbrochenen Kopiervorgang fort

8

Wie kann ich den Vorgang des Kopierens von Dateien $Ain einen Sicherungsspeicherort $B, der mit pv "$A" > "$B"oder durchgeführt wurde, sicher und zuverlässig fortsetzen cat "$A" > "$B"?

( $ANehmen wir an, die Datei ist sehr groß, z. B. eine LVM2-Snapshot-Datei.)

Ist es erreichbar mit dd?

Bevorzugt: Bash- oder Python-Lösungen (vorzugsweise Python3).

Beispielszenario: pv "$A" > "$B"nach 90% Kopieren unterbrochen. Wie kann ich es fortsetzen, um den Kopiervorgang zu beenden, aber nicht die gesamte Arbeit erneut zu wiederholen?

Grzegorz Wierzowiecki
quelle
Sie möchten möglicherweise verwenden: unix.stackexchange.com/a/12538/9689 und unix.stackexchange.com/questions/32941/…
Grzegorz Wierzowiecki

Antworten:

12

Ja, Sie können dd verwenden, um die Blöcke zu überspringen.

A="file1"
B="file2"

BLOCKSIZE=512  # default bs for dd

size_b=$(stat -c "%s" "$B")
skip_blocks=$((size_b / BLOCKSIZE))

dd if="$A" of="$B" skip=$skip_blocks seek=$skip_blocks bs=$BLOCKSIZE

Die wichtigen Parameter hier sind skipebenso wie seek:

  • skip: BLOCKS ibs-große Blöcke zu Beginn der Eingabe überspringen
  • seek: Überspringen Sie BLOCKS - Blöcke mit Obs-Größe zu Beginn der Ausgabe
Ulrich Dangel
quelle
10

Sie wollen rsync:

rsync -a --append "$A" "$B"
Teddy
quelle
1
Ich möchte rsync nicht verwenden. Nehmen wir an, A ist 1 TB groß und ich habe bereits 900 GB Daten kopiert und es sind noch 100 GB übrig. rsync würde ganze 1 TB lesen, während ich nur die letzten 100G brauche! -> Lesen Sie zuerst über den verwendeten Algorithmus: en.wikipedia.org/wiki/Rsync#Algorithm
Grzegorz Wierzowiecki
1
@GrzegorzWierzowiecki Ich denke du liegst falsch. Sofern meine Erfahrung mit rsync nicht völlig falsch ist, liest rsync , was es lesen muss, um zu überprüfen, ob die Ausgabe richtig ist, bis es einen Punkt erreicht, an dem Unterschiede auftreten, und setzt dann an diesem markierten Punkt fort. Dies scheint ziemlich genau das zu sein, was benötigt wird.
Killermist
1
Damit dies funktioniert, müssen Sie auch hinzufügen --append.
Thor
Vielen Dank an @Thor für die Betonung dieser Option. Wie ich noch einmal überprüft habe, scheint sich das Verhalten von --appendseit Version 3.0.0 geändert zu haben. Könnten Sie mir versichern, wenn Sie derzeit --appendbereits kopierte Teile ignorieren, während Sie --append-verifydas gesamte A für die Prüfsummenprüfung lesen? (vor Version 3.0.0. --appendbenahm sich wie --append-verify-> das ist der Grund für Missverständnisse)
Grzegorz Wierzowiecki
5
@GrzegorzWierzowiecki: Ich hatte diese Änderung nicht bemerkt. Ich habe es gerade getestet und in der Tat --appendblind an die Datei angehängt. --append-verifymacht das gleiche, führt aber am Ende Prüfsummen aus, wenn die Prüfsummen nicht übereinstimmen, rsyncscheint eine neue Kopie zu erstellen.
Thor
3

Haben Sie es dd skipmit einem Offset der tatsächlichen Dateigröße von B versucht (unabhängig von der Partitionsblockgröße)?

Das würde dir den fehlenden Teil bringen. An diesem Punkt könnten Sie sie direkt catzusammen in eine neue Datei mit cat "$B" "$A2" >> "$C"; #mv "$C" "$B"(wo $Cist natürlich der fehlende Teil auf einem Pfad mit genügend Speicherplatz).

catfunktioniert auch gut zum Verketten von Binärdateien. In diesem Fall verfügen Sie nicht über mehrere Dateikopfzeilen, die einfache Zusammenführungen mit Skripten verhindern würden. Es besteht die Möglichkeit, dass das Ende von $Bbeschädigt ist, aber in diesem Fall können Sie es abkürzen und $Aim ersten dd-Schritt mehr davon erneut lesen .

lynxlynxlynx
quelle