2008-09-29 9 views
39

Angenommen, ich möchte meine Festplatte (hda) auf einem anderen Laufwerk (hdb) im selben Computer klonen. Wie ich es sehe, gibt es zwei einfache, raue und Do-it-yourself-Möglichkeiten:Ist dd besser als Katze?

cat /dev/hda > /dev/hdb

und

dd if=/dev/hda of=/dev/hdb

Welche technischen Gründen gibt es zu, dass diese oft immer gesagt/besser zu sein als der ehemalige?

unter keinen Umständen versuchen, diese Befehle zu Hause oder Ihre UNIX

+0

gnu ddrescue ist besser als dd – endolith

Antwort

25

Der große Unterschied zwischen einfach 'cat' und 'dd' ist, dass dd versichert, dass alle Lese-und Schreibvorgänge mit der angegebenen Größe erfolgen. Je nachdem, welches Gerät (und welche Version von * nix) Sie verwenden, kann dies erheblich sein.

+2

Sehr wichtig, wenn Sie mit einem Band sprechen. Weniger bedeutend bei modernen Geräten. Aber Sie wollen immer noch manchmal die detaillierte Kontrolle, die dd Ihnen geben kann. – Darron

+14

* Wann ist das signifikant? Das ist nur eine halbe oder weniger Antwort. – endolith

4

Ich denke, es könnte fubar'd für das Senden Sie alle Ihre Daten durch das Rohr eine Leistungseinbuße sein. dd macht alles in einem Programm und ist wahrscheinlich für Blocklese- und -schreibvorgänge optimiert.

+0

+1 ... aber vielleicht um klar zu sein ... nur ein Programm ist dd beteiligt, wo wie bei cat die Shell beteiligt ist und Daten durch ein ipc Rohr übergeben werden – epatel

+1

nicht sei dir da zu sicher. http://prstat.blogspot.com/2008/04/why-cat1-ran-faster-than-dd1m.html – olle

+0

interessant ... aber sie zählen syscalls ...und ich sehe nicht, dass sie die Aufrufe der Shell zählen, da die Shell das Schreiben auf die Festplatte ausführt. – epatel

2

Wenn ich mich richtig erinnere, dd ist viel mehr „low level“ in Ansatz ist, so ausgefallene Dinge wie Dateisysteme Überspringen und alle Glocken und Trillerpfeifen :)

Einmal, dd buchstäblich mein kostbares gerettet, ehm, Leben:

stucked mit einer Linux-Box voll von "Absolut unwiderruflichen Daten" von einem Auftragnehmer, mit waaaay zu vielen schlechten Sektoren, die das einzige Ding verwendbar war, das Notfall-Linux-Oberteil war. Erwähnte ich die Unmöglichkeit, die Box zu öffnen, um die Festplatte zu bekommen? Ah, ja, kein usb und der solcher ...

Und dann, das Licht !!! dd und ftp arbeiten !!! Ahhh, Auffrischung! Speichern Sie den Tag (und Karriere) mit einer ordentlichen Linie Beschwörung Befehl ein Backup-Dump auf einem Remote-Platte mit ftp zu machen ...

So etwas wie put |dd if=/dev/hda bs=4096 count= ???? oder ähnliches ...

Katze nur knapp sein Ziel für mich die Arbeit dann ...

-2

dd sollte schneller sein, weil es die E/A intern tut, im Gegensatz zu cat, die stdio und die Shell für I/O verwendet.

+0

Nein, tut es nicht. Die Shell wird nur dann einbezogen, wenn sie Text in stdout empfängt, andernfalls wird im Fall eines 'cat foo> -Bar 'die Kopie intern behandelt. Deshalb ist es viel schneller, ein Protokoll (z. B. 2 MiB) in eine Textdatei zu senden und später zu lesen, als es direkt in die Shell zu drucken. Betrachte 'cat/dev/cdrom' vs.' cat/dev/cdrom> file.iso'; letzteres läuft deutlich schneller und endet [noch schneller als dd] (http://stackoverflow.com/a/150989/1175714), wenn keine BS angegeben ist –

+0

Hier ist mehr: http://prstat.blogspot.com/2008/ 04/why-cat1-ran-schneller-als-dd1m.html –

2

Es gibt wenig praktischen Unterschied mehr.
Intern optomisieren sie beide die gleichen cals.

dd verfügt über eine Reihe nützlicher Zusatzfunktionen für komplexere Datenkopien und könnte von anderen Benutzern als "normaler" Typ für diese Art von Aufgabe erkannt werden. Aber einfach 'Katze' ist in der Essenz von Unix,

0

Interessant ... Ich habe in der Vergangenheit Empfehlungen gesehen, diese Art von Kopieroperation mit verschiedenen Permutationen von dd, cpio oder tar, aber nie Katze.

Ich möchte immer sagen, dass es eine Sache von Katze ist, die Text-orientiert und die anderen binär-Daten-orientierte oder dass dd kann leichter mit unformatierten Raum umgehen, aber * nix macht nicht wirklich einen Text/Binärunterscheidung und Kopieren der Gerätedatei wird das Dateisystem mit der Kopie übernehmen, so dass Formatierung kein Problem sein sollte.

dd hat viele zusätzliche Optionen für die Datenkonvertierung im Prozess der Übertragung, aber ich würde nicht erwarten, dass dies besonders wichtig bei der Übertragung des Dateisystems selbst und nicht nur seinen Inhalt ist.

26

Ein paar Punkte.

ltrace cat </dev/zero >/dev/null schlägt vor, dass Katze ist effizienter standardmäßig, da es nicht Memcpy und wichtiger 4KiB Puffer standardmäßig verwendet.

ltrace dd if=/dev/zero of=/dev/null zeigt, dass dd defaults 512B Puffer zu verwenden, die für das Lesen von modernen Festplatten sehr ineffizient ist (obwohl der Kernel dies etwas mit verschiedenen Plattenplanung erleichtern sollte). jedoch dd ist viel mehr konfigurierbar als Katze und Sie können so etwas wie bs = 2M verwenden, um die Anzahl der syscalls

dd ist problematisch, in Gegenwart von Festplattenfehlern zu verringern und hängen oder was noch wichtiger ist nicht lesbare Daten ignorieren wodurch die Zielfestplatte beschädigt wird. Betrachten Sie stattdessen dd_rescue oder ddrescue für diese Aufgabe.

+0

in ubuntu, dass ltrace Linie zu tun, es sieht aus wie Katze 64KB Puffer verwendet – barlop

+0

Ja, das hat in der letzten coreutils Mitteilungen – pixelbeat

19

Es ist wirklich historisch, und nicht so wichtig, wenn alles, was Sie tun werden, ist, eine Platte zu einer anderen zu klonen.

Auf herkömmlichen Unix-Systemen waren die Festplatten sowohl über Block- als auch über Zeichengeräte zugänglich und hatten unterschiedliche Anforderungen. 'dd' wurde benötigt, um mit den Block-Geräten zu interagieren, da 'cat' nur über Zeichen-I/O wusste. (Block E/A war besonders wichtig für den effizienten Umgang mit Dingen wie Bandlaufwerken.)

dd kann nützlich sein, wenn Sie eine lang laufende Kopie wegen seiner Skip-und-Suchoptionen neu starten müssen.

Es sei denn, Sie sind auf einem System, das immer noch die Block/Charakter-Unterscheidung für den Festplattenzugriff hat (was Linux nicht tut), und wenn Sie etwas wie Swap-Bytes tun müssen, wird "cat" in Ordnung sein schneller, weil es standardmäßig größere Blockgrößen als dd verwendet).

Beachten Sie, dass, es sei denn, jemand einige große Bastelei in Shell-Design seit dem letzten getan Ich sah, ‚cat foo> bar‘ tut nicht das Schreiben tun, um ‚bar‘ über die Shell; Alle Shells öffnen einen 'Balken' zum Schreiben mit Trunkierung und übergeben den geöffneten Dateideskriptor als Dateideskriptor 1 (stdout) an 'cat' über eine fork/exec. Zu diesem Zeitpunkt befindet sich die Shell außerhalb der Schleife und wird nicht erneut involviert, nachdem sie über den Beendigungsstatus von 'Katze' informiert wurde.

+1

keine Frage, dass die dd Standard-Blockgröße ist klein und unglaublich langsam, kann .. aber interessanterweise geändert, obwohl erhöht worden ist, nach diese Seite http://prstat.blogspot.co.uk/2008/04/why-cat1-ran-faster-than-dd1m.html auch wenn Sie dd sagen eine große Blockgröße zu verwenden, Katze ist schneller – barlop

0

Sie möchten dd verwenden, so dass Sie Dinge wie bsize angeben können, das heißt, wie viel auf einmal gelesen/geschrieben werden soll; Tuning dies zu einigen Vielfachen von 4k wird viel schneller als Katze, die ist, denke ich, wird durch die beteiligten Rohre begrenzt werden.

3

Ich war auf Ubuntu 12.04 und meine Erfahrung war, dass ich eine Partition "cat" (/ dev/sda1) aber nicht das ganze Gerät (/ dev/sda). Ich konnte ein Gerät nur mit `dd 'erfolgreich klonen. Irgendwie gingen die Partitionsinformationen und der Bootsektor verloren, wenn cat/dev/sda.

+0

Willkommen SO ! Dies scheint keine Antwort zu sein. Bitte beachten Sie, SO ist eine Frage/Antwort-Website, kein Forum. – Jacinda

+2

Ich denke, dass dies eine anständige Antwort. Die Frage selbst ist weitgehend subjektiv, daher ist die Angabe von Unterschieden von viel besserer Qualität, und dies ist ein wichtiger Unterschied. – MDMoore313