Warum dauert dd zu lange?

16

Ich muss eine Festplatte auf eine andere kopieren. Ich habe es mit dem folgenden Befehl versucht und es dauert fast einen Tag, um 1 TB Festplatte zu kopieren.

dd if=/dev/sda of=/dev/sdb 

Ich habe das gleiche auf einem Unix-System mit dem folgenden Befehl versucht und es ist innerhalb weniger Stunden abgeschlossen

dd if=/dev/sda of=/dev/rdsk

Was ist die Alternative, die ich verwenden könnte, um schneller von Festplatte zu Festplatte zu kopieren?

KKD
quelle
2
cp /dev/sda /dev/sdboder ( pv /dev/sda > /dev/sdb um einen Fortschrittsbalken zu erhalten) wäre viel schneller. Warum würden Sie ddhier verwenden? ddwäre nur nützlich conv=sync,noerror, wenn es darum geht, fehlerhafte Datenträger zu behandeln, aber selbst dann wäre es sinnvoller, ddrescuestattdessen Dinge wie zu verwenden (siehe auch pvdie -EOption).
Stéphane Chazelas
1
@StéphaneChazelas ist catvielleicht noch schneller, aber der Unterschied ist nicht so dramatisch (vielleicht größer für Gerät zu Gerät als Datei zu Datei wie in meinem Experiment).
Gilles 'SO- hör auf böse zu sein'
7
"Ich habe dasselbe auf einem Unix-System versucht" - Auf welchem ​​System haben Sie das erste Mal versucht, wenn nicht auf einem Unix? Auch welche Hardware, etc, yaddayadda.
März
Willkommen zu ddFallstrick # 1
Dmitry Grigoryev
Verwendet die erste in HP-UX (Integrity Blade) und früher verwendete Solaris-Maschine.
KKD

Antworten:

27

ddhat viele (komische) Möglichkeiten, siehe dd (1) .

Sie sollten die Puffergröße explizit angeben, versuchen Sie es also

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

IIRC ist die Standardpuffergröße nur 512 Byte. Mit dem obigen Befehl werden 16 Megabyte festgelegt. Sie könnten etwas Kleineres ausprobieren (z. B. bs=1M), sollten jedoch mehr als das Standardformat verwenden (insbesondere auf neuerer Festplattenhardware mit Sektoren von 4 KB, dh Advanced Format ). Ich empfehle naiv eine Zweierpotenz, die mindestens ein Megabyte beträgt.

Mit dem Standard 512 Byte Puffergröße, ich denke (aber ich konnte sehr falsch sein) , dass die Hardware den Kernel für jeden 512 Bytes Block zu übertragen 4K erfordert.

In Bezug auf rdskdie sd (4) -Manpages heißt es:

Derzeit werden nur Blockgeräte bereitgestellt. Raw-Geräte wurden noch nicht implementiert.

Wenn Sie die Puffergröße von dd erhöhen, erhalten Sie mehr Leistung für Lese- und Schreibvorgänge. Jetzt haben alle Festplatten einen Hardware-Lese- / Schreibpuffer. Wenn Sie jedoch die Puffergröße von dd mehr erhöhen als den Hardware-Puffer, verringert sich die Leistung, da dd von der ersten Festplatte in den Puffer liest, wenn die zweite Festplatte alle Daten aus dem eigenen Hardware-Puffer geschrieben hat. Sie müssen die bsOption dd command jedes Mal einstellen, wenn sich der Wert für verschiedene Geräte ändert.

Basile Starynkevitch
quelle
Ob RDSK in Linux-Systemen verfügbar ist? Ich habe in Unix-Systemen verwendet.
KKD
1
Der Seiten-Cache wird wahrscheinlich 4-KB-Blöcke enthalten, was auch immer Sie tun, aber Sie können steuern, wie viele Systemaufrufe dd verwendet, um diese 4-KB-Blöcke zu lesen. Ich bin sicher, dass es eine Lesegröße gibt, oberhalb derer die Kosten für das Abwürgen von Schreibvorgängen teurer sind als die für gespeicherte Systemaufrufe, aber ich habe keine Ahnung, wo der Sweet Spot liegt.
Nutzlos
Eine Blockgröße von ein paar MB ist besser als die Standardgröße von 512B, aber als ich dies untersuchte, stellte ich fest, dass catdies genauso gut war (für die Übertragung von Dateisystem zu Dateisystem kann die direkte Block-zu-Block-Übertragung unterschiedliche Leistungsmerkmale aufweisen). Der Unterschied war jedoch in keinem Fall dramatisch.
Gilles 'SO- hör auf böse zu sein'
1
Interessanterweise ist es unter macOS (übrigens SUS-zertifiziert) schneller, es/dev/rdiskX als Ziel für die Ausführung zu verwenden dd.
Adib
1
Falls Sie sich fragen, was (wie ich) vor sich geht, fügen Sie auch hinzu, status=progressdass der gesamte Operationsfortschritt gedruckt wird.
Aleksander Lech
16

Vor Jahren in Unix-Land ddwar der erforderliche Weg, um ein Block-Gerät zu kopieren. Das hat sich als Cargo-Kult-Wissen weiterentwickelt, obwohl (zumindest auf Linux-basierten Systemen) catfast immer schneller ist als dd.

Selbst in der Vergangenheit hat eine anständige Blockgröße dazu beigetragen, die Anzahl der (langsamen) Systemaufrufe zu verringern, da bei jedem Systemaufruf eine E / A-Operation ausgelöst wurde. Die Standardblockgröße beträgt 512 Byte (ein Plattensektor). Das Sammeln mehrerer Plattenblöcke zu einem einzigen Lesevorgang war - und ist - ebenfalls akzeptabel. In diesem Beispiel wird eine Blockgröße von 32 MB verwendet:

dd bs=$((512*2048*32)) if=/dev/source of=/dev/target

Auf aktuellen Linux-basierten Systemen können Festplatten jedoch am effizientesten mit einem einfachen Kopiervorgang kopiert werden cat

cat /dev/source >/dev/target

(Wie in den Kommentaren zu Ihrer Frage angegeben, pvkann dies ersetzt werden catund gibt Ihnen einen Hinweis auf Fortschritt und Durchsatz.)

Roaima
quelle
2
Insbesondere war der Grund, warum dd verwendet werden musste, ein Fehler in GNU cp und ein Fehler im Linux-Kernel in den frühen 90ern. Die Gründe für die Verwendung von dd auf historischen Unix-Systemen waren sehr unterschiedlich, und es war ungewöhnlich, ein ganzes Block-Gerät kopieren zu wollen.
Random832
1
@ Random832 eine ganze Festplatte kopieren zu wollen, wäre ungewöhnlich gewesen, aber ich erinnere mich, dass ich Partitionen kopieren musste (große - 150 oder sogar 200 MB)
roaima 10.11.16
2
(Die Besonderheiten der Fehler: Der Kernel hat die Größe der Datenträgernutzung falsch angegeben [was cp zu dem Schluss führt, dass jede Quelldatei eine Sparse-Datei ist], und cp hat beim Kopieren von einer Sparse-Datei auf ein Geräteziel keine Blöcke auf Null gesetzt. Also keine Null Block in Ihrer Quelle hätte was Müll passiert ist bereits auf der Festplatte)
Random832
Ich liebe diese Art der Antwort. Danke für die Information. Hier ist Ihr Updoot.
catbadger
7

Generell ddkann zugunsten einiger Alternativen verzichtet werden. Es gibt mehrere gute Gründe, GNU ddrescuestattdessen zu verwenden. In Ubuntu können Sie es installieren mit:

sudo apt-get install gddrescue

und einfach ddrescuezu bedienen. Beachten Sie, dass die ausführbare Datei anders als der Paketname nicht die Initiale hat g.

Die Benutzung ist so einfach wie:

ddrescue inputFile outputFile logFile

In der Protokolldatei (mit einem beliebigen Namen) können Sie anhalten / anhalten und neu starten, ohne die vorherige Arbeit wiederholen zu müssen. Dies ist hilfreich, wenn Sie große Klone ausführen oder Datenträger wiederherstellen möchten. Standardmäßig werden der Fortschritt, die aktuelle Kopiergeschwindigkeit, die durchschnittliche Kopiergeschwindigkeit und die Anzahl der gefundenen fehlerhaften Blöcke angezeigt.

Es werden sinnvolle Standardeinstellungen für die Blockgröße verwendet, so dass die Kopiergeschwindigkeit immer so hoch ist, wie es das Gerät kann, zumindest nach meiner Erfahrung (ich habe viele Hunderte Laufwerke damit geklont, alle Größen und Typen).

Laufwerke, deren Ausfall beginnt, weisen häufig Geschwindigkeitsprobleme auf, z. B. gelegentlich langsame Bewegungen, niedrige Durchschnittsgeschwindigkeit, plötzliche lange Pausen (fehlerhafte Sektoren) oder vollständige Zurücksetzungen (schwerwiegende Oberflächenfehler). ddrescuekann Ihnen helfen, alle oben genannten Probleme zu identifizieren und Ihren Klon neu zu starten (vorausgesetzt, Sie haben eine Protokolldatei angegeben), auch wenn sich Ihr Laufwerk selbst zurücksetzt.

Technischer Fehler
quelle
6

Sehr nette Frage. Die Raw-Schnittstelle ist auf einigen Unix-Systemen (tru64, hpux, solaris) implementiert, jedoch nicht unter Linux. Die Raw-Schnittstelle beschleunigt die Übertragung, da Unix-E / A übersprungen wird. Die Blockschnittstelle ( /dev/dskoder /dev/disk) ist langsamer, weil sie das Unix-E / A-System verwendet. Zum Beschleunigen dd( gnu dd kann) bs=30Moder bs=20Mje nach hw verwenden. Die kurze Antwort lautet: NEIN, sie ist meines Wissens nicht implementiert. Ich benutze Linux seit den alten Zeiten der Kernel-Version 2.2 und habe es noch nie rdskunter Unix gesehen.

Elbarna
quelle
5
Warum schlagen Sie eine Blockgröße vor, die keine Zweierpotenz ist?
Basile Starynkevitch
2
@Basile ein Vielfaches der Festplattenblockgröße ist ausreichend, daher wären 20 MB in Ordnung.
Roaima