Das Kommando dd


Prof. Jürgen Plate

Das Kommando dd

"dd" kopiert Daten "roh" (also direkt sektor- oder blockweise ohne Verwendung eines Dateisystems) zwischen Speichermedien, z. B. Festplatten(-partitionen), DVD-ROMs oder USB-Sticks. Es kann während des Kopieren auch Zeichensätze umkodieren (ASCII <-> EBCDIC) oder Blöcke konvertieren (u. a. verlängern, verkürzen oder Umwandeln zwischen Big-Endian und Little-Endian. Hauptanwendung ist aber das Kopieren zwischen Speichermedien.

Die Herkunft der Abkürzung "dd" ist nicht vollständig eindeutig. In der Job Control Language (JCL) von IBM-Großrechnern gab es die Anweisung "DD" für "Dataset Definition", was wohl eher nicht Pate für "dd" war. Ursprünglich sollte auch cc als Abkürzung für "copy and convert" angedacht, leider nannte man den C-Compiler bereits "cc". Am wahrscheinlichsten kann dd als Abkürzung für "disk dump", "data dump", "duplicate data", "duplicate device" etc. angenommen werden. Wegen der häufigen Verwendung zum hardwarenahen Zugriff auf die Device-Schnittstellen von Speichermedien oder deren Partitionen, wird "dd" scherzhaft als Akronym für "destroy disk" oder "delete data" definiert.

Die allgemeine Syntax von "dd" lautet (Achtung: Optionen werden bei "dd" ohne Bindestrich angegeben!):

  dd [Option=Wert [Option=Wert] ... ]
Ein typischer Aufruf lautet z.B.:
dd if=/dev/sdc of=/dev/sdd bs=1M count=4096
Ohne Angabe von Optionen kopiert "dd" beliebig viele Records von der Standard-Eingabe auf die Standard-Ausgabe (bis die Standard-Eingabe vollständig gelesen ist).

Als Optionen werden häufig die Anzahl der zu kopierenden Datenblöcke und deren Größe angegeben. Als Optionen sind möglich:

OptionBedeutung
if=INFILEPATHEingabe-Datei (default: Standard-Eingabe)
of=OUTFILEPATHAusgabe-Datei (default: Standard-Ausgabe)
count=NBLOCKSAnzahl der zu kopierenden Blöcke (default: alle)
bs=BLOCKSIZEBlockgröße (für Quelle und Ziel) (default: 512)
ibs=BLOCKSIZEQuell-Blockgröße (default: bs)
obs=BLOCKSIZEZiel-Blockgröße (default: bs)
cbs=BLOCKSIZEKonvertierungs-Blockgröße (default: bs)
skip=SKIPBLOCKSBlöcke der Quelle überspringen
seek=SEEKBLOCKSBlöcke des Ziels überspringen
iflag=FLAGSEingabe-Flags (kommasepariert: append, direct, dsync, sync, nonblock, nofollow, noctty)
oflag=FLAGSAusgabe-Flags (kommasepariert: wie oben)
status=noxferÜbertragungsstatistik am Ende nicht ausgeben
conv=KEYWORDSKonvertierungen (kommasepariert: ascii, ebcdic, ibm, block, unblock, lcase, ucase, swab,
nocreat, notrunc, noerror, sync, fdatasync, fsync)

Achtung: Durch den direkten Gerätezugriff ist bei Tippfehlern sehr schnell der Inhalt eines Boot-Records oder einer Partition/Festplatte zerstört (beispielsweise, wenn count vergessen oder if und of vertauscht wurde). Kleine Blockgrößen führen zu einem sehr langsamen Ablauf von dd.
Die zu kopierende Festplatte/Partition darf bei den meisten Operationen nicht gemountet sein, da sonst etwaige Schreibzugriffe während des Kopiervorgangs zu defekten Image-Dateien führen können! Am besten bootet man von einem USB-Stick und führt von dort aus die Operationen aus.

Bevor man dd ausführt sollte man unbedingt sichergehen, dass man if und of richtig angibt, ansonsten endet das Ganze sehr schnell in einem Disaster. Notfalls informiert man sich mit dem Kommando sudo fdisk -l über die vorhandene Devices.

Folgende Einheiten bei den Blockgrößen sind in Form eines Suffixes möglich:

EinheitBedeutung
leerByte
c Character
w Word (16 bit)
b Block (512 Byte)
kB K210 Byte (Kilobyte)
MB M220 Byte (Megabyte)
GB G230 Byte (Gigabyte)
TB T240 Byte (Terabyte)
PB P250 Byte (Petabyte)
EB E260 Byte (Exabyte)
ZB Z270 Byte (Zettabyte)
YB Y280 Byte (Yottabyte)

Zum Abschluss eines Kopiervorgangs gibt dd eine Ein/Ausgabstatistik auf der Standardausgabe aus, zum Beispiel:

12780+0 records in 12780+0 records  out  6543360  bytes
  (6.4 MB) copied, 5.9723 seconds, 1 MB/s
Der Wert 12780+0 bedeutet, dass 12780 vollständige Blöcke und 0 teilweise Blöcke gelesen bzw. geschrieben wurden.

dd hat selbst keine Fortschrittsanzeige. Man kann den Kopiervortschritt feststellen, indem man die Größe der Zieldatei beobachtet, z. B.:

watch --interval=10 "du -h <Zieldatei>"
Schickt man das Signal USR1 an einen dd-Prozess, so gibt dieser die aktuelle Ein-/Ausgabestatistik auf der Standardausgabe aus. Dazu schickt man dd ind den Hintergrund:
dd if=/dev/zero of=/dev/null &
PID=$!              # $! = PID des letzten Hintergrundprozesses
kill -USR1 $PID
Um beispielsweise alle 10 Skunden den Fortschritt angezeigt zu bekommen kann man watch verwenden:
sudo watch --interval 10 kill -USR1 $PID
Die dd-Implementierung der GNU Coreutils bietet ab Version 8.24 die Option status=progress, um den Status, bzw. Fortschritt des Kopierprozesses laufend anzeigen zu lassen.

Beispiele

Erste IDE-Partition komplett auf Datei (in anderer Partition!) sichern:
dd if=/dev/hda1 of=/tmp/hda1.img bs=8K
Diese IDE-Partition wiederherstellen:
dd if=/tmp/hda1.img of=/dev/hda1 bs=8K
Komplette erste SATA-Platte auf eine andere kopieren (Platte klonen):
sudo dd if=/dev/sda of=/dev/sdb bs=1M
Swap-Datei der Größe 10 MByte anlegen und verwenden:
dd if=/dev/zero of=/tmp/swapfile count=10 bs=1M
mkswap -c /tmp/swapfile 1000
swapon /tmp/swapfile
Unwiderrufliches Löschen einer ganzen Festplatte einschließlich aller Partitionsinformationen:
dd if=/dev/zero of=/dev/sda
Retten einer Datei mit fehlerhaften Blöcken:
dd if=movie.avi of=rescued_movie.avi conv=noerror
Platte über das Netz mittels dd und Netcat klonen:
Auf dem Zielrechner:
nc -l -p 2222 | dd of=/dev/sda bs=16M
Auf dem Quellrechner:
dd if=/dev/sda bs=16M | nc <Zielrechner> 2222
Festplattenimages lassen sich aber auch direkt komprimiert anlegen indem man die Angabe über das Ausgangsmedium weglässt und die Ausgabe an ein Komprimierprogramm piped:
dd if=/dev/sda | gzip --best >platte.img.gz
Zurückkopieren läßt sich das dann mit:
gunzip -c platte.img.gz | dd of=/dev/sda

Copyright © Hochschule München, FK 04, Prof. Jürgen Plate
Letzte Aktualisierung: , Webseite: