dd (Unix)


aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Das Programm dd ist ein Unix-Befehl, der für das blockorientierte Kopieren oder Konvertieren beliebiger Dateien dient. Die Größe jedes „Datenblocks“ liegt üblicherweise zwischen einem einzigen Byte und Vielfachen der Blockgröße eines Dateisystems.

Geschichte

Das Dienstprogramm dd war schon in den 1970er Jahren im Umlauf und hat sich seitdem unter Unix-Betriebssystemen als unverzichtbar erwiesen.<ref name=dd_tool>DD Command. Dr. Nikolai Bezroukov, softpanorama.org, abgerufen am 13. Juni 2014 (english): „It is jokingly said that dd stands for "destroy disk" or "delete data", since, being used for low-level operations on hard disks, a small mistake, such as reversing the if and of parameters, may accidentally render the entire disk unusable.“</ref> Als wichtiges Standard-Werkzeug ist das Programm Teil der core utilities des GNU-Projekts geworden. Zur Datenrettung stehen verschiedene Weiterentwicklungen unter der GPL wie z. B. gddrescue<ref>Ddrescue – Data recovery tool. stack exchange inc, 4. November 2012, abgerufen am 29. Juni 2014 (english).</ref> zur Verfügung, die versuchen trotz auftretender Lesefehler möglichst viele Daten wiederherzustellen.<ref>What's the difference between ddrescue, gddrescue, and dd_rescue? Abgerufen am 5. Juli 2014 (english).</ref> Zur Datensicherung, -Wiederherstellung und -Rettung sowie Aufgaben der Forensik entstanden weitere Programme wie dcfldd<ref name="dcfldd">dcfldd. 16. Juni 2014, abgerufen am 29. Juni 2014 (english): „An Enhanced version of gnu dd with features useful for forensics and security. Key features include on-the-fly hashing, status output and faster disk wiping.“</ref> und dc3dd,<ref>dc3dd. 22. April 2013, abgerufen am 29. Juni 2014 (english): „A patch to the GNU dd program, this version has several features intended for forensic acquisition of data. Highlights include hashing on-the-fly, split output files, pattern writing, a progress meter, and file verification.“</ref> die auf dem Konzept von dd aufbauen und es erweitern.<ref>Linux 'dd' basics. Forensic Focus, abgerufen am 13. Juni 2014 (english).</ref> Für Microsoft Windows stehen verschiedene Opensource-Portierungen von dd zur Verfügung, bspw. von Cygwin und chrysocome.net.<ref>dd for windows. chrysocome.net, 17. Juli 2010, abgerufen am 29. Juni 2014 (english).</ref>

Die Herkunft des Programmnamens dd ist nicht gänzlich geklärt und es finden sich zahlreiche Möglichkeiten in diversen Quellen:

  • In der Job Control Language (JCL) der IBM-Großrechner S/360 gibt es die Anweisung DD für „Dataset Definition“.<ref name="plate">Prof. Jürgen Plate: Vorlesung „UNIX“. Abgerufen am 14. Juni 2014: „Abschnitt 10.3 The UNIX Acrony List: (opinion 1) Dataset Definition (named after the OS/3x0 JCL DD command who's syntax it also ripped off as a joke); (opinion 2) copy and convert (called `dd' because `cc' is the C compiler); (opinions 3-n) data, device, disk, dump in various combinations“</ref>
  • Ursprünglich soll cc als Abkürzung für „copy and convert“ geplant gewesen sein, diese war aber schon für den C-Compiler vergeben.<ref>Peter Funk: The Unix Acronym List. Wolfram Rösler, abgerufen am 14. Juni 2014: „Eigentlich `Copy and Convert' und nur zu `dd' umbenannt, weil `cc' schon durch den `C-Compiler' belegt war! Das ist jedenfalls die authentische Auskunft, die ich damals den Man-Pages unseres UNIX-V7 auf unserer Uni PDP-11 entnommen habe.“</ref>
  • Darüber hinaus kann dd als „duplicate data“, „disk dump“, „data dump“, „duplicate device“ oder einer anderen Kombinationen von zwei dieser Wörter verstanden werden.<ref name="plate" /><ref>Mike Shema: Anti-Hacker Tool Kit, 4. Auflage, McGraw-Hill Education, 2014, ISBN 978-0-07-180014-3. S. 536</ref>
  • Wegen der häufigen Verwendung zum hardwarenahen Zugriff auf die Geräteschnittstellen von Festplatten oder deren Partitionen, wird das Akronym auch als „destroy disk“ oder „delete data“ ausbuchstabiert, weil Tippfehler bei der Angabe der Ein- oder Ausgabegeräte zu vollständigem Datenverlust führen können.<ref name="dd_tool" />

Arbeitsweise

Gemäß dem Unix-Grundsatz everything is a file kann dd sowohl blockorientierte als auch zeichenbasierte Geräte bearbeiten. Die Blockgeräte benutzen zur Ein- und Ausgabe einen Pufferspeicher, der die zu übertragenden Daten in Blöcken fester Größe (engl. chunks) überträgt. Die voreingestellte Blockgröße beträgt üblicherweise 512 Bytes, kann aber über Optionen geändert werden. Alle anderen Geräte, insb. „raw devices“ wie Bandlaufwerke gelten zwar in der hier benutzten Bedeutung als ungepuffert, dies hat auf die Funktion von dd allerdings keinen Einfluss.

Konvertierung

dd kann die Daten beim Kopieren auch Konvertieren, z. B. von ASCII in EBCDIC, in Klein- oder Großbuchstaben, die Byte-Reihenfolge vertauschen oder Datensätze fester Länge in Datensätze variabler Länge umwandeln und umgekehrt.

Statusanzeige

Gemäß POSIX-Standard gibt dd sowohl nach Abschluss der Datei-Operationen als auch bei Empfang des Signals SIGINT eine Statusmeldung auf STDERR aus.<ref>dd gemäß Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition. The IEEE and The Open Group, 2004, abgerufen am 18. Juni 2014 (english).</ref> Um beim Kopieren großer Datenmengen eine Fortschrittsanzeige zu ermöglichen, wird bei den BSD-<ref>DD(1) – OpenBSD Reference Manual. OpenBSD.org, abgerufen am 18. Juni 2014 (english): „If dd receives a SIGINFO (see the "status" argument for stty(1)]) signal, the current input and output block counts will be written to the standard error output in the same format as the standard completion message.“</ref> und GNU-Varianten<ref name=gnu_dd_status>dd invocation. gnu.org, abgerufen am 18. Juni 2014 (english): „Sending an ‘INFO’ signal to a running dd process makes it print I/O statistics to standard error and then resume copying. ... On systems lacking the ‘INFO’ signal dd responds to the ‘USR1’ signal instead, unless the POSIXLY_CORRECT environment variable is set.“</ref> von dd das Signal SIGUSR1 (user defined signal 1, vgl. kill) benutzt. Im Beispiel wird dazu in einer Bourne-ähnlichen Shell das dd-Programm im Hintergrund gestartet und die Prozess-ID in einer Variablen gespeichert. Die zweite Zeile gibt dann Statusinformationen aus, ohne dass der Kopierprozess beendet wird.<ref name=gnu_dd_status/>

<syntaxhighlight lang="bash"> dd if=/dev/zero of=/dev/null count=10MB & pid=$! kill -s INFO $pid; wait $pid </syntaxhighlight>

Auch dcfldd erweitert dd um eine Statusanzeige.<ref name=dcfldd/>

Beispiele

Typische Aufgaben für den Einsatz von dd sind z. B.:

Sichern und Wiederherstellen einer Partition

Von einer Partition lässt sich mit dd eine exakte Kopie als normale Image-Datei im vorhandenen Dateisystem ablegen. Zweckmässigerweise ist die Gerätedatei der Partition nicht eingehängt, damit ein versehentliches Vertauschen von if= und of= nicht zu Datenverlust führen kann. <syntaxhighlight lang="bash"> dd if=/dev/sda1 of=/tmp/sda1_image </syntaxhighlight>

Danach kann bspw. ein „Undelete“ (undelete) auf einem ext2/ext3/ext4-Dateissystem mit debugfs -w /dev/sda1 versucht werden. Zum Wiederherstellen des Ausgangszustandes vertauscht man Ein- und Ausgabedatei: <syntaxhighlight lang="bash"> dd of=/dev/sda1 if=/tmp/sda1_image </syntaxhighlight>

Datenträger unlesbar machen

Unwiderrufliches Löschen einer ganzen Festplatte /dev/sda einschließlich aller Partitionsinformationen mit /dev/urandom unter GNU/Linux: <syntaxhighlight lang="bash"> dd if=/dev/urandom of=/dev/sda </syntaxhighlight>

Weblinks

Anmerkungen

<references />