dd (Unix)

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

dd ist ein Unix-Befehl, der zum direkten Kopieren oder Verändern beliebiger Daten dient.

Hintergrund[Bearbeiten]

Das Programm dd dient zum Umleiten von Datenströmen.

dd erweitert die Funktionalität von cp und cat. Während cp mit Dateien arbeitet und diese kopiert, kann dd Daten aus Datenströmen ausschneiden (beispielsweise erst bei Byteposition 5.000 anfangen zu lesen). dd wird sehr häufig zum Kopieren von Inhalten von Datenträgern per Gerätedateien benutzt. Allerdings unterscheidet sich die Verwendung von dd für diese Art von Kopieraktionen praktisch nicht von der Verwendung von cp. Beide Programme nutzen die POSIX-Funktionen open(), read(), write() und close(). Technisch gesehen verhalten sich cp und dd in den einfachen Verwendungsarten also identisch. So ist beispielsweise die Zeile

$ dd if=/dev/hda of=hda.dump

äquivalent zu jeder einzelnen der folgenden Zeilen (mit der Ausnahme, dass bei den Umleitungsoperatoren die Geräte und Dateien mit der Shell geöffnet werden):

$ cp /dev/hda hda.dump
$ dd </dev/hda >hda.dump
$ cat </dev/hda >hda.dump

Geschichte[Bearbeiten]

dd wurde in den 1970er Jahren eingeführt. Der Name spielt auf die DD-Anweisung („DD“ für englisch „data definition“) aus der Job Control Language an. Der Name sollte eigentlich auf „cc“ lauten, was als Kürzel für „Copy and Convert“ stehen sollte, das Programmkürzel war aber schon an den C-Compiler vergeben. Weiterhin hatten ältere IBM-Betriebssysteme für Großrechner ein Programm namens „DDR“ („Disk Dump and Restore“), von dem das dd-Kommando inspiriert wurde. Es etablierte sich als Standard-Werkzeug von Unix-Umgebungen und wurde oft nachgebaut. Eine wichtige Implementierung ist die des GNU-Projektes, die ursprünglich von Paul Rubin, David MacKenzie und Stuart Kemp geschrieben wurde und sich in praktisch allen GNU/Linux-Distributionen findet. Neben Implementierungen desselben Funktionsumfanges gibt es auch zahlreiche angepasste Fassungen, die zum Beispiel auf die Anwendung zur Datenrettung und Forensik spezialisiert sind. Die Software Ghost sowie deren Klone und Erben bauten auf das Konzept von dd auf und erweiterten es.[1]

Benutzung[Bearbeiten]

Die Syntax zum Aufruf von dd unterscheidet sich deutlich von der anderer Unix-Kommandos, zum Beispiel cp. So werden als Argumente für dd (beliebig viele) Operanden erwartet.

dd [Operand]...

Operanden[Bearbeiten]

Option Erläuterung
if=Datei Der Datenstrom, der umgeleitet werden soll (input file). Das kann eine Datei oder ein Datenstrom (ohne Angabe wird vom Standardeingabestrom gelesen), aber auch eine Festplatte oder ein anderes Gerät (Gerätedatei, Everything is a file) sein.
of=Datei Die Datei, auf die geschrieben werden soll (output file). Dies kann wieder eine Datei (auch eine Gerätedatei) sein. Wird of weggelassen, schreibt dd auf die Standardausgabe und kann wiederum ebenfalls in eine (Geräte-)Datei umgeleitet werden.
ibs=Bytes Eingabe-Blockgröße (input block size), gibt an, wie viele Bytes auf einmal gelesen werden sollen.
obs=Bytes Ausgabe-Blockgröße (output block size), gibt an, wie viele Bytes auf einmal geschrieben werden sollen.
bs=Bytes Kurzschreibweise für ibs=Bytes obs=Bytes. Der Standardwert bei Nichtangabe ist 512 Bytes (bei cp ist die Standardblockgröße 8192 Byte).

Beim Auslesen von Festplatten wird für eine bessere Leistung hier der Wert „2K“ für 2048 Byte empfohlen.

count=Blocks Angabe, um nur eine begrenzte Menge Blöcke zu kopieren.
skip=Blocks Angabe, um eine Anzahl Blöcke zu überspringen.
seek=blocks Überspringt diese Anzahl Blöcke beim Schreiben auf die Ausgabe.
conv=Schlüsselwörter Wandelt die Datei entsprechend einer kommagetrennten Liste von Schlüsselwörtern um.
cbs=Bytes Umwandlungs-Blockgröße (convert block size): Größe der Blöcke zum Umwandeln auf einmal.

Messung des Fortschrittes und Durchsatzes[Bearbeiten]

Oft wird das Fehlen eines Fortschrittsbalkens bzw. von Ausgaben von dd bemängelt. Die meisten Implementierungen von dd geben jedoch beim Empfang eines bestimmten Signals (USR1 bei GNU-dd oder SIGINFO bei den Implementierungen unter *BSD und Mac OS X) eine Statusausgabe aus. Indem der Anwender das Programm kill nutzt, kann er sich dementsprechend über den Fortschritt von dd informieren:

Beispiel
Zeit In einem Terminal In einem anderen Terminal
t1 $ dd if=/dev/dvd of=image.iso
t2 $ killall -USR1 dd
Mac: sudo kill -siginfo Prozess-ID von DD
t3

262+1 Datensätze ein
262+1 Datensätze aus
551077888 Bytes (551 MB) kopiert, 173,859 s, 3,2 MB/s

Bei jedem Empfang des USR1 bzw. SIGINFO-Signals gibt dd eine solche Statusmeldung aus. Das kill-Programm selbst gibt hingegen bei Erfolg gar keine Ausgaben aus. Selbstverständlich kann das kill-Kommando mehrmals aufgerufen werden, auch automatisiert (zum Beispiel wiederholt $ watch -n N kill -USR1 `pidof dd` den Aufruf alle N Sekunden.)

Beispiele[Bearbeiten]

Einige einfache Beispiele zum Verdeutlichen der Funktionalität. Diese ließen sich ebenfalls allein mit cp umsetzen, der äquivalente Befehl ist daher in der zweiten Spalte angegeben.

mit dd mit cp Erläuterung
dd if=/dev/urandom of=/dev/hda cp /dev/urandom /dev/hda Überschreibt die Festplatte hda mit Pseudozufallszahlen
dd if=/dev/hda of=/dev/hdb cp /dev/hda /dev/hdb Kopiert eine komplette Festplatte (hda) auf eine andere (hdb)
dd if=/dev/hda3 of=./hda3.img cp /dev/hda3 ./hda3.img Erstellt ein Abbild der Festplattenpartition

Vor allem im Zusammenhang mit der zunehmenden Verbreitung des Unix-Derivates Linux auf dem Desktop wird dd von unerfahrenen Benutzern oft überbewertet. Neben Aufgaben, die sich ebenso mit cp umsetzen lassen, wird dd oft an Stellen eingesetzt, wo Streamumleitungen sowie Pipes eine wesentlich einfachere und elegantere Lösung darstellen würden.

mit dd eleganter mit Umleitungen Erläuterung
dd if=/dev/hda1 | gzip > /tmp/partition_image.gz gzip -c < /dev/hda1 > /tmp/partition_image.gz Erstellt eine mit gzip komprimierte Abbilddatei einer Festplattenpartition.

Bei der Verwendung des gepufferten Gerätes ist die Benutzung von dd hier überflüssig und hätte denselben Effekt wie die unnötige Nutzung von cat /dev/hda1 | .... Durch Benutzung von < und > können allerdings die Ein-/Ausgabedateien direkt umgeleitet werden. Das ist auch ressourcenschonender, weil weniger neue Prozesse laufen müssen. Bei ungepufferten Geräten muss allerdings sichergestellt werden, dass jede Leseoperation mit Ganzzahligen Vielfachen der Sektorgröße arbeitet.
Beachte, dass gzip nur einen Prozessor verwendet. Um mehrere Prozessoren bei der Kompression zu verwenden, kann beispielsweise pigz verwendet werden.

gunzip -c /tmp/partition_image.gz | dd of=/dev/hdc7 gunzip -c /tmp/partition_image.gz > /dev/hdc7 Dekomprimiert und lädt die Abbilddatei auf eine Partition.

Auch hier ist der dd-Befehl überflüssig.

Erst bei komplexeren Anwendungen von dd zeigt sich dessen wirkliche Überlegenheit gegenüber cp sowie den Stream-Umleitungsoperatoren. Einige exemplarische Beispiele verdeutlichen die Flexibilität und Vielseitigkeit, die sich durch die Kombination von dd mit Streamumleitungen, welche zum Standardfunktionsumfang von Unix-Shells gehören, sowie weiteren traditionellen Unix-Befehlen ergibt.

Kommando Erläuterung
dd if=/dev/random bs=1M count=256 | progressbar >./256-MB-random-data.bin Das dd-Kommando liest 256 mal ein Megabyte Zufallsdaten ein, übergibt sie einem (fiktiven) Programm, welches einen Fortschrittsbalken darstellt. Die Daten werden dann in eine Datei umgeleitet.
dd if=/dev/hda bs=512 count=1 of=./mbr-backup.bin dd liest die ersten 512 Byte der Festplatte hda ein; üblicherweise enthalten diese 512 Byte den Bootsektor (Master Boot Record), inklusive der Partitionstabelle.[2]
dd if=/dev/zero of=sparsefile bs=1 count=0 seek=10M dd erstellt eine Sparse-Datei von 10 MB Größe.
dd if=quelldatei of=zieldatei conv=notrunc dd ersetzt den Beginn der Datei zieldatei durch den kompletten Inhalt von quelldatei. Mit anderen Worten: dd schreibt den Inhalt von quelldatei in zieldatei, ohne zieldatei abzuschneiden, falls dieses größer als die Quelldatei ist. Der Rest von zieldatei bleibt in diesem also erhalten. Auf diese Weise kann man beispielsweise den Bootsektor eines Plattenabbildes ersetzen.

Alternativen und Erweiterungen[Bearbeiten]

Es gibt einige Alternativen und Erweiterungen des dd Programmes. Die bekanntesten Alternativen sind:

  • ddrescue[3] – erweiterte Funktionalität für den Zugriff auf beschädigte Datenträger (bricht den Kopiervorgang nicht ab)
  • dcfldd[4] – mit erweiterter Ausgabe und benutzt dieselbe Syntax wie dd
  • dc3dd[5] – mit Statusleiste des Prozesses und erweiterter Ausgabe

Weblinks[Bearbeiten]

Einzelnachweise[Bearbeiten]

  1. http://softpanorama.org/Tools/dd.shtml
  2. Kopieren des Bootloaders und der Partitionstabellen
  3. http://www.gnu.org/software/ddrescue/ddrescue.html – Bestandteil der coreutils http://www.gnu.org/software/coreutils/
  4. http://dcfldd.sourceforge.net/
  5. http://sourceforge.net/projects/dc3dd/