Klonen Sie die gesamte Partition oder Festplatte in eine Sparse-Datei


35

Ich mag es, eine ganze Partition oder eine ganze Festplatte auf eine größere externe Festplatte zu klonen, aber ich mag es, eine Sparse-Datei zu erstellen. Ich verwende es oft ddzum Klonen, aber es unterstützt keine spärlichen Dateien. Als Workaround habe ich Folgendes verwendet:

cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw

Dies ist jedoch für meinen Geschmack etwas zu knifflig und erlaubt mir nicht, den Vorgang fortzusetzen, wenn der Vorgang abgebrochen wird. Es ist lustig, dass es ein NTFS-Tool für dieses ( ntfsclone) gibt, aber kein solches Tool für die nativen Dateisysteme von Linux (EXT2-4).

Gibt es dafür ein besseres Tool, z. B. eine ddVariante mit geringer Unterstützung? Ich suche keine proprietäre Software für Festplatten-Backups, sondern möchte einfach eine spärliche Klon-Kopie erstellen, die ich bei Bedarf als Loop-Gerät einbinden kann.


7
+1 für die kreative Verwendung von cp, ist mir nie aufgefallen, dass Sie ein Disk-Image dünn kopieren könnten. Ich habe sie immer nur komprimiert, wenn ich Platz sparen wollte. Warum ist das in einer Frage keine Antwort?
Caleb

Antworten:


21

Sie möchten dd_rescue.

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw

1
Groß! Das Handbuch sagt: "Wenn der Kopiervorgang vom Benutzer unterbrochen wird, ist es möglich, an einer beliebigen Stelle später fortzufahren." und "-a spArse-Datei schreiben (Standard = nein)". Genau das was ich will! Vielen Dank!
Martin Scharrer

3
Auf der Suche nach dd_rescueOnline habe ich herausgefunden, dass es auch ein anderes Tool namens gibtddrescue (ohne Unterstrich) gibt, das unabhängig davon entwickelt wurde, dd_rescueaber im Grunde dasselbe zu tun scheint. Ich erwähne das hier nur als allgemeines FYI.
Martin Scharrer

Ja, dd_rescueund das ddrescueist nicht dasselbe. Theoretisch machen sie den gleichen Job, aber im Allgemeinen hatte ich mit dem älteren / Original mehr Glück dd_rescue.
Steven Pritchard

1
Falls sich jemand wundert, können Sie die Kopie jederzeit mit Strg-C anhalten. Es zeigt Ihnen Ihre aktuelle Position und Sie können diesen Wert zum Neustart verwenden, indem Sie -sund die Position zum ursprünglichen Befehl hinzufügen . (So ​​würde es aussehen dd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw.)
Steven Pritchard

1
@ Seven Pritchard: Keine Notwendigkeit, sich an die Position zu erinnern. Geben Sie einen dritten Dateinamen an, bei dem es sich um die Protokolldatei handelt. Beim Neustart wird dieser Name gelesen und an der Stelle abgelegt, an der er aufgehört hat.
Tanith Rosenbaum

20

Der Vollständigkeit halber die Aufforderung zur Rettung . Mit der Option --sparseoder -Skann das Ziel spärlich geschrieben werden:

$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw

Oder mit langer Option:

$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw

Oder wenn Sie MiBs bevorzugen :

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw

Um die Rettung zu unterbrechen und fortzusetzen, können Sie auch eine Protokolldatei verwenden:

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log

Beachten Sie, dass GNU ddrescueund dd_rescueverschiedene Programme sind. GNU ddrescuescheint jedoch weiter verbreitet zu sein. Zum Beispiel ist es bereits mit verpackt GRML gepackt .


Muss das Image beim Wiederherstellen einer speziellen Behandlung unterzogen werden? Können Sie den Befehl zum Wiederherstellen einer ddrescue-Datei bereitstellen?
user12439

In der Theorie ist das Speichermedium Sie für die Rettung verwenden soll zuverlässiger sein, so können Sie in der Regel nur zu schreiben , um die Ersatzplatte verwenden dd: dd if=sda1.raw of=/dev/sdb1. Um ddrescue für die Wiederherstellung zu verwenden, ändern Sie einfach die Quelle / das Ziel, das Sie für die Wiederherstellung verwendet haben, in die neue Quelle / das neue Ziel, vorzugsweise mit einer neuen Protokolldatei. Wenn möglich (oft nicht), können Sie natürlich ddrescue verwenden, um Daten direkt von der fehlerhaften Quelldiskette auf eine Ersatzdiskette zu kopieren.
ZaTricky

3

2007 wurde ein Patch für die Unterstützung spärlicher Dateien in GNU dd angeboten, der jedoch offenbar nicht in coreutils (zumindest nicht ab 8.4) aufgenommen wurde. Ich bezweifle, dass sich dd seitdem zu sehr geändert hat, der Patch könnte ohne viel Arbeit gegen die aktuelle Version angewendet werden.

Ich bin auch wirklich beeindruckt von der kreativen Verwendung von cpin Ihrer Frage, und es brachte mich auf die Spur, es zu verwenden, um die Wiederaufnahme zu vollenden (hier von ~ 80 Millionen in die Quelle):

cp --sparse=always \
  <(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
  | dd bs=8M seek=10 of=/mount/external/backup/sda1.raw

Edit: kratz das. Die zweite ddMöglichkeit wäre natürlich die Suche nach der falschen Position in der Ausgabedatei, da sie nicht die gleiche Länge wie die Eingabe hat.


1
Wie bei der Antwort von bhinesley ist es am besten, den Fortschritt von dd zu protokollieren, um eine genaue Wiederaufnahme zu erreichen. Wenn Sie diesen Ansatz sowohl für die erste Ausführung als auch für die Wiederaufnahme verwenden und beide parallelen DDs unabhängig voneinander protokollieren würden, könnten Sie wissen, wie weit in der Ausgabe gesucht werden soll. Wenn ich Zeit habe, werde ich versuchen, das aufzuarbeiten.
Eli Heady

2
Danke für den Link zum Patch. Ich habe angefangen, mir Gedanken darüber zu machen, wie man so etwas selbst programmiert :-) Sparse-Dateien können nicht gepippt werden, so dass Ihr Code nicht funktioniert.
Martin Scharrer

Ja, das habe ich gerade selbst entdeckt. Na ja, es hat Spaß gemacht, verrückte neue Verwendungen zu finden cp- danke!
Eli Heady

1
dd commit at 2012: git.savannah.gnu.org/cgit/coreutils.git/commit/… "dd: Unterstützung für die Option conv = sparse hinzufügen" ("(iwrite): Konvertiert einen Schreibvorgang eines NUL-Blocks in einen Suchvorgang auf
anfrage

1

Füge nur meine 2 Cent hinzu. Eine andere Möglichkeit, eine Sparse-Datei von einer Raw-Festplatte zu erstellen, besteht darin, mit qemu-img Folgendes zu verwenden:

qemu-img convert -f raw /dev/sda /tmp/sda.raw

Sie können dies auch auf einer einzelnen Partition verwenden. Sie haben auch die Möglichkeit, die Raw-Festplatte / Partition in ein anderes Format zu konvertieren, das von qemu-img unterstützt wird (QCOW2, VHD [x], vmdk usw.).


1

Eine andere Option ist rsync . Beispielsweise:

rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw

Erläuterung:

  • -S/ --sparseum spärliche Blöcke beim Schreiben zu überspringen
  • -P/ --partial --progressum den Fortschritt anzuzeigen und teilweise übertragene Dateien zu behalten
  • --copy-devices um Geräteinhalte zu kopieren

Sie können hinzufügen --append, um eine unterbrochene Kopie fortzusetzen (oder --append-verifyum die Prüfsumme für neue und alte Datenübereinstimmungen zu bestätigen).

Edit : Ich habe gerade festgestellt, dass copy-devices.diff in Betracht gezogen wird und möglicherweise auf vielen Systemen nicht vorhanden ist (obwohl es von Fedora , Ubuntu , Debian und anderen enthalten ist)


0

Hinweis: Dies funktioniert aus den in den Kommentaren beschriebenen Gründen nicht. Ich lasse es hier als Referenz.

Überwachen Sie die Statistik von dd mit kill -USR1:

$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
    /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Fortsetzen mit Überspringen / Suchen:

$ i_bytes= # get from the last dd statistic
$ o_bytes=`du -b /mount/external/backup/sda1.raw | cut -f 1`   
$ cp --sparse=always <(dd if=/dev/urandom bs=8M skip=$i_bytes \
    seek=$o_bytes) /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Ohne $ i_bytes wäre die Fortsetzung schwieriger. Es ist wahrscheinlich am einfachsten, die dd-Statistiken in einer Datei zu protokollieren, falls der Computer abstürzt oder was auch immer.


Der zweite cpBefehl überschreibt einfach die vorhandene Datei, nicht wahr? Ich kenne die skipund andere Möglichkeiten von dd. Das Problem ist der cpTeil.
Martin Scharrer

Hm, ja, du hast recht.
Bhinesley


0

Warum nicht einfach:

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.