Wie würde ich eine volle Festplatte beschleunigen?


62

Ich mache ein ddauf zwei identischen Laufwerken mit diesem Befehl:

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

Beide Festplatten haben genau die gleiche Modellnummer und beide haben 1 TB Speicherplatz. /dev/sda Verwendet eine Blockgröße von 4096. Ist /dev/sdaein lokales Laufwerk und /dev/sdbein Remote-Caddy. Ich kann möglicherweise die folgenden Protokolle verwenden:

  • USB2.0 HighSpeed ​​(Derzeit ist der Plan)
  • Gigabit Over-The-Network-Klon (Wirklich nicht wollen, auch dies zu versuchen)
  • USB3.0 (Wenn ich meinen anderen Laufwerkscaddy finde)
  • eSATA (Wenn ich ein Kabel finde / kaufe)
  • SATA (Wenn ich ein Kabel finde / kaufe, muss ich Laptop-CD-Laufwerke lieben)

Gibt es eine Möglichkeit, diese Laufwerkskopie auszuführen, die weniger als 96 Stunden dauert? Ich bin offen für andere Tools als dd.

Ich muss die folgenden Partitionen (einschließlich UUIDs) klonen

  • Fat32 EFI-Partition (*)
  • NTFS-Windows-Partition (*)
  • HFS + OSX-Partition
  • EXT4 Ubuntu Partition (*)
  • Swap-Partition (*)

* Unterstützt von Clonezilla


Ich habe Clonezilla ausprobiert (und es war VIEL schneller), aber es unterstützt nicht das intelligente Kopieren von HFS +, das ich benötige. Vielleicht unterstützt die neueste Version dies?

Als ich meinen ersten Klon erstellt habe, habe ich alle Partitionen außer HFS + erstellt und es ging sehr schnell. (Nicht mehr als 3 Stunden insgesamt)


1
Sie sind wahrscheinlich besser dran mit so etwas wie Clonezilla. ddkopiert alles , einschließlich des freien Speicherplatzes. Die Nachteile werden sehr deutlich, wenn Sie große Festplatten haben, die nicht voll sind.
Boris die Spinne

Ist es möglich, ein SATA-Kabel zu kaufen und das externe Laufwerk vorübergehend an einen SATA-Anschluss auf dem Motherboard anzuschließen?
Mark Plotnick

Vielleicht könnte jemand Folgendes näher erläutern: Wie wäre es mit dem Klonen der Partitionstabelle (entweder mit clonezilla oder dd), dem Klonen aller Partitionen mit Ausnahme von HFS + mit Clonezilla und der Verwendung von dd für diese eine Partition? Wäre das machbar?
Alexander

@Alexander So habe ich meinen ersten Klon gemacht.
Kaz Wolfe

1
@ LuisAlvarado Ich habe gerade den Klon gestartet, Mann!
Kaz Wolfe

Antworten:


69

Meiner Erfahrung nach gibt es in der Kommandozeile nicht etwas schnelleres als dd. Durch Anpassen des bsParameters kann die Geschwindigkeit erhöht werden. Ich habe beispielsweise 2 Festplatten mit einer Lese- / Schreibgeschwindigkeit von mehr als 100 MB / s.

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

Es gibt auch pv(muss zuerst installiert werden), die auf beiden Laufwerken nach der schnellsten Geschwindigkeit sucht und dann mit dem Klonen fortfährt. Dies muss natürlich von root aus erfolgen:

pv < /dev/sda > /dev/sdb

Mit PV habe ich 156 MB / s

pvAbgesehen von der Geschwindigkeit ist das Schöne daran, dass es den Fortschritt, die aktuelle Geschwindigkeit, die Zeit seit Beginn und die ETA anzeigt. In Bezug auf HFS + würde ich nicht wissen, versuche nur auf dem "Speed" Teil zu helfen. Mit pvoder einem sehr optimierten bsParameter können Sie eine 4-TB-Fahrt in weniger als 7 Stunden (6 Stunden, 50 Minuten bei einer aktuellen Geschwindigkeit von 150 MB / s) durchführen.

Bildbeschreibung hier eingeben

Ich habe einige Tests mit den von Ihnen verwendeten Verbindungstypen und anderen verfügbaren durchgeführt. Ich habe das Asus Z87 Pro und das Intel DZ68DP verwendet. Dies waren meine Ergebnisse, aber zuerst müssen wir wissen, dass die theoretischen Geschwindigkeiten für viele Übertragungsraten (Raw-Geschwindigkeiten) genau diese Theorie sind . Reale Tests haben ergeben, dass sie zwischen 40% und 80% dieser Rohgeschwindigkeit liegen. Diese Tests können sich je nach verwendetem Gerät, Verbindungstyp, Motherboard, Art des Verbindungskabels, Dateisystemtyp usw. ändern. In diesem Sinne habe ich Folgendes erhalten (ich habe nur die Schreibgeschwindigkeit für das Gerät getestet, das Lesen ist normalerweise höher):

Connected Device  -  Connection Type  -  Speed (Write Speed)
  USB 2.0                 USB 2.0              25 MB/s
  USB 3.0                 USB 2.0              35 MB/s
  USB 3.0                 USB 3.0              73 MB/s
  eSata                   eSata                80 MB/s
  Sata 2G HDD             Sata 2G              120 MB/s
  Sata 3G HDD             Sata 2G              140 MB/s
  Sata 3G HDD             Sata 3G              190 MB/s
  Sata 2G SDD             Sata 2G              170 MB/s
  Sata 3G SDD             Sata 2G              210 MB/s
  Sata 3G SDD             Sata 3G              550 MB/s 

3
Sende das Signal USR1, um den Fortschritt von dd zu erhalten. Der Nachteil von dd ist, dass es freien Speicherplatz kopiert.
jfs

1
Nach meiner Erfahrung kann das Einstellen des bsParameters ddso schnell wie möglich erfolgen cat. Sie können es genauso gut catin erster Linie verwenden.
Gilles 'SO- hör auf böse zu sein'

3
pvan sich funktioniert sehr sehr gut.
Kaz Wolfe

11
Sie können dd verwenden, um die Arbeit zu erledigen, aber pv in die Kette einfügen, um die Übertragungsrate wie dd if=/dev/sda1 | pv | dd of=/dev/sdb1
folgt

4
Ich habe immer pvzwischen dds verwendet. Ich hätte nie gedacht, dass es allein verwendet werden kann!
korylprince

12

Verwenden Siecatdd zum Kopieren einer Partition im Großhandel anstelle von . Ich habe vor einiger Zeit Benchmarks ausgeführt und eine große Datei anstatt einer Partition zwischen zwei Festplatten kopiert (auf derselben Festplatte sind die relativen Zeiteinstellungen unterschiedlich):

dd bs=64M    51.3
dd bs=1M     41.8
dd bs=4k     48.5
dd bs=512    48.9
cat          41.7
cp           45.3

Die Schlussfolgerung aus diesem Benchmark ist, dass die Wahl der Blockgröße für ddAngelegenheiten (aber nicht für viele) und catautomatisch den besten Weg findet, um eine schnelle Kopie zu erstellen: ddKann Sie nur verlangsamen. Bei einer kleinen Blockgröße wird ddZeit verschwendet, indem winzige Lese- und Schreibvorgänge verloren gehen. Bei einer großen Blockgröße bleibt eine Festplatte im Leerlauf, während die andere liest oder schreibt. Die optimale Rate wird erreicht, wenn eine Festplatte liest, während die andere schreibt.

Um eine Partition zu kopieren, ist es möglicherweise schneller, die Dateien mit zu kopieren cp -a. Dies hängt davon ab, wie viele Dateien vorhanden sind und wie viel Speicherplatz im Dateisystem frei ist. Das Kopieren von Dateien hat einen Overhead, der in etwa proportional zur Anzahl der Dateien ist, aber das Kopieren von freiem Speicherplatz kostet Zeit.

Die maximale Datenrate für USB2 liegt bei etwas unter 50 MB / s, was 6 bis 7 Stunden für die Übertragung von 1 TB entspricht. Dies setzt eine Festplatte voraus, die schnell genug ist, um den USB-Bus zu überlasten. Ich denke, die schnelleren Laufwerke mit 7200 U / min können das, aber 5900 U / min sind möglicherweise nicht so schnell (vielleicht sind sie für lineare Schreibvorgänge?).

Wenn eine der Festplatten gleichzeitig verwendet wird, kann dies den Kopiervorgang erheblich verlangsamen, da sich die Festplattenköpfe bewegen müssen.


Ich versuche jedoch, eine ganze Festplatte zu kopieren.
Kaz Wolfe

Ich gehe davon aus, dass der Unterschied in der gleichen Größenordnung liegt, aber führen Sie auf Ihrem System einen Benchmark durch, um zuverlässigere Daten zu erhalten.
Gilles 'SO- hör auf böse zu sein'

Kann catfür verwendet werden dd if=ubuntu.iso of=/dev/usb? ddDie Geschwindigkeit für USB2 oder USB3 ist frustrierend langsam.
Oxwivi

1
@Oxwivi Ja, cat ubuntu.iso >/dev/usbist genau gleichwertig. Es steckt keine Magie darin dd, es ist nur ein Werkzeug, um seine Eingabe in seine Ausgabe zu kopieren.
Gilles 'SO- hör auf böse zu sein'

Der oben angegebene Befehl cat funktionierte auf einem Mac nicht. Ich habe versucht sudo cat linuxmint-17.3-cinnamon-64bit.iso >/dev/disk1"-bash: / dev / disk1: Permission denied" zurückzugeben
Nay

12

Das Problem ist Ihr Verbindungstyp und die Blockgröße. Für die schnellsten Ergebnisse sollte Ihre Blockgröße die Hälfte der niedrigsten Schreibgeschwindigkeit sein, die Sie normalerweise erhalten. Dies gibt Ihnen einen sicheren Spielraum, lässt aber dennoch eine große Anzahl zu; Natürlich müssen Sie genug RAM haben, um die Daten auch zu halten.

USB 2.0 ist 12 Megabit pro Sekunde (Mbit / s), USB 2.0 High Speed ​​ist 480 Mbit / s. Das ist natürlich die rohe Geschwindigkeit; Bei 8 Bits in einem Byte und Framing-Overhead ist die nutzbare Geschwindigkeit in MB / s normalerweise eine Dezimalstelle höher. So werden zum Beispiel 480 RAW 48 MB nutzbar. Denken Sie daran, dass dies das mathematisch beste ist, in der realen Welt wird es ein bisschen niedriger sein. Für USB 2.0-Hochgeschwindigkeitsverbindungen sollten Sie mit einer maximalen Schreibgeschwindigkeit von 30-35 MB rechnen, vorausgesetzt, das tatsächliche Speichergerät kann die Verbindungsgeschwindigkeiten erreichen oder übertreffen.


6
Unit Nitpicking: USB 2.0 High Speed ​​ist 480 Mbit / s = 60 MByte / s, Raw Speed. Die nutzbare Geschwindigkeit ist keine Nachkommastelle, sondern etwa 80% der Rohgeschwindigkeit. Die Faustregel "Die tatsächliche Geschwindigkeit in MByte / s beträgt 1/10 der Rohgeschwindigkeit in Mbit / s" ist jedoch gültig.
jpa

5

Ich bin damit einverstanden, dass die rohe Geschwindigkeit eines gut abgestimmten dd('pv') oder 'cat' Befehls schwer zu übertreffen ist, aber wenn es ein Problem mit der Kopie gibt (fehlerhafter Sektor, Stromausfall, Benutzerfehler usw.), müssen Sie beginnen Über.

Ich möchte ddrescue vorschlagen - ein FOSS-Tool mit der Geschwindigkeit von dd, das jedoch Festplattenfehler umgeht und bei einem Fehler zu einem späteren Zeitpunkt fortgesetzt wird.


2

Ich habe Windows 7 von einer Festplatte auf eine SSD verschoben und diese und einige andere Antworten gefunden ... Etwas, das ich gelernt habe und das anderen helfen könnte. In meinem Fall ist das Quelllaufwerk größer, sonst hätte ich auf der Geräteebene / dev / sda -> / dev / sdb gearbeitet.

Win7 und seine 3 Partitionen ... Ich habe Xbuntu 14.04 Live-CD auf einem USB verwendet. Nehmen Sie die DVD des Win-Computers heraus und setzen Sie die SSD ein. Partclone installiert und ausprobiert:

partclone.ntfs -b -N -s /dev/sda3 -o /dev/sdb3

Partclone kotzte auf den ntfs, die unter Windows chkdisk benötigen, so dass partclone mit einer schnellen Lösung glücklich wurde:

ntfsfix -b /dev/sda3
ntfsfix -d /dev/sda3

Alle Befehle werden als root ausgeführt. Die ncurses-Benutzeroberfläche von Partclone (Option -N) gab an, dass die Übertragung 7 GB / min und 5 GB / min betrug, was 83 MB / s entspricht. Der große Teil ist, dass partclone nicht ungenutzten Speicherplatz kopiert. Dadurch wurde der Klon bemerkenswert schnell.

Zusätzliche mögliche Fallstricke:

  • Wenn das Laufwerk, auf das Sie übertragen, zuvor verwendet wurde, weist es möglicherweise Reste einer GPT auf. Bei Windows 7-Werksinstallationen handelt es sich normalerweise um MSDOS / MSB-Partitionstabellen. Sie müssen die GPT-Fragmente vom Ziellaufwerk entfernen. Diese Unix- und Linux-Qualitätssicherung hat mir dabei geholfen. Sie müssen gdiskauf dem Gerät verwenden, x, dann z und yes verwenden, um GPT-Daten zu zappen und sicherzustellen, dass Sie den MBR behalten.

  • Und vergessen Sie nicht, dass Sie den MBR kopieren müssen, wenn Sie keinen Geräte-Level-Dd durchführen. Verwenden Sie dabei
    dd if=/dev/sdb of=/dev/sda bs=446 count=1
    SDB als Quelle oder altes Laufwerk und SDA als Ziel oder neues Laufwerk ( Quelle ).


1

Ich habe kürzlich ein Image einer 100-GB-Partition (HDD) erstellt und auf die neue SSD-Festplatte geschrieben.

Hier ist ein Tipp, der den Prozess drastisch beschleunigen kann :)

Datei in kleinere Teile aufteilen (je größer die Datei ist, desto langsamer funktioniert sie)

sudo dd if=/dev/sda3 conv=sync,noerror bs=2M | split -a 3 -d -b 1G - /maindisk.img

Während des Vorgangs können Sie die Geschwindigkeit mit (in separatem Terminal) überprüfen.

pgrep -l '^dd$' #to find PROCESSID
kill -USR1 PROCESSID #to check the speed

Wenn Sie dann ein Verzeichnis voller Ergebnisdateien haben (maindisk.img000, maindisk.img001 usw.), verwenden Sie

sudo cat maindisk.img* | sudo dd of=/dev/sda1

das Image in die neue Partition der SSD 'brennen' (Partition muss die gleiche Größe haben wie die alte)

Für mich hat es ein bisschen schneller geklappt als sonst (ohne zu splitten). Die durchschnittliche Geschwindigkeit zum Erstellen des Bildes betrug ~ 13 MB / s. Wenn ich die "normale" Art und Weise verwende, fängt es mit ~ 15MB / s an und geht dann auf 1MB / s zurück.


1
Warum sollte es langsamer sein, eine große Datei anstelle mehrerer kleinerer Dateien zu schreiben? Was waren der Zieldateisystemtyp und seine Mount-Flags?
David Foerster

Auch conv=syncist die Leistung nachteilig und in diesem Anwendungsfall eher unbrauchbar.
David Foerster

0

Für jeden, der diesen Thread findet, ist es viel einfacher und schneller, ein Tool wie ddrescue für die Datenwiederherstellung zu verwenden . Bei Lesefehlern wird zunächst versucht, die guten Teile zu retten. Sie können die Rettung auch jederzeit unterbrechen und später an derselben Stelle fortsetzen.

Führe es zweimal aus:

Kopieren Sie in der ersten Runde jeden Block ohne Lesefehler und protokollieren Sie die Fehler in rescue.log.

sudo ddrescue -f -n /dev/sdX /dev/sdY rescue.log

Kopieren Sie in der zweiten Runde nur die fehlerhaften Blöcke und versuchen Sie dreimal, aus der Quelle zu lesen, bevor Sie aufgeben.

sudo ddrescue -d -f -r3 /dev/sdX /dev/sdY rescue.log

Jetzt können Sie das neue Laufwerk einbinden und das Dateisystem auf Beschädigungen überprüfen.

Weitere Informationen:
https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html


0

Ich würde empfehlen, die Eingabe / Lesedatei / Festplatte auf SATA zu speichern, um die Lesegeschwindigkeit zu erhöhen. Die USB 2.0-Hochgeschwindigkeit ist auch gut, da ich mit ddrescue eine durchschnittliche Geschwindigkeit von 33816 kb / s erhalte, verglichen mit der Einstellung von USB 2.0 auf SATA bei 2014 kb / s


0

Verwenden Sie eine andere Blockgröße. Es ist die Datenmenge, die gleichzeitig ddgelesen wird. Wenn zu wenig gelesen wird, wird ein größerer Teil der Zeit für die Programmlogik aufgewendet, und wenn zu viel gelesen wird, wird viel Zeit für das Verschieben der großen Daten aufgewendet.

Verwenden Sie das folgende bashSkript, um die Geschwindigkeit bei verschiedenen Blockgrößen zu messen :

  • $devauf das Gerät einstellen
  • Stellen Sie cbtotalsicher, dass Ihre erwartete Lesegeschwindigkeit mindestens das 5-fache beträgt
    (set -o errexit; skip=0; cbtotal=$((120*1024**2)); bs=256;
    for power in `seq 10`; do
      bs=$((bs*2)); skip=$((skip/2)); count=$((cbtotal/bs));
      if [ "$count" -lt 1 ]; then break; fi;
      echo $bs;
      dd if=$dev of=/dev/null skip=$skip bs=$bs count=$count
      skip=$((skip+count))
    done)

Das Ergebnis kann aufgrund des bevorstehenden Lesens des Datenträgers in Richtung einer größeren Größe verzerrt sein - daher ist es wichtig, eine cbtotalausreichende Größe festzulegen.

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.