Frage Verwenden von DD zum Klonen von Datenträgern


Es gab eine Reihe von Fragen zu Disk Cloning Tools und dd wurde mindestens einmal vorgeschlagen. Ich habe bereits darüber nachgedacht dd ich selbst, hauptsächlich wegen der Benutzerfreundlichkeit, und dass es auf fast allen bootfähigen Linux-Distributionen verfügbar ist.

Was ist der beste Weg zu verwenden? dd zum Klonen einer Festplatte? Ich habe eine schnelle Google-Suche durchgeführt, und das erste Ergebnis war offensichtlich misslungener Versuch. Muss ich nach dem Gebrauch etwas tun? dd, d. h. gibt es etwas, das NICHT gelesen werden kann dd?


176
2018-05-05 18:21


Ursprung


Ich bin mir bewusst, wie dd funktioniert, meine Frage war mehr in Richtung auf alle bekannten Probleme im Zusammenhang mit dd beim Klonen von Festplatten (wie durch den Link beschrieben), vielleicht war das nicht sehr klar. Was seine Antwort enthält und deins ist nicht "Ich hatte noch nie Probleme damit". Ich habe deine Antwort auch aufgefrischt, da du auf jeden Fall einige interessante Punkte präsentierst (ich mag den, der über keine Fortschrittsanzeige spricht). - falstro
Sieht so aus, als hättest du den Spolsky Bump bekommen: joelonsoftware.com/items/2009/05/29.html - Kyle Cronin
habe das hier nicht gesehen, als ich eine ähnliche Frage an Superuser gestellt (und beantwortet) habe - superuser.com/questions/11453/ ... - warren
Es ist ironisch, dass Joel sich mit der Frage als ein gutes Beispiel für Serverfehler befasste, obwohl keine der Antworten gut war. Es gab keine Antwort unter 25 (ohne Kommentare) mit dem Recht dd Optionen zum Überspringen fehlerhafter Blöcke - was beim Klonen von Disks für die Wiederherstellung wichtig ist. Ich habe eine bessere Antwort hinzugefügt, die Festplatten mit fehlerhaften Blöcken klonen kann: dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror - Sam Watkins
Ich denke, dd Restore könnte "scheitern", wenn über Laufwerksgeometrie abhängige Dateisysteme sprechen und die Wiederherstellung auf nicht identischen Festplatten erfolgt? Ich habe einige Fehler bei der Wiederherstellung von dd festgestellt, und ich denke, das war das Problem in meinem Fall. - Marco


Antworten:


dd ist sicherlich das beste Klonwerkzeug, es erstellt ein 100% Replikat, indem einfach der folgende Befehl verwendet wird. Ich hatte noch nie Probleme damit.

dd if=/dev/sda of=/dev/sdb bs=32M

Beachten Sie, dass Sie beim Klonen jedes Bytes dieses nicht auf einem Laufwerk oder einer Partition verwenden sollten. Besonders Anwendungen wie Datenbanken können damit nicht gut umgehen und Sie könnten mit beschädigten Daten enden.


152
2018-05-05 18:31



Solange / dev / sdb mindestens so groß ist wie / dev / sda ... - Eddie
fügen Sie ein "bs = 100M conv = notrunc" hinzu und es ist viel schneller in meiner Erfahrung. - Tim Williscroft
sei nur vorsichtig mit den Buchstaben 'ich' und 'o' ... - bandi
Niemand scheint diesen Trick zu kennen ... dd ist ein asymmetrisches Kopierprogramm, dh es wird zuerst gelesen, dann geschrieben und dann zurück. Sie können dd an sich selbst piped und es zwingen, die Kopie symmetrisch durchzuführen, wie folgt: dd if=/dev/sda | dd of=/dev/sdb. In meinen Tests hat die Ausführung des Befehls ohne die Pipe einen Durchsatz von ~ 112kb / s ergeben. Mit dem Rohr habe ich ~ 235kb / s. Ich habe nie Probleme mit dieser Methode erfahren. Viel Glück! - Mistiry
@Mistiry, das ist nicht die Bedeutung des Wortes symmetrisch. - psusi


Um Platz zu sparen, können Sie die von dd mit gzip erzeugten Daten komprimieren, z. B .:

dd if=/dev/hdb | gzip -c  > /image.img

Sie können Ihre Festplatte wiederherstellen mit:

gunzip -c /image.img.gz | dd of=/dev/hdb

Um noch mehr Speicherplatz zu sparen, defragmentieren Sie das Laufwerk / die Partition, die Sie zuvor klonen möchten (falls zutreffend), und löschen Sie dann den verbleibenden ungenutzten Speicherplatz aus, um das Komprimieren von gzip zu vereinfachen:

mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero

Warten Sie ein wenig, dd wird schließlich mit einer "Datenträger voll" Nachricht fehlschlagen, dann:

rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c  > /image.img

Außerdem können Sie einen dd-Prozess im Hintergrund ausführen, um den Status zu melden, indem Sie ihm ein Signal mit dem Befehl kill senden, z. B .:

dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234

Überprüfen Sie Ihr System - der obige Befehl ist für Linux, OSX und BSD dd Befehle unterscheiden sich in den Signalen, die sie akzeptieren (OSX verwendet SIGINFO - Sie können drücken Strg+T um den Status zu melden).


104
2018-05-06 22:47



Funktioniert das auch mit "modernen" fs wie BTRFS, NILFS, [was immer du dir erträumen kannst]? - Steve Schnepp
DD funktioniert auf Block Devices, eine Abstraktionsebene unterhalb des Dateisystems, also sollte es ja sein. Ich habe es jedoch nicht wirklich versucht. Hmm, NILFS sieht interessant aus, das muss ich mir ansehen. - David Hicks
+1 für die kill -SIGUSR1 %1, und der OSX dd Befehl akzeptiert glücklich SIGUSR1 ... super nützlich, danke! - stuartc
+1 für Kill -SIGUSR1 1234 Ich habe danach gesucht. - hot2use
Sollte es sein: dd if=/dev/hdb | gzip -c > /image.img.gz ? - Mike Causer


VORSICHT: dd'ing ein Live-Dateisystem kann Dateien beschädigen. Der Grund ist einfach, es hat kein Verständnis für die Dateisystemaktivität, die möglicherweise stattfindet, und unternimmt keinen Versuch, es zu mildern. Wenn ein Schreibvorgang teilweise läuft, erhalten Sie einen Teilschreibvorgang. Dies ist normalerweise nicht gut für Dinge und im Allgemeinen fatal für Datenbanken. Außerdem, wenn Sie den Tippfehler vermasseln ob und von Parameter, wehe dir. In den meisten Fällen, rsync ist ein ebenso effektives Werkzeug, das nach dem Erscheinen von Multitaskingund bietet konsistente Ansichten einzelner Dateien.

DD sollte jedoch den Bitstatus eines nicht bereitgestellten Laufwerks genau erfassen. Bootloader, llvm-Volumes, Partitions-UUIDs und -Etiketten usw. Stellen Sie sicher, dass Sie ein Laufwerk haben, das Bit für Bit das Ziel-Laufwerk spiegeln kann.


37
2018-05-05 20:20



Ich vermute, dass sync ist nicht die Antwort auf Dateikorruptionsprobleme. Was passiert wenn ein Deamon oder etwas mehr Dateien schreibt nach dem sync, während der dd Operation? - Deleted
Es ist eine gute Idee, das Laufwerk zuerst zu entfernen (oder erneut als schreibgeschützt zu installieren), aber das ist nicht immer möglich - Alex Bolotov
In diesem Fall verwenden Sie rsync und lassen Sie es Dateihandle Magie, um eine konsistente Datei zu erhalten und lassen Sie Copy On Write Semantik die eingehenden Schreibvorgänge behandeln. - jldugger
Ich möchte hinzufügen, dass das Ausführen von dd auf einem gemounteten Dateisystem die Dateien auf dem gemounteten Dateisystem NICHT KORRUPTIEREN wird, aber was hier gemeint ist, ist, dass die Kopie des Dateisystems notwendigerweise in einem bekannt guten Zustand sein wird. - 3molo
Verwenden rsync wird dafür sorgen, dass die interne Daten im Ziel Dateisystem ist konsistent. Es wird nicht Stellen Sie sicher, dass die Daten in den Dateien konsistent sind. Dazu müssen Sie die Dateien sperren und alle Programme, die in die Dateien schreiben, müssen diese Sperren berücksichtigen. - Martin Geisler


Wenn Sie dd zum Klonen eines Laufwerks verwenden, das fehlerhafte Sektoren enthalten kann, verwenden Sie "conv = noerror, sync", um sicherzustellen, dass es nicht stoppt, wenn ein Fehler auftritt, und füllt den / die fehlenden Sektor (e) mit Nullbytes aus. Dies ist normalerweise der erste Schritt, den ich unternehme, wenn ich versuche, von einer fehlgeschlagenen oder fehlgeschlagenen Platte wiederherzustellen - erhalte eine Kopie, bevor ich irgendwelche Wiederherstellungsversuche unternehme, und mache dann eine Wiederherstellung auf der guten (geklonten) Platte. Ich überlasse es dem Wiederherstellungswerkzeug, mit leeren Sektoren umzugehen, die nicht kopiert werden konnten.

Außerdem können Sie feststellen, dass die Geschwindigkeit von dd durch die Einstellung von bs (Blockgröße) beeinflusst werden kann. Ich versuche normalerweise bs = 32768, aber vielleicht möchten Sie es auf Ihren eigenen Systemen testen, um zu sehen, was am schnellsten für Sie funktioniert. (Dies setzt voraus, dass Sie aus einem anderen Grund keine bestimmte Blockgröße verwenden müssen, z. B. wenn Sie auf ein Band schreiben.)


26
2018-05-07 02:42



Wenn Sie eine Festplatte mit fehlerhaften Sektoren haben, sollten Sie "ddrescue" anstelle von dd verwenden. Es ist viel effizienter und hat eine viel bessere Chance, mehr Daten zu gewinnen. (Nicht mit dd_rescue verwechseln, was nicht so gut ist) - davr
sollte keine große Blockgröße verwenden, wenn fehlerhafte Blöcke übersprungen werden sollen, oder es wird zu viel überspringen. 4096 ist groß genug. - Sam Watkins


Um einen Datenträger zu klonen, müssen Sie nur die Eingabe und Ausgabe nach dd angeben:

dd if=/dev/hdb of=/image.img

Stellen Sie sicher, dass Sie die richtigen Berechtigungen zum direkten Lesen von / dev / hdb haben (ich würde empfehlen, als root zu laufen) und / dev / hdb ist nicht montiert (Sie möchten nicht kopieren, während die Festplatte geändert wird - die Installation als schreibgeschützt ist ebenfalls akzeptabel). Sobald dies abgeschlossen ist, wird image.img ein Byte-für-Byte-Klon der gesamten Festplatte sein.

Die Verwendung von dd zum Klonen von Festplatten hat einige Nachteile. Zuerst kopiert dd Ihre gesamte Festplatte, sogar leeren Speicherplatz, und wenn sie auf einer großen Festplatte erstellt wird, kann dies zu einer extrem großen Bilddatei führen. Zweitens bietet dd absolut keine Fortschrittsanzeigen, was frustrierend sein kann, da die Kopie sehr lange dauert. Drittens, wenn Sie dieses Image auf andere Laufwerke kopieren (wiederum mit dd), müssen sie genauso groß oder größer als die Original-Festplatte sein, aber Sie können bis zu Ihnen keinen zusätzlichen Speicherplatz auf der Ziel-Festplatte verwenden Größe ändern Sie Ihre Partitionen.

Sie können auch eine direkte Disk-to-Disk-Kopie erstellen:

dd if=/dev/hdb of=/dev/hdc

Sie unterliegen jedoch immer noch den oben genannten Einschränkungen hinsichtlich des freien Speicherplatzes.

Soweit es um Probleme oder Fehler geht, leistet dd in den meisten Fällen hervorragende Arbeit. Vor einer Weile hatte ich jedoch eine Festplatte, die bald sterben würde, also habe ich versucht, dd zu kopieren, welche Informationen ich daraus hätte entfernen können, bevor es vollständig gestorben ist. Es wurde dann gelernt, dass dd Lesefehler nicht sehr gut behandelt - es gab mehrere Sektoren auf der Platte, die dd nicht lesen konnte, was dazu führte, dass dd aufgab und die Kopie stoppte. Zu der Zeit konnte ich keine Möglichkeit finden, dd trotz eines Lesefehlers weiterzumachen es erscheint als ob es diese Einstellung hätte), also habe ich ziemlich viel Zeit damit verbracht, das "Überspringen" und "Suchen" manuell festzulegen, um über die unlesbaren Abschnitte zu springen.

Ich habe einige Zeit damit verbracht, nach Lösungen für dieses Problem zu suchen (nachdem ich die Aufgabe abgeschlossen hatte) und ich fand ein Programm namens dreschen, die laut der Website funktioniert wie dd, aber liest weiter, auch wenn es einen Fehler auftritt. Ich habe das Programm nie wirklich benutzt, aber es ist eine Überlegung wert, besonders wenn die Platte, von der du kopierst, alt ist und schlechte Sektoren haben kann, selbst wenn das System gut aussieht.


17
2018-05-05 18:26



... dd liefert absolut keine Fortschrittsanzeigen ... - Nun, das ist nicht wahr - es gibt einen kniffligen Weg, um den Fortschritt zu zeigen - Sie müssen pid des dd-Prozesses ('ps -a | grep dd') herausfinden und dann das Signal USR1 an diesen Prozess senden - 'kill -USR1 < dd_pid_here> '(ohne <>), die dd dazu zwingt, Fortschrittsinformationen anzuzeigen. - Michal Bernhard
"Mehrere Sektoren auf der Festplatte, die dd nicht lesen konnte": Das denke ich conv=sync,noerror würde helfen. - Gauthier
Das conv=sync,noerror Optionen sind wichtig, sie erlauben es dd, fehlerhafte Blöcke zu überspringen und sie im Bild auf Null zu setzen, damit die Dinge richtig ausgerichtet sind. Stützen Sie auf die sehr wenigen Leute, die etwas darüber kommentierten. - Sam Watkins
GNU ddrescue bietet Fortschrittsanzeige ohne spezielle Optionen, und Sie können die Kopie stoppen und fortsetzen, wo Sie aufgehört haben. - endolith
Ein weniger kniffliger Weg, um mit dd Fortschritte zu erzielen, ist das Hinzufügen der Option status=progress - James


Wenn das Quelllaufwerk überhaupt beschädigt ist, werden Sie mehr Glück haben dd_rhelp mit dd_rescue (meine persönliche Vorliebe) oder GNU ddrescue.

Der Grund dafür ist, dass bei Lesefehlern dd versucht weiter und versucht und versucht - möglicherweise warten lange Zeit für die Zeitüberschreitungen auftreten. dd_rescue macht intelligente Dinge wie das Lesen bis zu einem Fehler, dann einen Punkt weiter auf der Festplatte und liest rückwärts bis zum letzten Fehler, und dd_rhelp ist im Grunde ein dd_rescueSession Manager - clever starten und wieder aufnehmen dd_rescue Läuft, um es wieder schneller zu machen.

Das Endergebnis von dd_rhelp ist maximale Daten in kürzester Zeit wiederhergestellt. Wenn du gehst dd_rhelp Laufen, am Ende macht es genau die gleiche Arbeit wie dd in der gleichen Zeit. jedoch, wenn dd Englisch: www.openbsd.dk/faq/pf//queueing.html Fehler beim Lesen von 100 Byte auf Ihrer 100Gb - Festplatte, Sie müssen lange warten, bis die anderen 9,999,900 Byte * wiederhergestellt sind dd_rhelp+dd_rescue würde den Großteil der Daten viel schneller wiederherstellen.


11
2018-05-31 02:12



Einige helfen bei der Auswahl zwischen dd_rescue und ddrescue: askubuntu.com/a/211579/50450 - Johann


Der Quelldatenträger darf keine angehängten Dateisysteme haben. Als Benutzer, der das Block-Gerät lesen kann (root works), führe 'dd if = / dev / sda ....'

Nun, eines der schönen Dinge hier ist, dass Sie einen Strom von Bytes erstellen ... und Sie können eine Menge damit machen: komprimieren Sie es, senden Sie es über das Netzwerk, zerstückeln Sie es in kleinere Blobs, etc.

Zum Beispiel:

dd if=/dev/sda | ssh user@backupserver "cat > backup.img"

Aber stärker:

dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"

Das obige Kopiert ein komprimiertes Bild der Quellfestplatte auf ein entferntes System, wo es es in nummerierten 2G-Blöcken unter Verwendung des Namens des Quellhosts speichert, während Sie über den Fortschritt auf dem Laufenden gehalten werden.

Beachten Sie, dass abhängig von der Größe der Festplatte, der Geschwindigkeit der CPU bei der Quelle, der Geschwindigkeit der CPU am Ziel, der Geschwindigkeit des Netzwerks usw. Sie die Komprimierung überspringen oder die Komprimierung auf der entfernten Seite ausführen oder die Komprimierung von ssh aktivieren möchten.


7
2018-05-29 19:23



+1 Piping durch gzip kann viel Zeit und Bandbreite sparen! - M. Dudley
Ich sollte auch beachten, dass das Hinzufügen von 'bs = 1M' zum dd-Befehl normalerweise die Geschwindigkeit stark verbessert. - retracile