Verwenden von DD zum Klonen von Datenträgern


182

Es gab eine Reihe von Fragen zu Tools zum Klonen von Datenträgern, die ddmindestens einmal gestellt wurden. Ich habe bereits in Betracht gezogen, ddmich selbst zu verwenden, vor allem, weil es einfach zu bedienen ist und auf so gut wie allen bootfähigen Linux-Distributionen verfügbar ist.

Was ist der beste Weg, um ddeine Festplatte zu klonen? Ich habe eine schnelle Google-Suche durchgeführt und das erste Ergebnis war ein offensichtlich fehlgeschlagener Versuch . Muss ich nach der Verwendung irgendetwas tun dd, dh gibt es etwas, das mit NICHT gelesen werden kann dd?


Mir ist bewusst, wie dd funktioniert. Meine Frage richtete sich eher nach bekannten Problemen im Zusammenhang mit dd beim Klonen von Datenträgern (wie im Link beschrieben). Vielleicht war dies nicht ganz klar. Was seine Antwort enthält und deins nicht ist "Ich hatte noch nie Probleme damit". Ich habe auch Ihre Antwort positiv bewertet, da Sie auf jeden Fall einige interessante Punkte vorgestellt haben (ich mag den, der keine Fortschrittsanzeige enthält).
Falstro

1
Sieht so aus, als hättest du den Spolsky Bump: joelonsoftware.com/items/2009/05/29.html
Kyle Cronin

Das habe ich hier nicht gesehen, als ich eine ähnliche Frage zu superuser - superuser.com/questions/11453/…
warren

3
Es ist ironisch, dass Joel die Frage als gutes Beispiel für einen Serverfehler ansprach, obwohl keine der Antworten gut war. Es gab keine einzige Antwort unter 25 (ohne Kommentare) mit den richtigen ddOptionen zum Überspringen fehlerhafter Blöcke - was beim Klonen von Datenträgern für die Wiederherstellung unerlässlich ist. Ich habe eine bessere Antwort hinzugefügt, mit der Festplatten mit fehlerhaften Blöcken geklont werden können:dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
Sam Watkins,

Ich denke, dd restore könnte "fehlschlagen", wenn es sich um von der Laufwerksgeometrie abhängige Dateisysteme handelt und die Wiederherstellung auf nicht identischen Festplatten durchgeführt wird. Bei der Wiederherstellung von dd sind einige Fehler aufgetreten, und ich glaube, dies war das Problem in meinem Fall.
Marco

Antworten:


160

dd ist mit Sicherheit das beste Klon-Tool. Mit dem folgenden Befehl wird eine 100% ige Replik erstellt. 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, die gerade verwendet wird. Insbesondere Anwendungen wie Datenbanken kommen damit nicht sehr gut zurecht und es kann vorkommen, dass Sie fehlerhafte Daten erhalten.


12
Natürlich, solange / dev / sdb mindestens so groß ist wie / dev / sda ...
Eddie

22
Füge ein "bs = 100M conv = notrunc" hinzu und es ist meiner Erfahrung nach viel schneller.
Tim Williscroft

127
Seien Sie nur sehr vorsichtig mit den Buchstaben "i" und "o" ...
Bandi

17
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 über die Pipeline dd selbst und zwingen sie die Kopie symmetrisch auszuführen, wie folgt aus : dd if=/dev/sda | dd of=/dev/sdb. In meinen Tests ergab die Ausführung des Befehls ohne Pipe einen Durchsatz von ~ 112 kb / s. Mit der Pipe habe ich ~ 235kb / s. Ich habe noch nie Probleme mit dieser Methode erlebt. Viel Glück!
Mistiry

13
@ Mistiry, das ist nicht die Bedeutung des Wortes symmetrisch.
Psusi

113

Um Platz zu sparen, können Sie mit gzip von dd erzeugte Daten komprimieren, zB:

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 klonen möchten (falls zutreffend), und löschen Sie dann den gesamten nicht verwendeten Speicherplatz auf Null, um die Komprimierung von gzip zu vereinfachen:

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

Warten Sie ein bisschen, dd schlägt irgendwann mit der Meldung "Festplatte voll" fehl. Dann:

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

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

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

Überprüfen Sie Ihr System - der obige Befehl gilt für Linux-, OSX- und BSD-Befehle. Dd unterscheidet sich in den von ihnen akzeptierten Signalen (OSX verwendet SIGINFO- Sie können Ctrl+ drücken T, um den Status zu melden).


2
Funktioniert das auch mit "modernen" Fs wie BTRFS, NILFS, [wovon du träumen kannst]?
Steve Schnepp

DD funktioniert auf Blockgeräten, eine Abstraktionsebene, die niedriger ist als das Dateisystem, also sollte dies der Fall sein. Ich habe es aber noch nicht ausprobiert. Hmm, NILFS sieht interessant aus, das muss ich mir ansehen.
David Hicks

4
+1 für kill -SIGUSR1 %1, und der OSX-Befehl dd akzeptiert gerne SIGUSR1 ... super nützlich, danke!
Stuart

1
+1 dafür habe Kill -SIGUSR1 1234ich gesucht.
hot2use

2
Sollte es sein: dd if=/dev/hdb | gzip -c > /image.img.gz?
Mike Causer

37

VORSICHT : dd'ing ein Live - Dateisystem können beschädigte Dateien. Der Grund ist einfach, es hat kein Verständnis für die Dateisystemaktivität, die möglicherweise abläuft, und es wird auch nicht versucht, diese zu mindern. Wenn ein Schreibvorgang teilweise ausgeführt wird, erhalten Sie einen teilweisen Schreibvorgang. Dies ist normalerweise nicht gut für Dinge und im Allgemeinen für Datenbanken tödlich. Darüber hinaus, wenn Sie die Tippfehler anfällig, wenn und von Parametern vermasseln, wehe Ihnen. In den meisten Fällen ist rsync ein ebenso effektives Tool, das nach dem Aufkommen von Multitasking geschrieben wurde und konsistente Ansichten einzelner Dateien bietet.

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


7
Ich vermute, dass dies syncnicht die Antwort auf Probleme mit der Dateibeschädigung ist. Was passiert, wenn ein Deamon oder etwas mehr Dateien syncwährend der ddOperation schreibt ?
Gelöscht

5
Es ist eine gute Idee, die Bereitstellung des Laufwerks zuerst aufzuheben (oder als schreibgeschütztes Laufwerk erneut bereitzustellen), aber es ist nicht immer möglich
Alex Bolotov,

1
In diesem Fall verwenden Sie rsync und lassen es Dateihandhabungsmagie ausführen, um eine konsistente Datei zu erhalten, und lassen die Semantik von Copy On Write die eingehenden Schreibvorgänge verarbeiten.
Jldugger

4
Ich möchte hinzufügen, dass das Ausführen von dd auf einem gemounteten Dateisystem die Dateien auf dem gemounteten Dateisystem NICHT KORRUPT. Hiermit ist jedoch gemeint, dass sich die Kopie des Dateisystems notwendigerweise in einem als funktionierend bekannten Zustand befindet.
3molo

1
Durch rsyncdie Verwendung von wird sichergestellt, dass die internen Daten im Zieldateisystem konsistent sind. Es wird nicht sichergestellt, dass die Daten in den Dateien konsistent sind - dazu müssten Sie die Dateien sperren und alle Programme, die in die Dateien schreiben, müssten diese Sperren respektieren.
Martin Geisler

26

Wenn Sie mit dd eine Festplatte klonen, die möglicherweise fehlerhafte Sektoren enthält, verwenden Sie "conv = noerror, sync", um sicherzustellen, dass sie nicht anhält, wenn ein Fehler auftritt, und die fehlenden Sektoren mit Null-Bytes ausfüllt. Dies ist normalerweise der erste Schritt, den ich unternehme, wenn ich versuche, eine Wiederherstellung von einem ausgefallenen oder fehlerhaften Datenträger durchzuführen. Holen Sie sich eine Kopie, bevor Sie Wiederherstellungsversuche durchführen, und führen Sie dann die Wiederherstellung auf dem fehlerfreien (geklonten) Datenträger durch. Ich überlasse es dem Wiederherstellungstool, mit leeren Sektoren umzugehen, die nicht kopiert werden konnten.

Möglicherweise wird auch die Geschwindigkeit von dd durch die Einstellung von bs (Blockgröße) beeinflusst. Normalerweise versuche ich es mit bs = 32768, aber vielleicht möchten Sie es auf Ihren eigenen Systemen testen, um zu sehen, was für Sie am schnellsten 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.)


13
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 wiederherzustellen. (Verwechseln Sie es nicht mit dd_rescue, was nicht so gut ist)
davr

3
Wenn Sie versuchen, fehlerhafte Blöcke zu überspringen, sollten Sie keine großen Blöcke verwenden, da sonst zu viele übersprungen werden. 4096 ist groß genug.
Sam Watkins

17

Um eine Festplatte zu klonen, müssen Sie nur die Ein- und Ausgabe für dd angeben:

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

Vergewissern Sie sich natürlich, dass Sie über die erforderlichen Berechtigungen verfügen, um direkt von / dev / hdb zu lesen (ich würde empfehlen, als root zu arbeiten), und dass / dev / hdb nicht eingehängt ist (Sie möchten nicht kopieren, solange sich die Festplatte befindet) geändert werden (auch das schreibgeschützte Mounten ist zulässig). Sobald dies abgeschlossen ist, wird image.img ein byteweiser Klon der gesamten Festplatte.

Es gibt ein paar Nachteile bei der Verwendung von dd zum Klonen von Festplatten. Erstens kopiert dd Ihre gesamte Festplatte, auch leeren Speicherplatz, und wenn dies auf einer großen Festplatte durchgeführt wird, kann dies zu einer extrem großen Image-Datei führen. Zweitens liefert dd absolut keine Fortschrittsanzeigen, was frustrierend sein kann, da das Kopieren sehr lange dauert. Drittens, wenn Sie dieses Image auf andere Laufwerke kopieren (erneut mit dd), müssen diese so groß oder größer sein als der ursprüngliche Datenträger, Sie können jedoch keinen zusätzlichen Speicherplatz auf dem Zieldatenträger verwenden, bis Sie dies tun Ändern Sie die Größe Ihrer Partitionen.

Sie können auch eine direkte Kopie von Festplatte zu Festplatte erstellen:

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

Sie unterliegen jedoch weiterhin den oben genannten Einschränkungen in Bezug auf den freien Speicherplatz.

Dd leistet in punkto problematik und fallstricke zum größten teil hervorragende leistungen. Vor einiger Zeit hatte ich jedoch eine Festplatte, die im Begriff war zu sterben. Deshalb habe ich dd verwendet, um zu versuchen, die Informationen zu kopieren, die ich daraus machen konnte, bevor sie vollständig starben. Es wurde dann festgestellt, dass dd mit Lesefehlern nicht sehr gut umgehen kann - es gab mehrere Sektoren auf der Festplatte, die dd nicht lesen konnte, was dazu führte, dass dd aufgab und die Kopie anhielt. Zu der Zeit konnte ich dd nicht anweisen, fortzufahren, obwohl ein Lesefehler aufgetreten ist (obwohl es so aussieht, als ob es diese Einstellung hat), so dass ich ziemlich viel Zeit damit verbrachte, das Überspringen manuell zu spezifizieren und zu versuchen, über das zu hüpfen unlesbare Abschnitte.

Ich habe einige Zeit damit verbracht, nach Lösungen für dieses Problem zu suchen (nachdem ich die Aufgabe abgeschlossen hatte), und ein Programm namens ddrescue gefunden , das laut Website wie dd funktioniert, aber auch dann weiterliest, wenn es auf einen Fehler stößt. Ich habe das Programm noch nie benutzt, aber es lohnt sich zu überlegen, insbesondere wenn die Festplatte, von der Sie kopieren, alt ist, was zu fehlerhaften Sektoren führen kann, auch wenn das System in Ordnung erscheint.


7
... dd liefert absolut keine Fortschrittsanzeigen ... - nun ja, das ist nicht wahr - es gibt eine knifflige Methode, um den Fortschritt zu zeigen - Sie müssen die PID des dd-Prozesses herausfinden ('ps -a | grep dd') und dann Sende das Signal USR1 an diesen Prozess - 'kill -USR1 <dd_pid_here>' (ohne <>), wodurch dd gezwungen wird, Fortschrittsinformationen anzuzeigen.
Michal Bernhard

4
"mehrere sektoren auf der festplatte, die dd nicht lesen konnte": Ich denke, das conv=sync,noerrorwürde helfen.
Gauthier

2
Die conv=sync,noerrorOptionen sind von wesentlicher Bedeutung. Sie ermöglichen es dd, fehlerhafte Blöcke zu überspringen und sie im Bild auf Null zu setzen, damit die Dinge richtig ausgerichtet sind. Props an die sehr wenigen Leute, die etwas dazu kommentiert haben.
Sam Watkins

1
GNU ddrescuebietet eine Fortschrittsanzeige ohne spezielle Optionen, und Sie können den Kopiervorgang anhalten und dort fortsetzen, wo Sie aufgehört haben.
Endolith

2
Eine weniger schwierige Möglichkeit, mit dd Fortschritte zu erzielen, ist das Hinzufügen der Optionstatus=progress
James

11

Wenn das Quelllaufwerk überhaupt beschädigt ist, haben Sie mehr Glück dd_rhelpmit dd_rescue(meiner persönlichen Präferenz) oder GNU ddrescue.

Der Grund dafür ist, dass bei Lesefehlern ddimmer wieder versucht wird und möglicherweise lange auf Timeouts gewartet wird. dd_rescueFührt intelligente Aktionen aus, wie das Lesen eines Fehlers, das Auswählen einer Stelle auf der Festplatte und das Zurücklesen des letzten Fehlers. Im dd_rhelpGrunde genommen handelt es sich dabei um einen dd_rescueSitzungsmanager, der die Ausführung geschickt startet und fortsetzt dd_rescue, um sie wieder zu beschleunigen.

Das Endergebnis von dd_rhelpist maximale Datenwiederherstellung in minimaler Zeit. Wenn Sie das Programm dd_rhelplaufen lassen, erledigt es am Ende genau die gleiche Aufgabe wie ddzur gleichen Zeit. Wenn jedoch ddLesefehler bei Byte 100 Ihrer 100-GB-Festplatte auftreten, müssen Sie lange warten, um die anderen 9.999.900 Byte * wiederherzustellen, während dd_rhelp+ dd_rescueden Großteil der Daten viel schneller wiederherstellen würde.


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

7

Die Quelldiskette darf keine gemounteten Dateisysteme enthalten. Führen Sie "dd if = / dev / sda ...." aus, wenn ein Benutzer das Block-Gerät lesen kann (root works).

Nun, eines der netten Dinge hier ist, dass Sie einen Strom von Bytes erstellen ... und Sie können viel damit anfangen: Komprimieren, über das Netzwerk senden, in kleinere Blobs aufteilen usw.

Zum Beispiel:

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

Aber mächtiger:

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

Mit dem obigen Befehl wird ein komprimiertes Image der Quellfestplatte auf ein Remote-System kopiert, wo es in nummerierten 2G-Blöcken unter Verwendung des Namens des Quellhosts gespeichert wird, während Sie über den Fortschritt auf dem Laufenden gehalten werden.

Beachten Sie, dass abhängig von der Festplattengröße, der Geschwindigkeit der CPU auf der Quelle, der Geschwindigkeit der CPU auf dem Ziel, der Geschwindigkeit des Netzwerks usw. Sie die Komprimierung möglicherweise überspringen oder die Komprimierung auf der Remote-Seite durchführen oder die SSH-Komprimierung aktivieren möchten.


+1 Piping durch gzip kann viel Zeit und Bandbreite sparen!
M. Dudley

Ich sollte auch beachten, dass das Hinzufügen von 'bs = 1M' zum Befehl dd normalerweise die Geschwindigkeit erheblich verbessert.
Rückzug

6

Um eine Festplatte zu klonen, müssen Sie nur die Ein- und Ausgabe für Folgendes angeben dd:

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

Vergewissern Sie sich natürlich, dass Sie über die richtigen Berechtigungen zum direkten Lesen verfügen /dev/hdb(ich würde empfehlen, als Root zu arbeiten) und dass diese Berechtigungen /dev/hdbnicht aktiviert sind (Sie möchten keine Kopien anfertigen, während die Festplatte gewechselt wird). Nach Abschluss hdb.imgwird ein byteweiser Klon der gesamten Festplatte erstellt.

Das ddKlonen von Datenträgern hat einige Nachteile . Erstens ddwird die gesamte Festplatte kopiert, auch der leere Speicherplatz. Wenn dies auf einer großen Festplatte durchgeführt wird, kann dies zu einer extrem großen Image-Datei führen. Zweitens ddliefert absolut keine Fortschrittsanzeigen, was frustrierend sein kann, da das Kopieren lange dauert. Drittens, wenn Sie dieses Image auf andere Laufwerke kopieren (erneut mit dd), müssen diese so groß oder größer sein als der ursprüngliche Datenträger, Sie können jedoch keinen zusätzlichen Speicherplatz auf dem Zieldatenträger verwenden, bis Sie dies tun Ändern Sie die Größe Ihrer Partitionen.

Sie können auch eine direkte Kopie von Festplatte zu Festplatte erstellen:

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

Sie unterliegen jedoch weiterhin den oben genannten Einschränkungen in Bezug auf den freien Speicherplatz.

Der erste Nachteil kann behoben werden, indem die Daten beim Erstellen der Kopie komprimiert werden. Zum Beispiel:

dd if=/dev/hdb | gzip -9 > hdb.img.gz

Der zweite Nachteil kann mit dem pvTool pipeview ( ) behoben werden . Zum Beispiel:

dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img

Ich kenne keine Möglichkeit, den dritten Nachteil zu überwinden.

Darüber hinaus können Sie die Kopierzeit verkürzen dd, indem Sie angeben , mit größeren Datenblöcken zu arbeiten. Zum Beispiel:

dd if=/dev/hdb of=hdb.img bs=1024

1
Sie haben bereits den Weg zur Überwindung des dritten Nachteils aufgezeigt ... Ändern Sie die Größe der Partitionen. Das Vergrößern einer Partition ist im Allgemeinen ein sicherer und schneller Vorgang (im Gegensatz zum Verkleinern oder Verschieben, was langsam und gefährlicher ist, da Daten verschoben werden).
Davr

gzipping funktioniert nicht mit Datenträgern, die seit einiger Zeit verwendet werden, da sie entweder mit aktuellen oder gelöschten Daten gefüllt sind. gzip funktioniert nur, wenn der leere Speicherplatz auf Null gesetzt ist, was nur bei einer brandneuen Festplatte der Fall ist.
Tozz

3
@Tozz: Sie können die Komprimierbarkeit eines Dateisystemabbilds verbessern, indem Sie das Dateisystem mit einer Datei füllen, die mit Nullen gefüllt ist, sie mit der Festplatte synchronisieren und dann löschen. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon (Modulo zusätzliche Intelligenz in der Dateisystemebene.)
26.

5

Eine weitere nette Sache, die Sie mit dd und Rettungsdisketten machen können, ist das Kopieren von Daten über das Netzwerk:

remote_machine$ nc -l -p 12345

local_machine$ dd if=/dev/sda | nc remote_machine 12345

Sie können gzip in beide Pipelines stecken, wenn das Netzwerk nicht lokal ist. Verwenden Sie für den Fortschritt pv. Um das netcat von local_machine nach dem Kopieren zu beenden, können Sie Folgendes hinzufügen -w 5oder so.


9
Das ist nicht ganz richtig. Dem Befehl 'remote_machine' fehlt etwas, z. B. > disk_backup.imgoder |dd of=/dev/sdb, je nachdem, was Sie tun möchten. Ich vermute, Sie wollen kein Image auf stdout sichern.
Davr

1
Und werfen Sie gzip an beiden Enden ein, um die gesendeten Daten weiter zu minimieren.
3molo

4

Denken Sie daran, dass dd eine exakte Kopie erstellt , einschließlich des gesamten Leerzeichens.

Das bedeutet:

  1. Das zweite Laufwerk muss mindestens so groß sein wie das erste
  2. Wenn das 2. Laufwerk größer ist, wird zusätzlicher Speicherplatz verschwendet (das Dateisystem kann jedoch erweitert werden)
  3. Wenn das Quelllaufwerk nicht voll ist, verschwendet dd viel Zeit beim Kopieren von Leerzeichen.
  4. Sie können entweder das gesamte Laufwerk oder eine einzelne Partition auf diese Weise kopieren.
  5. Wenn es sich um ein bootfähiges Laufwerk handelt, müssen Sie den Bootloader nach der Verwendung von dd installieren

Hoffe das ist hilfreich


8
Wenn Sie die gesamte Festplatte klonen, klonen Sie auch den Bootloader.
Cristian Ciupitu

Nun, nur ein Gedanke, aber können Sie nicht einfach gparted verwenden, um die Partition / Festplatte, die kopiert wird, auf das zu speichern, was auch immer verwendet wird - und dann dd ablegen? Vorausgesetzt, es handelt sich um ein einmaliges Image, sollte dieses Problem behoben werden.
bbqchickenrobot


3

Ein weiteres großartiges Feature ist das Kopieren von MBRs, Partitionstabellen und Startdatensätzen.

Gerade

dd if=/dev/sda of=parttable bs=512 count=1

und die andere Richtung, wenn Sie es schreiben. Polnisch mit fdisknach.

Sie fühlen sich viel sicherer, wenn Sie Ihre Partitionstabelle gesichert haben.

Außerdem wird die Migration auf eine andere Festplatte (während die Partitionsstruktur geändert wird) zum Vergnügen.


3

Dies ist eine Art billiger Hack, aber es ist eine schnelle und schmutzige Möglichkeit, Ihren DD-Prozess zu überwachen.

Führen Sie Ihren Befehl dd aus. Öffnen Sie eine neue Shell und führen Sie ein ps awx aus, um die PID Ihres dd-Prozesses zu finden. Jetzt im neuen Shell-Typ watch -n 10 kill -USR1 {pid of your DD process}

Dies hat keine Auswirkung auf das Überwachungsausgabefenster, aber in der ursprünglichen DD-Shell gibt DD alle 10 Sekunden Statusberichte aus. Sie können das -n 10 im watch-Befehl natürlich in einen anderen Zeitrahmen ändern.

Tachyon


OS X ist nicht watchverfügbar und beendet -USR1dd. Der folgende Befehl funktioniert jedoch: while [ true ]; do killall -INFO dd; sleep 30; done
Adam Franco

Ich denke nicht, dass dies für einen Anfänger sehr praktisch ist, sie können mit dem pvBefehl besser bedient werden .
Robbie Mckennie

Ich habe festgestellt, dass Sie mit STRG-T in dd auch ein SIGINFO senden können. Es ist einfacher als die while-Schleife und die OSX 10.6-CD, die ich besitze, enthält kein killall. Erfuhr dies von en.wikipedia.org/wiki/Unix_signal#Sending_signals
Citizen Kepler

3
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

Dies kopiert den Datenträger und überspringt fehlerhafte Blöcke, was sehr wichtig ist.

Dies sind die grundlegenden und wesentlichen Optionen für die Verwendung von dd zum Klonen oder Retten einer Festplatte.

Ich wollte keine weitere Antwort posten, aber es gab keine guten Antworten mit den wesentlichen "conv = sync, noerror" -Optionen unter den bereits geposteten 25.


1
Tatsächlich wurde es zuvor in einer Antwort und mindestens zwei Kommentaren erwähnt.
Michael Hampton

1
@Michael Die von Ihnen verknüpfte Antwort enthält keinen vollständigen Beispielbefehl und weist andere Fehler auf. Es ist keine gute Idee, große Blöcke zu verwenden, conv=sync,noerrorda zu viele Daten für jeden fehlerhaften Block übersprungen werden. Diese Optionen sind für das "Wiederherstellungsklonen" von entscheidender Bedeutung, und es lohnt sich nicht, die Kommentare nach ihnen durchsuchen zu müssen. Die beliebteste Antwort ist ausreichend, wenn die Festplatten keine fehlerhaften Blöcke aufweisen, z. B. zum Klonen einer unberührten Festplatte, aber nicht zur Wiederherstellung.
Sam Watkins

@Michael Das Beispiel, das ich gegeben habe, ist ein Befehl, den ich mehrmals für die professionelle Wiederherstellung von Festplatten verwendet habe. Während es andere Tools gibt, die einen etwas besseren Job machen könnten, ist das von mir angegebene ddBeispiel für das Klonen von Datenträgern besser als jedes andere Beispiel hier und eignet sich auch zum Klonen eines fehlerfreien Datenträgers. Daher halte ich meine Antwort hier für die beste, um "DD für das Klonen von Datenträgern zu verwenden". Ich habe keine Informationen zum Überwachen des Fortschritts, der Komprimierung usw. hinzugefügt, weil ich es einfach halten und mich darauf konzentrieren wollte, eine kurze Antwort zu geben, die die Grundlagen richtig macht.
Sam Watkins

3

Sie könnten tatsächlich so etwas versuchen

dd if = / dev / sda2 von = / dev / sdb2 bs = 4096 conv = sync, noerror

um alle Fehler zu überspringen und einen genauen Klon einer Partition oder Festplatte zu haben


Es sollte conv = sync, noerror sein. Die Sync-Option wird benötigt, sonst werden fehlerhafte Blöcke entfernt und nicht als Nullen kopiert.
Sam Watkins

2

dd liefert zwar Fortschrittsinformationen, aber die meisten Linux-Versionen. Ich habe einige gesehen, die sich nicht an den Unix-Geschmack erinnern.

Die Manpage sagt: Wenn Sie ein USR1-Signal an einen laufenden 'dd'-Prozess senden, wird die E / A-Statistik auf Standardfehler gedruckt und das Kopieren fortgesetzt.

Ich benutze diese Funktion regelmäßig.


Obwohl es nützlich ist, bezweifle ich seine Praktikabilität für einen Anfänger.
Robbie Mckennie

2

Jemand musste Folgendes sagen: Probieren Sie Clonezilla aus (http: // clonezilla.org/)

Was bekommst du? Nur benutzte Teile des Dateisystems kopieren. Clonezilla verwendet dd, grub, sfdisk, parted, partimage, ntfsclone und / oder partclone. Abhängig von den von Ihnen gewählten Optionen.

Eine anständige Dokumentation finden Sie unter: http: // clonezilla.org/clonezilla-live/doc/


Ich fand die Dokumentation etwas rau und das Klonen eines Linux-PATA-Laufwerks auf ein SATA-Laufwerk ließ mich (noch) nicht mit etwas zurück, das ich booten konnte. Aber viel schneller zum selben Ergebnis wie dd, und es funktionierte hervorragend für die Aktualisierung meines Laptop-Laufwerks.
jbdavid

2

Kopieren mit dd (in diesem Fall auf einen Remote-Computer, aber dasselbe Prinzip gilt für eine lokale Kopie), die den Fortschritt anzeigt.

Dies funktioniert, indem die PID über den Dateideskriptor 3 in / tmp / pid gespeichert wird, der dann für die nachfolgenden Kills mit dem Signal USR1 verwendet wird. Eine Falte bestand darin, die Ausgabe des Fortschritts auf stderr auf nur eine Zeile zu filtern, indem stderr durch eine Subshell gefiltert wurde.

(dd bs=1M if=$lv-snapshot & echo $! >&3 ) 3>/tmp/pid  2> >(grep 'copied' 1>&2) | gzip --fast | ssh $DEST "gzip -d | dd bs=1M of=$lv" &
# Need this sleep to give the above time to run
sleep 1
PID=$(</tmp/pid)

while kill -0 $PID; do
  kill -USR1 $PID
  sleep 5
done

Nicht wirklich relevant für die Frage, aber es ist ein netter Shell-Trick, der eine Sub-Shell und hohe (höher als stderr) Dateideskriptoren verwendet, um Daten daraus zu übermitteln, +1
falstro

Ich habe mich beim Klonen von Festplatten auf diese Seite bezogen, um verschiedene Optionen für dd zu finden. Daher schien dies zu der Zeit ein geeigneter Ort zu sein, um das Endergebnis meiner Klonarbeiten zu ermitteln, zumal ich dachte, es sei ziemlich ordentlich :)
Edward Groenendaal

2

Die meisten Informationen wurden in den zuvor eingefügten Rezepten beschrieben, es wurden jedoch nicht alle beschrieben.

Unter Linux können Sie Festplatten oder Partitionen mit dem Befehl dd klonen. Achtung, wenn Sie einen Fehler machen, werden Sie alle Ihre Daten verlieren.

Zunächst sollte das Ziel nicht verwendet werden, zweitens sollte die Quelle nicht verwendet oder erneut in den Nur-Lese-Modus geschaltet werden. Andernfalls wird die Kopie beschädigt. Wenn ein erneutes Mounten nicht möglich ist, erstellen Sie ein bootfähiges Laufwerk (hdd / ssd / pendrive) für jede Linux Live-Distribution. Ich knoppix prever, aber das ist deine Wahl. Wenn es möglich ist, können Sie die Systemebene für den Einzelbenutzermodus auf 1 setzen oder ändern, oder Sie können das System direkt für den Einzelbenutzermodus neu starten, da dies von der Distribution abhängt. Wenn Sie nur eine Partition klonen, sollte diese Partition nicht oder erneut in RO bereitgestellt werden:

umount /mountpoint_or_device

oder

remount -o,ro /mountpoint_or_device

Wenn Sie die gesamte Festplatte klonen möchten, müssen Sie alle Partitionen ummounten oder erneut mounten.

Sie müssen Quell- und Zielgerät identifizieren. Bitte schauen Sie sich das dmesg an, hier werden alle benötigten Informationen über das Gerät, den Hersteller usw. gespeichert. Die Identifizierung kann alternativ auch anhand der Gerätegröße erfolgen, falls diese unterschiedlich ist. Als nächstes sollte das Ziel gleich oder größer als die Quelle sein. Sie müssen die Quelle berechnen, zum Beispiel: fdisk -l / dev / sda mit Ausnahme der Partitionsgeometrie (es kann GPT geben). Sie werden Folgendes abrufen: 1. Gesamtgröße der Festplatte mit GB und Bytes 2. Historische Geometrie und Gesamtsektornummer, sehr wichtige Informationen 3. Blockgröße in Bytes, normalerweise 512.

zum Beispiel:

# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000f1d1e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    40136703    20067328   83  Linux
/dev/sda2        40138750    41940991      901121    5  Extended
/dev/sda5        40138752    41940991      901120   82  Linux swap /     Solaris

Als nächstes versuchen wir es mit einem Teiler von mehr als 512. Wir haben 41943040 physische Sektoren:

41943040/256 = 163840, sehr gut, wir können eine Massenkopie von 256 Sektoren erstellen. können wir mehr Versuchen wir: 41943040/1024 = 40960, ich denke das ist genug, wir werden dieses auswählen. Zählen wir die Größe der Sektorgruppe: 512 (Sektorgröße) * 1024 = 524288 Bytes, äq. 512 KB. Dann können wir den Parameter bs = 512K oder weniger verwenden, aber dies durch 2 ^ x teilen. Für moderne Festplatten mit großem internen Cache ist dies praktisch genug. Für ältere Laufwerke mit viel kleinerem Cache ist ein Wert von 32 KB oder weniger ausreichend.

Dann können wir nach der Vorbereitung eine Kopie machen: dd if = / dev / source_devide von = / dev / destination_device bs = 32K und die Kopie wird gemacht. Achten Sie darauf, dass alle Fehler Ihre wichtigen Daten überschreiben. Am Zielort werden alle überschrieben.

Wenn Sie versuchen, Daten auf einer beschädigten Quellfestplatte zu retten, sollten Sie die native Sektorgröße (normalerweise 512 Byte) verwenden und die Option conv = notrunc hinzufügen. Andernfalls werden Löcher in der Quelle, die durch fehlerhafte Sektoren gelöscht wurden, durch Sektorverschiebung am Ziel verbunden. Dadurch wird die Kopie beschädigt, und es besteht nur eine geringe Chance auf Reparatur. Dann lautet der Befehl:

dd if=/dev/source of=/dev/destination bs=512 conv=notrunc  

, und lange warten, bis Laufwerk und System aufgeben und Sektor für Sektor bis zum Ende laufen.

dd ist ein nützliches Werkzeug zum Verschieben von Partitionen an einen neuen Ort. Erstellen Sie einfach eine Partition, erstellen Sie dd zu einer neuen Partition (diese kann größer, viel größer sein) und erweitern Sie, wenn möglich, das kopierte Dateisystem, um alle neuen Partitionen zu füllen. Ext3 / ext4 / xfs / zfs / btrfs verfügen über diese Funktion. Schließlich müssen Sie / etc / fstab ändern, dann umount / mount, falls möglich, oder das System neu starten.

Natürlich können Sie jede Art von Partition klonen. Der Befehl dd untersucht nicht den Dateisystemtyp, sondern ändert nichts an seiner Struktur. Dieser Befehl kann dann zum Klonen von NTFS oder anderen Partitionstypen verwendet werden.

Es gibt einen Trick. Wenn Sie keinen Parameter eingestellt haben, wird die Ausgabe von dd in die Standardausgabe verschoben. Dann können Sie eine komprimierte Rohkopie der Festplatte oder Partition erstellen, zum Beispiel:

dd if=/dev/sda bs=512 | gzip >/any/place/computerOne_sda.gz

Dies sollte natürlich offline erfolgen. Sie können dies wiederherstellen, indem Sie:

zcat /any/place/computerOne_sda.gz| dd of=/dev/sda bs=512   

, dann werden alle sda ​​festplatten von dieser sicherung überschrieben und alle aktuellen daten gehen verloren. Sie können dies auch mit einer NTFS-Windows-Partition und einer von dieser verwendeten Festplatte tun. Natürlich können Sie auch einen anderen Komprimierungsbefehl verwenden, der von Ihrer Wahl abhängt.


1

Sie können eine komprimierte Image-Datei der Partition (oder Festplatte) im laufenden Betrieb mit bzip2oder gzipanstelle von erstellen dd. Dies ist nützlich, um Bilder auf Wechseldatenträgern zu speichern:

bzip2 -c /dev/sdaX >imagefile.bz2
or
gzip -c /dev/sdaX >imagefile.gz

Wenn die Festplatte zuvor stark ausgelastet war, können Sie die Komprimierung verbessern, indem Sie vor dem Imaging den gesamten nicht verwendeten Speicherplatz mit Nullen füllen:

mkdir /mnt/mymountpoint
mount /dev/sdaX /mnt/mymountpoint
cat /dev/zero >/mnt/mymountpoint/dummyfile.bin
(Wait for it to end with a "disk full" error)
rm /mnt/mymountpoint/dummyfile.bin
umount /mnt/mymountpoint

Um das Image auf einer anderen Festplatte wiederherzustellen, müssen Sie nur Folgendes tun:

bzcat imagefile.bz2 >/dev/sdbY
or
zcat imagefile.gz >/dev/sdbY

Upvoted für den Trick, um den verbleibenden Platz mit Nullen zu füllen. Clever!
Verwirrung

Das brauchte ich! Die SD-Karte wurde früher für die Videoaufnahme verwendet und war voller Mist, die Komprimierung half überhaupt nicht.
Cody Smith

0

Aus irgendeinem Grund schlägt dd beim Imaging von CDs mit Audiotracks fehl. Sie müssen cdrdao oder ähnliches verwenden, um eine Image + TOC-Datei zu erhalten.


0

Anmerkung zur Geschwindigkeit: Nach meiner Erfahrung ist dd doppelt so schnell, wenn Sie bs = 1024 anstelle der Standardeinstellung bs = 512 angeben. Die Verwendung eines noch größeren Blocks führt zu keiner merklichen Beschleunigung über bs = 1024.


4
Festplattencluster sind derzeit in der Regel rund 4 KB groß, daher ist die Verwendung von 4096 wahrscheinlich eine gute Option, und sogar 8192, wenn Sie 2 Cluster gleichzeitig lesen möchten. Gehen Sie jedoch nicht zu groß, da Sie auf fragmentierte Speicherprobleme
stoßen

0

Eine Sache, die Sie beachten müssen, wenn Sie eine vollständige Festplatte kopieren, ist, dass dadurch der Master-Boot-Datensatz der empfangenden Festplatte überschrieben wird. Dieser enthält die Partitionstabelle und andere wichtige Informationen. Wenn der neue Datenträger nicht mit dem alten Datenträger identisch ist, können auf diese Weise alle Arten von Tabellen erstellt werden. Das Kopieren über Partitionen ist im Allgemeinen sicherer (und Swap-Partitionen müssen nicht kopiert werden).


0

Ich bin seit vielen Jahren nicht mehr als Administrator tätig, aber ich weiß, dass "dd" der Aufgabe gewachsen ist. Ich habe diese Technik in den späten 80ern regelmäßig auf Sun Sparc- und 386i-Computern angewendet. Ich hatte einen Kundenauftrag über 30 386i-Systeme, auf denen CAD-Software ausgeführt wurde, die auf mehreren QIC-Bändern verteilt war.

Wir haben auf dem ersten Computer installiert, die App konfiguriert, SunOS 'sys-unconfig ausgeführt, das Laufwerk in einem Schuhkarton mit einer anderen SCSI-Adresse abgelegt und sind dann zu den anderen 30 Laufwerken übergegangen.


0

Wie bereits erwähnt, ist eine der Ursachen für das Klonen eines bereitgestellten Dateisystems eine mögliche Datenbeschädigung. Dies gilt natürlich nicht für vollständige Laufwerks-Klone. Wenn Sie jedoch LVM verwenden, können Sie das LogicalVolume und dd aus dem Snapshot erstellen, um ein konsistentes Image zu erhalten.



0

Nur eine Warnung für Anfänger, die gesagt werden muss: Zumindest bei einigen Versionen bedeutet bs = X, dass Speicher auf die Größe von X buchstäblich zugewiesen wird. bs = 2 GB auf einem System mit 1 GB RAM und unzureichendem Auslagerungsspeicher können zu schlechten Ergebnissen führen.

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.