- dd (Unix)
-
dd ist ein Unix-Befehl, der zum Kopieren und Beschneiden von Datenströmen dient.
Inhaltsverzeichnis
Hintergrund
dd dient zum Umleiten von Datenströmen.
dd erweitert die Funktionalität von cp und cat. Während cp mit Dateien umgeht 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
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 des selben 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
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
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
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/sBei 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
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 ist 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 beispielsweisepigz
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. 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
Alternativen sind
Weblinks
dd(1)
– Linux-Manpage (Englisch)- dd for Windows
Einzelnachweise
Kategorien:- Unix-Software
- GNU core utilities
Wikimedia Foundation.