- 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. Der Name sollte früher Copy and Convert bedeuten, das Programmkürzel cc war aber schon an den C-Compiler vergeben. Daher kam es zu dd, als Kürzel für data definition.
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 Devices und Dateien mit der Shell geöffnet werden):
cp /dev/hda hda.dump dd </dev/hda >hda.dump cat </dev/hda >hda.dump
Benutzung
Die Syntax zum Aufruf von dd unterscheidet sich deutlich von der anderer Unix-Kommandos, z.B. 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. 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. 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 ein Mal gelesen werden sollen. obs=Bytes Ausgabe-Blockgröße (output block size), gibt an, wie viele Bytes auf ein Mal 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 Performance 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 Blocks 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 ein Mal. Messung des Fortschrittes und Durchsatzes
Oft wird das Fehlen einer Fortschrittsleiste bzw. von Ausgaben von dd bemängelt. Implementierungen von dd sind jedoch daran gehalten, beim Empfangen des Signals USR1 eine solche Statusausgabe auszugeben. Indem der Anwender das Programm kill nutzt, kann er sich dementsprechend über den Fortschritt von dd informieren:
Beispiel In einem Terminal In einem anderen Terminal $ dd if=/dev/dvd of=image.iso 262+1 Datensätze ein 262+1 Datensätze aus 551077888 Bytes (551 MB) kopiert, 173,859 s, 3,2 MB/s
$ kill -USR1 `pidof dd`
Bei jedem Empfang des USR1-Signals gibt dd eine solche Statusmeldung aus.
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 gesamte Festplatte hda auf eine andere (hdb) dd if=/dev/hda3 of=./hda3.img
cp /dev/hda3 ./hda3.img
Erstellt ein Image 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 auch oft an Stellen eingesetzt, wo Stream-Umleitungen 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 ein mit gzip komprimiertes Image einer Festplattenpartition.
Die Benutzung von dd ist hier völlig überflüssig und hätte denselben Effekt wie die unnötige Nutzung voncat /dev/hda1 | ...
. Durch Benutzung von<
und>
können allerdings die Ein-/Ausgabedateien direkt umgeleitet werden. Dies ist auch ressourcenschonender, weil weniger neue Prozesse laufen müssen.gunzip -c /tmp/partition_image.gz | dd of=/dev/hdc7
gunzip -c /tmp/partition_image.gz > /dev/hdc7
Dekomprimiert und lädt das Image 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 beinhalten 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=sourcefile of=targetfile conv=notrunc
dd ersetzt den Beginn der Datei targetfile durch den kompletten Inhalt von sourcefile. Mit anderen Worten: dd schreibt den Inhalt von sourcefile in targetfile, ohne targetfile abzuschneiden, falls dieses Größer als die Quelldatei ist. Der Rest von targetfile bleibt in diesem also erhalten. Auf diese Weise kann man beispielsweise den Bootsektor eines Plattenimages ersetzen. Weblinks
dd(1)
– Linux-Manpage (Englisch)- dd für Windows
Wikimedia Foundation.