Dd

Aus Linupedia.org
Version vom 24. Juni 2007, 17:15 Uhr von Robi (Diskussion | Beiträge) (Grundsteinlegung)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche
Höhe=24px
Achtung dieser Artikel ist noch in Arbeit und dient vorläufig nur als Vorlage. Dieser Beitrag zu Linux oder der Abschnitt ist in Bearbeitung. Weitere Informationen findest du hier. Der Ersteller arbeitet an dem Beitrag oder Abschnitt und entsorgt den Wartungsbaustein spätestens 3 Tage nach der letzten Bearbeitung. Änderungen außer Rechtschreibkorrekturen ohne Absprache mit dem Urspungsautor sind möglichst zu vermeiden, solange dieser Baustein noch innerhalb der genannten Frist aktiviert ist.
--Robi 19:15, 24. Jun 2007 (CEST)

Kommando dd

allgemeines zum Kommando dd

dd ist ein Kommando das noch aus der Urzeit von UNIX stammt. Der Name sollte früher Copy and Convert bedeuten, das Programmkürzel cc war jedoch schon an den C-Compiler vergeben. Daher kam es wohl kurzerhand zu dd. Heute wird dieses Kürzel oftmals als disk dump oder ähnlich übersetzt, ursprünglich sollte es wohl doch mehr an das JCL-Kommando "Data Definition" erinnern, auch die für UNIX-Befehle doch sonderbaren Optionensschreibweisen erinnern noch sehr stark an diese Abstammung.

Das UNIX-Kommando dd dient dem Umleiten von Datenstömen. Dabei kann es diese Datenströme Byteweise bearbeiten und universell blocken. Als Quelle und Ziel der Datenströme können sowohl normale Dateien, die normalen Ein- und Ausgabekanäle der Prozesse und auch Geräteknoten verwendet werden. In früherer Zeit benötigte man das Programm dd , um inkompatible Formate und Zeichensätze zwischen unterschiedlichen Betriebssystemen und Geräten zu kopieren, und um Daten auf externen Peripheriegeräten (oftmals Bandgeräte) lesen und schreiben zu können.

Typischen Beispielaufgaben aus dieser Zeit könnten heute auf Linux etwa so ausgesehen:

  • Auslesen eines EBCDIC-Bandes (80 Zeichen pro Record, 10 Records pro Block, Dichte 1600 bpi) Ausgabe als Ascii-Datei:
   dd if=/dev/nst1 of=/datei ibs=800 cbs=80 conv=ascii,lcase

Für Konvertierungsaufgaben benötigt man heute dd nur noch wenig. Dort wo noch mit solchen inkompatiblen Daten gearbeitet wird, benutzt man heute meist Programme die schon die entsprechende Ein- und Ausgabefilter mitbringen. Wohl aber benötigt man auch heute noch die universellen Bockungsmöglichkeiten von dd in Bezug auf Datenströme und Geräteknoten sowie die Möglichkeit im Datenstrom gezielt zu positionieren. Besondere "Berühmtheit" hat heutzutage jedoch die Möglichkeit erlangt, Partitionen und ganze Festplatten bytegenau zu kopieren, was fälschlicher Weise dazu verleitet mag dd auch noch in den Rang eines Backuptools zu erheben.


die Optionen von dd

Die Optionen von dd unterscheiden sich grundlegend von denen der meisten UNIX/Linux Kommandos. Eine Übersicht erhaltet ihr mit der Option --help oder der Manpage von dd ( Achtung: evtl. sind nicht alle Optionen in eurer installierten Version vorhanden). Auch eine Infoseite "info:/coreutils/dd invocation" sollte bei vielen installiert sein.

Die genaue SYNOPSIS (ältere Version)

dd [--help] [--version] [if=file] [of=file] [ibs=bytes] [obs=bytes] [bs=bytes] [cbs=bytes] [skip=blocks]
[seek=blocks] [count=blocks] [conv={ascii, ebcdic, ibm, block, unblock, lcase, ucase, swab, noerror, notrunc, sync}]
Die wichtigsten Optionen im Überblick
if=Datei

Der Datenstrom, der umgeleitet werden soll. Das kann eine Datei oder Gerätedatei, also auch eine Festplatte oder ein anderes Gerät sein. Wird if weggelassen liest dd von der Standardeingabe.

of=Datei

Die Datei, auf die geschrieben werden soll. Dies kann wieder eine Datei oder ein Gerät sein. Wird of weggelassen schreibt dd auf die Standardausgabe.

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.

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 den Datenstrom entsprechend einer Kommagetrennten Liste von Schlüsselwörtern.

cbs=Bytes

Umwandlungs-Blockgröße (convert block size): Größe der Blöcke zum Umwandeln auf ein Mal.


die Blockgröße

Die Blockgröße gibt an, wieviele Byte bei einem read- oder write-Kommando gleichzeitig verarbeitet werden. Im Normalfall ist man unter Linux ja gewohnt, dass man sich darum überhaupt nicht kümmern muss, das macht Linux im Hintergrund für uns immer richtig. Da wird zB von der Tastatur jedes einzelne Zeichen gelesen, Eingaben werden Zeilenweise nach Bestätigung der ENTER-Taste verarbeitet, auf die Festplatte wird mittels des Caches mit 4KB Blockgröße lesend und schreibend zugegriffen, über Internet werden Pakete mit maximaler Größe von 1500 Byte gesendet usw. Alles Dinge von denen wir gar nichts mitbekommen, und von denen wir auch die meisten überhaupt nicht beeinflussen könnten, selbst wenn wir das wollten.

Anders jedoch beim Befehl dd. Hier arbeitet der Befehl, sollten wir nichts anderes angeben, immer mit 512 Byte lesend und schreibend und hier können wir das sowohl beim lesenden- wie auch den schreibenden-Zugriff und sogar getrennt beeinflussen.

Zu was soll das gut sein, werden sich die meisten fragen.
Eine Regentonne voll mit Wasser kann man sowohl mit einem Eimer, mit einer Suppenkelle aber auch mit einem Kaffeelöffelchen leerschaufeln, was ist wohl die schnellste und rückenschonendste Methode? Ähnlich verhalten sich viele Geräte wenn wir direkt zB über dd auf sie zugreifen.

Im folgende Beispiel wird eine kleine Partition einer SCSI-Platte mit "NULLEN" überschrieben, wobei mit der Blockgröße von dd gespielt wird.

 time dd if=/dev/zero of=/dev/sdb1 bs=512

(wobei bei bs= die Werte 16 64 512 2K 8K 32K und 128K zum Einsatz kamen)

Blockgröße real time user time sys time
16 Byte 2m26.593s 0m7.898s 1m2.839s
64 Byte 1m39.600s 0m2.734s 0m23.812s
512 Byte 1m18.710s 0m0.465s 0m6.942s
2 KByte 1m16.131s 0m0.100s 0m3.552s
8 KByte 0m29.137s 0m0.016s 0m1.299s
32 KByte 0m29.159s 0m0.012s 0m1.507s
128 KByte 0m29.115s 0m0.003s 0m1.474s

Wir erkennen, die default Einstellung von dd (512 Byte) ist zwar auf dieser Platte nicht die Allerschlechteste, aber es geht duchaus noch 3 Mal schneller.

Wesentlich gravierender sind die Unterschiede jedoch bei Bandlaufwerken, es gibt verschiedene Möglichkeiten wie das Laufwerk die ihm übertragene Blockgröße interpretieren soll, man muss prinzipiell jeden Block mit der selben Blocksize lesen mit der der Block auch geschrieben wurde, eine ungünstige Blockgröße kostet nicht nur Zeit sondern bedeutet auch erhöhten Verschleiß an Bandmaterial und Laufwerk und nicht zuletzt auch noch ein höheres Fehlerrisiko. Wer sich näher damit befassen will oder muss kann unter Bandlaufwerke und Linux und speziell über die richtige Blockgröße bei Bandlaufwerken im Wiki näher infomieren.