![]() |
Das Kommando ddProf. Jürgen Plate |
"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=4096Ohne 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:
Option | Bedeutung |
---|---|
if=INFILEPATH | Eingabe-Datei (default: Standard-Eingabe) |
of=OUTFILEPATH | Ausgabe-Datei (default: Standard-Ausgabe) |
count=NBLOCKS | Anzahl der zu kopierenden Blöcke (default: alle) |
bs=BLOCKSIZE | Blockgröße (für Quelle und Ziel) (default: 512) |
ibs=BLOCKSIZE | Quell-Blockgröße (default: bs) |
obs=BLOCKSIZE | Ziel-Blockgröße (default: bs) |
cbs=BLOCKSIZE | Konvertierungs-Blockgröße (default: bs) |
skip=SKIPBLOCKS | Blöcke der Quelle überspringen |
seek=SEEKBLOCKS | Blöcke des Ziels überspringen |
iflag=FLAGS | Eingabe-Flags (kommasepariert: append, direct, dsync, sync, nonblock, nofollow, noctty) |
oflag=FLAGS | Ausgabe-Flags (kommasepariert: wie oben) |
status=noxfer | Übertragungsstatistik am Ende nicht ausgeben |
conv=KEYWORDS | Konvertierungen (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:
Einheit | Bedeutung |
---|---|
leer | Byte |
c | Character |
w | Word (16 bit) |
b | Block (512 Byte) |
kB K | 210 Byte (Kilobyte) |
MB M | 220 Byte (Megabyte) |
GB G | 230 Byte (Gigabyte) |
TB T | 240 Byte (Terabyte) |
PB P | 250 Byte (Petabyte) |
EB E | 260 Byte (Exabyte) |
ZB Z | 270 Byte (Zettabyte) |
YB Y | 280 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/sDer 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 $PIDUm beispielsweise alle 10 Skunden den Fortschritt angezeigt zu bekommen kann man watch verwenden:
sudo watch --interval 10 kill -USR1 $PIDDie 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.
dd if=/dev/hda1 of=/tmp/hda1.img bs=8KDiese IDE-Partition wiederherstellen:
dd if=/tmp/hda1.img of=/dev/hda1 bs=8KKomplette erste SATA-Platte auf eine andere kopieren (Platte klonen):
sudo dd if=/dev/sda of=/dev/sdb bs=1MSwap-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/swapfileUnwiderrufliches Löschen einer ganzen Festplatte einschließlich aller Partitionsinformationen:
dd if=/dev/zero of=/dev/sdaRetten einer Datei mit fehlerhaften Blöcken:
dd if=movie.avi of=rescued_movie.avi conv=noerrorPlatte über das Netz mittels dd und Netcat klonen:
nc -l -p 2222 | dd of=/dev/sda bs=16MAuf dem Quellrechner:
dd if=/dev/sda bs=16M | nc <Zielrechner> 2222Festplattenimages 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.gzZurückkopieren läßt sich das dann mit:
gunzip -c platte.img.gz | dd of=/dev/sda