Vollständige DD-Kopie von Festplatte zu Festplatte

34

URSPRÜNGLICHE FRAGE:

Wenn ich 2 identische Festplatten mit folgenden Merkmalen habe:

  • SATA 6.0 Gb / s
  • 5400 U / min
  • 3 TB

Wie lange sollte es dauern, bis eine vollständige DD-Kopie fertig ist?

Bisher ist es 5 Stunden gelaufen und geht immer noch ...

Ich verwende Linux Ubuntu 12.04 64bit und benutze folgenden Befehl:

dd if=/dev/sdb of=/dev/sdc

UPDATE: 1

Ich kann jetzt den Fortschritt sehen und es waren 6+ Stunden für die Kopie 430GB. Die Festplatte hat 3 TB ...

Geht das nicht schneller?


UPDATE: 2

Das scheint viel besser zu sein als zuvor (Danke an Groxxda für die Vorschläge):

sudo dd if=/dev/sdb bs=128K | pv -s 3000G | sudo dd of=/dev/sdc bs=128K

Die ETA beträgt für 3 TB ungefähr 9 Stunden, während die ETA nach 6 Stunden 430 GB erreicht hat. Ich nehme an, dass die Verwendung des vorherigen Befehls ungefähr 36 Stunden gedauert hätte.

oshirowanen
quelle
Versuchen Sie, die Statistiken des Prozesses abzurufen: Wenn Sie ein USR1-Signal an einen laufenden "dd" -Prozess senden, wird die E / A-Statistik auf Standardfehler gedruckt und das Kopieren fortgesetzt. $ dd if = / dev / zero von = / dev / null & pid = $! $ kill -USR1 $ pid Überprüfe deine Manpage auf das tatsächliche Signal, da es für verschiedene dd-Implementierungen unterschiedlich ist.
Groxxda
@Groxxda, ich habe keine Ahnung, wie das geht.
oshirowanen
1
GNU dd verwendet SIGUSR1, und BSD dd verwendetSIGINFO
groxxda
Auch was meinst du mit "an das gleiche SATA-Kabel angeschlossen"? Verwenden Sie eine Art Port-Multiplikator? (Wenn Sie eine Übertragungsrate von 150 MB / s erreichen, sollten Sie 5-6 Stunden brauchen, aber ich denke, die Hälfte davon ist realistischer.)
groxxda
1
Möglicherweise können Sie den Prozess beschleunigen, indem Sie eine andere (größere) Blockgröße ( bs=Argument bis dd) angeben . Ziehen Sie auch in Betracht, jede Festplatte an einen eigenen Sata-Port anzuschließen.
Groxxda

Antworten:

58

ddwar früher nützlich, als die Leute Bänder verwendeten (wenn es auf Blockgrößen ankam) und wenn einfachere Tools, wie sie catmöglicherweise nicht binärsicher sind.

Heutzutage dd if=/dev/sdb of=/dev/sdcist es nur eine komplizierte, fehleranfällige, langsame Art zu schreiben cat /dev/sdb >/dev/sdc. Obwohl es ddfür einige relativ seltene Aufgaben immer noch nützlich ist , ist es viel weniger nützlich als die Anzahl der Tutorials, in denen erwähnt wird, dass Sie es glauben machen würden. Es ist keine Magie in dd, die Magie ist alles in /dev/sdb.

Ihr neuer Befehl sudo dd if=/dev/sdb bs=128K | pv -s 3000G | sudo dd of=/dev/sdc bs=128Kist wieder unnötig langsam und kompliziert. Die Daten werden gelesen 128kB zu einer Zeit (die besser ist als der ddStandard von 512B, aber nicht so gut wie noch größeren Werten). Es geht dann durch zwei Pipes, bevor es geschrieben wird.

Verwenden Sie den einfacheren und schnelleren catBefehl. (In einigen Benchmarks, die ich vor ein paar Jahren unter Linux erstellt habe, catwar das schneller als cpbei einer Kopie zwischen verschiedenen Festplatten und cpwar schneller als ddbei jeder Blockgröße; ddbei einer großen Blockgröße war das Kopieren auf dieselbe Festplatte etwas schneller.)

cat /dev/sdb >/dev/sdc

Wenn Sie diesen Befehl ausführen möchten sudo, müssen Sie die Umleitung als root ausführen :

sudo sh -c 'cat /dev/sdb >/dev/sdc'

Wenn Sie einen Fortschrittsbericht benötigen, da Sie Linux verwenden, können Sie diesen problemlos abrufen, indem Sie die PID des catProzesses (z. B. 1234) notieren und die Position seines Eingabe- (oder Ausgabe-) Dateideskriptors überprüfen.

# cat /proc/1234/fdinfo/0
pos:    64155648 
flags:  0100000

Wenn Sie einen Fortschrittsbericht und Ihre Unix - Variante wollen nicht eine einfache Möglichkeit bietet auf einer Dateideskriptor Positionen zu erhalten, können Sie installieren und verwenden pvstatt cat.

Gilles 'SO - hör auf böse zu sein'
quelle
Was bei großen Blöcken seltsam ist, ist, dass der Flaschenhals die Festplatte ist, was macht also catschneller als dd? Könnte es sein, dass catder Cache verwendet?
Emmanuel
1
@ Gilles, danke für die Antwort. Ich muss noch fünf 3-TB-Laufwerke klonen und werde als nächstes die Option cat ausprobieren. Soweit ich das beurteilen kann, wird der neue Befehl dd noch 3 Stunden dauern, also insgesamt 11 Stunden. Wenn die Kat-Annäherung für die zweite 3-TB-Festplatte schneller als 11 Stunden ist, verwende ich diese Methode für die verbleibenden Laufwerke.
oshirowanen
2
Verwenden Sie @Gilles, um einen Fortschrittsbericht zu erhalten, sudo sh -c 'pv /dev/sdb >/dev/sdc'anstelle von sudo sh -c 'cat /dev/sdb >/dev/sdc'?
oshirowanen
1
@oshirowanen Ja, verwenden pvSie , wo Sie verwenden würden cat.
Gilles 'SO - hör auf, böse zu sein'
1
@unhammer Nein! Sie würden jedes Gerät einzeln kopieren, z cat /dev/sdc1 >/dev/sdb1 && cat /dev/sdd1 >/dev/sde1. Die Verkettung der beiden Teile macht keinen Sinn. Wenn Sie die Struktur des BTRFS-Volumes ändern möchten, müssen Sie zum Ändern der Struktur die BTRFS-Tools verwenden oder ein neues Dateisystem mit der gewünschten Struktur erstellen und die Dateien kopieren .
Gilles 'SO- hör auf böse zu sein'
7

ddverwendet standardmäßig eine sehr kleine Blockgröße (512 Byte). Dies führt zu einem hohen Overhead (einer read()und write()Syscall für jeweils 512 Bytes).

Es geht viel schneller, wenn Sie eine größere Blockgröße verwenden. Optimale Geschwindigkeiten beginnen bei bs=64koder so. Die meisten Leute benutzen ein noch größeres, bs=1Mdamit es für den Menschen lesbar wird (wenn ddes kopiert wird 1234 blocks, wissen Sie, dass es 1234 MiBohne Mathematik auskommt). Die Verwendung noch größerer Blockgrößen führt wahrscheinlich nicht zu Geschwindigkeitsverbesserungen, sondern nur zu einem höheren Speicherverbrauch.

Der Befehl sollte also lauten:

dd bs=1M if=/dev/sdb of=/dev/sdc

Wenn Sie bereits eine langsame ddAusführung haben, können Sie diese unterbrechen und mit einer schnelleren ddInstanz fortfahren. Hierzu ist es wichtig zu wissen, wie weit der Kopiervorgang bereits fortgeschritten ist. ddNormalerweise wird der Fortschritt gedruckt, wenn Sie ihn abbrechen, oder Sie können das USR1Signal senden, während es ausgeführt wird, damit der Fortschritt gedruckt wird.

kill -USR1 $(pidof dd)

Wenn beispielsweise mehr als kopiert wurde 1234MiB, können Sie an der Position 1234MiBfortfahren, indem Sie Folgendes verwenden:

dd bs=1M seek=1234 skip=1234 if=/dev/sdb of=/dev/sdc

Wenn weniger als kopiert wurde 1234MiB, ist Ihre Kopie unvollständig. Wenn mehr als kopiert wird 1234MiB, werden einige bereits kopierte Teile erneut kopiert, was normalerweise keinen Schaden anrichtet. Wenn Sie also Zweifel haben, sollten Sie einen Wert wählen, der etwas kleiner ist als der, von dem Sie glauben, dass er bereits kopiert wurde.

Frostschutz
quelle
5

Statistiken über den laufenden dd-Prozess abrufen

Sie können den killBefehl mit dem entsprechenden Signal verwenden, um die ddAusgabestatistik auf Standardfehler umzustellen.
Aus der GNU dd-Manpage:

Sending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and then resume copying.
      $ dd if=/dev/zero of=/dev/null& pid=$!
      $ kill -USR1 $pid
      18335302+0 records in 18335302+0 records out 9387674624 bytes (9.4 GB)  copied,  34.6279 seconds, 271 MB/s

Stellen Sie sicher, dass Sie zuerst in Ihrer Manpage nach dem richtigen Signal suchen, da es bei verschiedenen Implementierungen von dd unterschiedlich sein kann: (BSD dd verwendet SIGINFO).

Den Prozess beschleunigen

  1. Schließen Sie jede Festplatte an einen eigenen SATA-Port an, damit die Daten gleichzeitig von einem Gerät gelesen und auf das andere geschrieben werden können.
  2. Verwenden Sie eine geeignete Blockgröße mit dem bs=Argument. Schauen Sie sich diesen Thread im Superuser an und probieren Sie einige Werte aus.
  3. Verwenden Sie separate ddAufrufe zum Lesen und Schreiben und verwenden Sie eine Pipe, um sie zu verbinden ( dd if=/dev/sda bs=1M | dd of=/dev/sdb bs=1M).
    Wenn Sie dies tun und eine Blockgröße angeben, stellen Sie sicher, dass Sie bei jedem Aufruf dieselbe Blockgröße verwenden.
  4. Sie können andere Optimierungen wie das directArgument versuchen .
  5. Stellen Sie sicher, dass Ihre Festplatten nicht gemountet sind, da dies sonst zu einer beschädigten Kopie führen kann.
groxxda
quelle
0

Haben Sie versucht, "gparted"? Sie können eine Partition buchstäblich von einem Laufwerk auf ein anderes kopieren und die Größe entsprechend anpassen. Sie erhalten Übertragungsrate und verbleibende Zeit. Es verwendet 'e2image' für Linux-Partitionen.

ioannis
quelle
0

Es gibt kommerzielle Software namens HDClone . Es ist sowohl als Freeware als auch als kommerziell lizenziert. In beiden Versionen können Sie ein bootfähiges Pendrive oder eine DVD erstellen sowie Datenträger kopieren. Schließen Sie die Quell- und Ziel-HDs an und befolgen Sie die Anweisungen auf der GUI-Basis.

Die kostenlose Version überträgt mit einer Geschwindigkeit von ca. 80 MB / Sek., Während die kostenpflichtigen Versionen viel schneller sind. Für NTFS- und FAT-Dateisysteme können die kostenpflichtigen Versionen so konfiguriert werden, dass nur die belegten Bits der Festplatte geklont werden, was die Geschwindigkeit jedes Klons erheblich erhöht.

Gerold Manders
quelle
(1) Sind Sie mit diesem Produkt verbunden? (2) Wo können wir es bekommen?
Scott
1
Oder Sie könnten einfach "cat / dev / sdx> / dev / sdy" kostenlos verwenden ...
HörmannHH