# Dd (Unix)

dd ist ein Unix-Kommando, das zum blockorientierten Kopieren oder Konvertieren beliebiger Dateien dient. Die Größe jedes „Datenblocks“ liegt üblicherweise zwischen einem einzigen Byte und Vielfachen der Blockgröße eines Dateisystems.

## Geschichte

Das Dienstprogramm dd war schon in den 1970er Jahren im Umlauf und hat sich seitdem unter Unix-Betriebssystemen als unverzichtbar erwiesen. Als wichtiges Standard-Werkzeug ist das Programm Teil der core utilities des GNU-Projekts geworden. Zur Datenrettung stehen verschiedene Weiterentwicklungen unter der GPL wie z. B. gddrescue zur Verfügung, die versuchen, trotz auftretender Lesefehler möglichst viele Daten wiederherzustellen. Zur Datensicherung, -Wiederherstellung und -Rettung sowie Aufgaben der Forensik entstanden weitere Programme wie dcfldd und dc3dd, die auf dem Konzept von dd aufbauen und es erweitern. Für Windows stehen verschiedene Open-Source-Portierungen von dd zur Verfügung, bspw. von Cygwin und chrysocome.net.
Die Herkunft des Programmnamens dd ist nicht gänzlich geklärt und es finden sich zahlreiche Möglichkeiten in diversen Quellen:
* In der Job Control Language (JCL) der IBM-Großrechner S/360 gibt es die Anweisung DD für „Dataset Definition“.
* Ursprünglich soll cc als Abkürzung für „copy and convert“ geplant gewesen sein, diese war aber schon für den C-Compiler vergeben.
* Darüber hinaus kann dd als „duplicate data“, „disk dump“, „data dump“, „duplicate device“, „direct disc“ oder einer anderen Kombinationen von zwei dieser Wörter verstanden werden.
Ironische Zuschreibung des Akronyms
* Wegen der häufigen Verwendung zum hardwarenahen Zugriff auf die Geräteschnittstellen von Festplatten oder deren Partitionen wird das Akronym auch als „destroy disk“ oder „delete data“ ausbuchstabiert, weil Tippfehler bei der Angabe der Ein- oder Ausgabegeräte zu vollständigem Datenverlust führen können.

## Arbeitsweise

Gemäß dem Unix-Grundsatz „everything is a file“ kann dd sowohl blockorientierte als auch zeichenbasierte Geräte bearbeiten. Die Blockgeräte benutzen zur Ein- und Ausgabe einen Pufferspeicher, der die zu übertragenden Daten in Blöcken fester Größe (englisch chunks) überträgt. Die voreingestellte Blockgröße beträgt üblicherweise 512 Bytes, kann aber über Optionen geändert werden. Alle anderen Geräte, insb. „raw devices“ wie Bandlaufwerke, gelten zwar in der hier benutzten Bedeutung als ungepuffert, dies hat auf die Funktion von dd allerdings keinen Einfluss.

### Konvertierung

dd kann die Daten beim kopieren auch konvertieren, z. B. von ASCII in EBCDIC, in Klein- oder Großbuchstaben, die Byte-Reihenfolge vertauschen oder Datensätze fester Länge in Datensätze variabler Länge umwandeln und umgekehrt.

### Statusanzeige

Gemäß POSIX-Standard gibt dd sowohl nach Abschluss der Datei-Operationen als auch bei Empfang des Signals SIGINT eine Statusmeldung auf STDERR aus. Um beim Kopieren großer Datenmengen eine Fortschrittsanzeige zu ermöglichen, wird bei den BSD- und GNU-Varianten von dd das Signal SIGUSR1 (user defined signal 1, vgl. kill) benutzt. Im Beispiel wird dazu in einer Bourne-ähnlichen Shell das dd-Programm im Hintergrund gestartet und die Prozess-ID in einer Variablen gespeichert. Die zweite Zeile gibt dann Statusinformationen aus, ohne dass der Kopierprozess beendet wird.
Unter macOS kann per Tastenkombination Strg+T der gegenwärtige Status ausgegeben werden, das sieht dann wie folgt aus:
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. Dabei wird die untere Zeile bis zur Fertigstellung aktualisiert.

## Beispiele

Typische Aufgaben für den Einsatz von dd sind z. B.:

### Sichern und Wiederherstellen einer Partition

Von einer Partition lässt sich mit dd eine exakte Kopie als normale Image-Datei im vorhandenen Dateisystem ablegen. Zweckmäßigerweise ist die Gerätedatei der Partition nicht eingehängt. Parallel laufende Schreibvorgänge im Dateisystem könnten sonst zu einem inkonsistenten Abbild führen.
Danach kann bspw. versucht werden, die Partition zu reparieren oder gelöschte Dateien wiederherzustellen. Zum Wiederherstellen des Ausgangszustandes vertauscht man Ein- und Ausgabedatei:

### Datenträger unlesbar machen

Unwiderrufliches Löschen des Inhalts einer ganzen Magnetfestplatte /dev/[blockdevice] (wie /dev/sda unter GNU/Linux oder /dev/disk1 unter macOS) einschließlich aller Partitionsinformationen:
Obwohl die Informationen auf modernen Flash-Laufwerken mit einem solchen Befehl im Allgemeinen unlesbar gemacht werden, können die ursprünglichen Daten in vielen Fällen wiederhergestellt werden. Für Flash-Laufwerke stellt diese Methode daher keine sichere Datenvernichtung dar. Für Details siehe im Hauptartikel zu Solid-State-Drives.

### Sparse-Datei erzeugen

Ein sehr einfacher Weg, unter Unix und Unix-artigen Systemen eine Sparse-Datei zu erzeugen, ist mithilfe des Parameters seek= von dd. Mit folgendem Befehl wird unter Zuhilfenahme von /dev/zero eine Sparse-Datei von 512 MiB Größe erzeugt, die auf dem Datenträger jedoch, abgesehen von den Metainformationen im Dateisystem, keinen einzigen Datenblock belegt, bis (zusätzliche) Daten in die Datei geschrieben werden.