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
BearbeitenDas Dienstprogramm dd
war schon in den 1970er Jahren im Umlauf und hat sich seitdem unter Unix-Betriebssystemen als unverzichtbar erwiesen.[1] 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[2] zur Verfügung, die versuchen, trotz auftretender Lesefehler möglichst viele Daten wiederherzustellen.[3] Zur Datensicherung, -Wiederherstellung und -Rettung sowie Aufgaben der Forensik entstanden weitere Programme wie dcfldd[4] und dc3dd,[5] die auf dem Konzept von dd
aufbauen und es erweitern.[6] Für Windows stehen verschiedene Open-Source-Portierungen von dd
zur Verfügung, bspw. von Cygwin und chrysocome.net.[7]
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“.[8] - 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.[9] - 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.[8][10]
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.[1]
Arbeitsweise
BearbeitenGemäß 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
Bearbeitendd
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
BearbeitenGemäß POSIX-Standard gibt dd
sowohl nach Abschluss der Datei-Operationen als auch bei Empfang des Signals SIGINT eine Statusmeldung auf STDERR aus.[11] Um beim Kopieren großer Datenmengen eine Fortschrittsanzeige zu ermöglichen, wird bei den BSD-[12] und GNU-Varianten[13] 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.[13]
dd if=/dev/urandom of=/dev/null bs=1M count=1K & pid=$! # schreibt 1024^2 Byte große Zufalls-Blöcke 1024 mal nach /dev/null (1 GiB Gesamtgröße)
while kill -USR1 $pid; do sleep 1; done # sendet jede Sekunde das Signal SIGUSR1 an den DD-Prozess, solange dieser existiert
Unter macOS kann per Tastenkombination Strg+T der gegenwärtige Status ausgegeben werden, das sieht dann wie folgt aus:[14]
wpuser@mac ~ % sudo dd if=/Users/wpuser/theimage.img of=/dev/disk6
load: 2.77 cmd: dd 6426 uninterruptible 0.00u 5.01s
526+0 records in
525+0 records out
550328100 bytes transferred in 431.900020 secs (1274203 bytes/sec)
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.[15] Dabei wird die untere Zeile bis zur Fertigstellung aktualisiert.
dd if=eingabedatei of=ausgabedatei bs=1M count=1K status=progress
283238400 Bytes (283 MB, 270 MiB) kopiert, 2 s, 142 MB/s
[…]
Beispiele
BearbeitenTypische Aufgaben für den Einsatz von dd
sind z. B.:
Sichern und Wiederherstellen einer Partition
BearbeitenVon 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.
dd if=/dev/sda1 of=/tmp/sda1_image
Danach kann bspw. versucht werden, die Partition zu reparieren oder gelöschte Dateien wiederherzustellen. Zum Wiederherstellen des Ausgangszustandes vertauscht man Ein- und Ausgabedatei:
dd of=/dev/sda1 if=/tmp/sda1_image
Datenträger unlesbar machen
BearbeitenUnwiderrufliches Löschen des Inhalts einer ganzen Magnetfestplatte /dev/[blockdevice]
(wie /dev/sda
unter GNU/Linux oder /dev/disk1
unter macOS) einschließlich aller Partitionsinformationen:
dd if=/dev/urandom of=/dev/[blockdevice]
oder
dd if=/dev/zero of=/dev/[blockdevice]
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
BearbeitenEin 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.
dd if=/dev/zero of=sparsefile bs=1 count=0 seek=512M
Siehe auch
BearbeitenWeblinks
Bearbeitendd(1)
: convert and copy a file – Open Group Base Specificationdd(1)
: convert and copy a file – OpenBSD General Commands Manualdd(1)
: Umwandeln und Kopieren einer Datei – Debian GNU/Linux Ausführbare Programme oder Shell-Befehle Handbuchseite
Anmerkungen
Bearbeiten- ↑ a b DD Command. Dr. Nikolai Bezroukov, softpanorama.org, abgerufen am 13. Juni 2014 (englisch): „It is jokingly said that dd stands for "destroy disk" or "delete data", since, being used for low-level operations on hard disks, a small mistake, such as reversing the if and of parameters, may accidentally render the entire disk unusable.“
- ↑ Ddrescue – Data recovery tool. stack exchange inc, 4. November 2012, abgerufen am 29. Juni 2014 (englisch).
- ↑ What's the difference between ddrescue, gddrescue, and dd_rescue? Abgerufen am 5. Juli 2014 (englisch).
- ↑ dcfldd. 16. Juni 2014, abgerufen am 29. Juni 2014 (englisch): „An Enhanced version of gnu dd with features useful for forensics and security. Key features include on-the-fly hashing, status output and faster disk wiping.“
- ↑ dc3dd. 22. April 2013, abgerufen am 29. Juni 2014 (englisch): „A patch to the GNU dd program, this version has several features intended for forensic acquisition of data. Highlights include hashing on-the-fly, split output files, pattern writing, a progress meter, and file verification.“
- ↑ Linux 'dd' basics. Forensic Focus, abgerufen am 13. Juni 2014 (englisch).
- ↑ dd for windows. chrysocome.net, 17. Juli 2010, abgerufen am 29. Juni 2014 (englisch).
- ↑ a b Jürgen Plate: Vorlesung „UNIX“. Abgerufen am 14. Juni 2014: „Abschnitt 10.3 The UNIX Acrony List: (opinion 1) Dataset Definition (named after the OS/3x0 JCL DD command who's syntax it also ripped off as a joke); (opinion 2) copy and convert (called `dd' because `cc' is the C compiler); (opinions 3-n) data, device, disk, dump in various combinations“
- ↑ Peter Funk: The Unix Acronym List. Wolfram Rösler, abgerufen am 14. Juni 2014: „Eigentlich `Copy and Convert' und nur zu `dd' umbenannt, weil `cc' schon durch den `C-Compiler' belegt war! Das ist jedenfalls die authentische Auskunft, die ich damals den Man-Pages unseres UNIX-V7 auf unserer Uni PDP-11 entnommen habe.“
- ↑ Mike Shema: Anti-Hacker Tool Kit, 4. Auflage, McGraw-Hill Education, 2014, ISBN 978-0-07-180014-3. S. 536
- ↑ dd gemäß Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition. The IEEE and The Open Group, 2004, abgerufen am 18. Juni 2014 (englisch).
- ↑ DD(1) – OpenBSD Reference Manual. OpenBSD.org, abgerufen am 18. Juni 2014 (englisch): „If dd receives a SIGINFO (see the "status" argument for stty(1)) signal, the current input and output block counts will be written to the standard error output in the same format as the standard completion message.“
- ↑ a b dd invocation. gnu.org, abgerufen am 18. Juni 2014 (englisch): „Sending an ‘INFO’ signal to a running dd process makes it print I/O statistics to standard error and then resume copying. ... On systems lacking the ‘INFO’ signal dd responds to the ‘USR1’ signal instead, unless the POSIXLY_CORRECT environment variable is set.“
- ↑ osx - How do I know if dd is still working? In: Stackoverflow. Abgerufen am 21. November 2020.
- ↑ dd: Convert and copy a file. Free Software Foundation, 2016, abgerufen am 30. April 2016 (englisch).