Dd: Unterschied zwischen den Versionen

Aus Foxwiki
Markierung: Zurückgesetzt
Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Zeile 354: Zeile 354:
[[Kategorie:Linux/Befehl]]
[[Kategorie:Linux/Befehl]]
[[Kategorie:Coreutils]]
[[Kategorie:Coreutils]]
= TMP =
dd - Konvertieren und Kopieren einer Datei
dd kopiert die Eingabe in die Ausgabe mit einer veränderbaren E/A-Blockgröße und führt dabei optional Konvertierungen an den Daten durch.
== Syntax ==
dd [Operand]...
dd Option
Die einzigen Optionen sind --help und --version. Siehe [[#Allgemeine Optionen]].
Standardmäßig kopiert dd die Standardeingabe in die Standardausgabe. Um zu kopieren, führt dd wiederholt die folgenden Schritte der Reihe nach aus:
# Lesen eines Eingabeblocks.
# Wenn die Konvertierung über 'sync' erfolgt, muss die Größe des Eingabeblocks angepasst werden. Auffüllen mit Leerzeichen, wenn mit 'block' oder 'unblock' konvertiert wird, sonst mit NUL-Bytes.
# Wird 'bs=' und keine der in Schritt (4) oder (5) genannten Konvertierungen angegeben, werden die Daten als ein einziger Block ausgegeben und alle übrigen Schritte übersprungen.
# Wenn die Konvertierung 'swab' angegeben ist, wird jedes Paar von Eingangsbytes vertauscht. Wenn die Länge der Eingabedaten ungerade ist, wird das letzte Eingabebyte beibehalten (da es nichts gibt, womit man es vertauschen könnte).
# Wenn eine der Konvertierungen 'swab', 'block', 'unblock', 'lcase', 'ucase', 'ascii', 'ebcdic' und 'ibm' angegeben ist, werden diese Konvertierungen durchgeführt. Diese Konvertierungen funktionieren unabhängig von der Blockierung der Eingaben und können auch mit Datensätzen umgehen, die Blockgrenzen überspannen.
# Aggregieren Sie die resultierenden Daten in Ausgabeblöcke der angegebenen Größe und geben Sie jeden Ausgabeblock nacheinander aus. Füllen Sie den letzten Ausgabeblock nicht auf; er kann kürzer als üblich sein.
=== Operanden ===
dd akzeptiert die folgenden Operanden, deren Syntax von der DD (data definition) Anweisung der OS/360 JCL inspiriert wurde.
'if=file'
Lesen aus einer Datei anstelle der Standardeingabe.
'of=Datei'
Schreiben in eine Datei anstelle der Standardausgabe. Wenn nicht 'conv=notrunc' angegeben ist, wird die Datei vor dem Schreiben abgeschnitten.
ibs=bytes'
Setzt die Größe der Eingabeblöcke auf Bytes. Dies veranlasst dd, Bytes pro Block zu lesen. Die Voreinstellung ist 512 Bytes.
obs=bytes'
Setzt die Größe des Ausgabeblocks auf Bytes. Dies veranlasst dd, Bytes pro Block zu schreiben. Die Voreinstellung ist 512 Bytes.
bs=bytes'
Setzt sowohl die Eingabe- als auch die Ausgabeblockgröße auf Bytes. Dies veranlasst dd, Bytes pro Block zu lesen und zu schreiben und überschreibt alle 'ibs' und 'obs' Einstellungen. Wenn kein datenumwandelnder conv-Operand angegeben ist, wird die Eingabe in die Ausgabe kopiert, sobald sie gelesen wird, auch wenn sie kleiner als die Blockgröße ist.
cbs=bytes'
Setzt die Größe des Konvertierungsblocks auf Bytes. Bei der Umwandlung von Datensätzen mit variabler Länge in solche mit fester Länge (conv=block) oder umgekehrt (conv=unblock) werden Bytes als feste Satzlänge verwendet.
'skip=n'
'iseek=n'
Überspringt n 'ibs'-Bytes-Blöcke in der Eingabedatei vor dem Kopieren. Wenn n auf den Buchstaben 'B' endet, wird n als Bytezahl und nicht als Blockzahl interpretiert. ('B' und die Schreibweise 'iseek=' sind GNU-Erweiterungen zu POSIX.)
'seek=n'
'oseek=n'
Überspringt n 'obs'-Byte-Blöcke in der Ausgabedatei vor dem Abschneiden oder Kopieren. Wenn n auf den Buchstaben 'B' endet, interpretieren Sie n als Bytezahl und nicht als Blockzahl. ('B' und die Schreibweise 'oseek=' sind GNU-Erweiterungen zu POSIX.)
'count=n'
Kopiert n 'ibs'-Byte-Blöcke aus der Eingabedatei, anstatt alles bis zum Ende der Datei. Wenn n mit dem Buchstaben 'B' endet, interpretieren Sie n als Byte-Zählung und nicht als Blockzählung; dies ist eine GNU-Erweiterung zu POSIX. Treten kurze Lesevorgänge auf, wie es z.B. beim Lesen aus einer Pipe der Fall sein kann, sorgt 'iflag=fullblock' dafür, dass 'count=' komplette Eingabeblöcke und nicht Eingabe-Lesevorgänge zählt. Als Erweiterung von POSIX kopiert 'count=0' Nullblöcke, anstatt alle Blöcke zu kopieren.
status=level'
Legt den Umfang der ausgegebenen Informationen fest. Wenn dieser Operand mehrfach angegeben wird, hat der letzte Vorrang. Der Level-Wert kann einer der folgenden sein:
'keine'
Es werden keine Informations- oder Warnmeldungen in den Standardfehler ausgegeben. Fehlermeldungen werden wie üblich ausgegeben.
'noxfer'
Die endgültige Übertragungsrate und die Volumenstatistik, die normalerweise in der letzten Statuszeile erscheinen, werden nicht ausgegeben.
progress'
Druckt die Übertragungsraten- und Volumenstatistiken bei der Verarbeitung jedes Eingabeblocks auf Standardfehler. Die Statistiken werden höchstens einmal pro Sekunde in einer einzigen Zeile ausgegeben, aber die Aktualisierung kann sich verzögern, wenn auf E/A gewartet wird.
Die Übertragungsinformationen werden normalerweise beim Empfang des 'INFO'-Signals oder beim Beenden von dd auf Standardfehler ausgegeben und haben in der C-Locale folgende Standardform:
7287+1 Datensätze herein
116608+0 Datensätze aus
59703296 Bytes (60 MB, 57 MiB) kopiert, 0,0427974 s, 1,4 GB/s
Die Notation "w+p" steht für w ganze Blöcke und p Teilblöcke. Ein Teilblock liegt vor, wenn ein Lese- oder Schreibvorgang erfolgreich war, aber weniger Daten als die Blockgröße übertragen wurden. Eine zusätzliche Zeile wie "1 abgeschnittener Datensatz" oder "10 abgeschnittene Datensätze" wird nach der Zeile "records out" ausgegeben, wenn bei der Verarbeitung von "conv=block" ein oder mehrere Eingabesätze abgeschnitten wurden.
Der 'status='-Operand ist eine GNU-Erweiterung zu POSIX.
conv=konvertierung[,konvertierung]...'
Konvertiert die Datei wie durch das/die Konvertierungsargument(e) angegeben. (Keine Leerzeichen um ein oder mehrere Kommas.)
Konvertierungen:
'ascii'
Konvertiert EBCDIC nach ASCII, unter Verwendung der von POSIX spezifizierten Konvertierungstabelle. Dies liefert eine 1:1-Übersetzung für alle 256 Bytes. Dies impliziert 'conv=unblock'; die Eingabe wird in ASCII konvertiert, bevor nachfolgende Leerzeichen gelöscht werden.
ebcdic'
Konvertiert ASCII nach EBCDIC. Dies ist die Umkehrung der 'ascii'-Konvertierung. Dies impliziert 'conv=block'; nachfolgende Leerzeichen werden vor der Konvertierung in EBCDIC hinzugefügt.
ibm'
Dies funktioniert wie 'conv=ebcdic', mit dem Unterschied, dass es die alternative Konvertierungstabelle verwendet, die von POSIX spezifiziert wird. Dies ist keine 1:1 Übersetzung, sondern spiegelt die übliche historische Praxis für '~', '[' und ']' wider.
Die Konvertierungen "ascii", "ebcdic" und "ibm" schließen sich gegenseitig aus. Wenn Sie eine dieser Konvertierungen verwenden, sollten Sie auch den Operanden 'cbs=' verwenden.
'block'
Für jede Zeile in der Eingabe werden 'cbs'-Bytes ausgegeben, wobei der Zeilenumbruch in der Eingabe durch ein Leerzeichen ersetzt und die Eingabezeilen nach Bedarf abgeschnitten oder mit Leerzeichen aufgefüllt werden.
unblock'
Entfernt alle nachfolgenden Leerzeichen in jedem 'cbs'-großen Eingabeblock und fügt einen Zeilenumbruch an.
Die Konvertierungen 'block' und 'unblock' schließen sich gegenseitig aus. Wenn Sie eine dieser Konvertierungen verwenden, sollten Sie auch den Operanden 'cbs=' verwenden.
lcase'
Großbuchstaben in Kleinbuchstaben umwandeln.
ucase'
Wandelt Kleinbuchstaben in Großbuchstaben um.
Die Konvertierungen 'lcase' und 'ucase' schließen sich gegenseitig aus.
'sparse'
Versucht, NUL-Ausgabeblöcke zu suchen, anstatt sie zu schreiben. Auf einem Dateisystem, das Sparse-Dateien unterstützt, wird dies eine Sparse-Ausgabe erzeugen, wenn die Ausgabedatei erweitert wird. Seien Sie vorsichtig, wenn Sie diese Umwandlung in Verbindung mit 'conv=notrunc' oder 'oflag=append' verwenden. Mit 'conv=notrunc' werden vorhandene Daten in der Ausgabedatei, die NUL-Blöcken aus der Eingabe entsprechen, nicht berührt. Bei 'oflag=append' sind die durchgeführten Suchvorgänge unwirksam. Ebenso werden NUL-Eingabeblöcke nicht kopiert, wenn es sich bei der Ausgabe um ein Gerät und nicht um eine Datei handelt; daher ist diese Konvertierung am nützlichsten bei virtuellen Geräten oder bei Geräten mit vorherigem Nullabgleich.
Die 'sparse'-Konvertierung ist eine GNU-Erweiterung zu POSIX.
'swab'
Vertauscht jedes Paar von Eingabebytes.
'sync'
Auffüllen jedes Eingabeblocks auf die Größe von 'ibs' mit nachstehenden Null-Bytes. Bei Verwendung mit 'block' oder 'unblock' werden Leerzeichen anstelle von Nullbytes eingefügt.
Die folgenden "Konvertierungen" sind eigentlich Dateiflags und haben keinen Einfluss auf die interne Verarbeitung:
'excl'
Schlägt fehl, wenn die Ausgabedatei bereits existiert; dd muss die Ausgabedatei selbst erstellen.
'nocreat'
Erstelle die Ausgabedatei nicht; die Ausgabedatei muss bereits existieren.
Die Konvertierungen 'excl' und 'nocreat' schließen sich gegenseitig aus und sind GNU-Erweiterungen zu POSIX.
'notrunc'
Die Ausgabedatei wird nicht abgeschnitten.
'noerror'
Nach Lesefehlern fortfahren.
fdatasync'
Synchronisiert die Ausgabedaten kurz vor Beendigung, auch wenn Schreibfehler aufgetreten sind. Dies erzwingt ein physisches Schreiben der Ausgabedaten, so dass selbst bei einem Stromausfall die Ausgabedaten erhalten bleiben. Wenn weder dies noch 'fsync' angegeben wird, wird die Ausgabe wie bei Dateisystemen üblich behandelt, d.h. Ausgabedaten und Metadaten können für einige Zeit im Primärspeicher zwischengespeichert werden, bevor das Betriebssystem sie physisch schreibt, so dass Ausgabedaten und Metadaten bei Stromausfall verloren gehen können. Siehe sync: Zwischengespeicherte Schreibvorgänge mit dem permanenten Speicher synchronisieren. Diese Umwandlung ist eine GNU-Erweiterung zu POSIX.
fsync'
Synchronisiert Ausgabedaten und Metadaten kurz vor der Fertigstellung, auch wenn Schreibfehler aufgetreten sind. Dies funktioniert wie 'fdatasync', mit dem Unterschied, dass auch die Ausgabemetadaten erhalten bleiben, wie z.B. die zuletzt geänderte Zeit der Ausgabedatei; aus diesem Grund kann es etwas langsamer sein als 'fdatasync', obwohl der Leistungsunterschied für dd normalerweise unbedeutend ist. Diese Umwandlung ist eine GNU-Erweiterung zu POSIX.
'iflag=flag[,flag]...'
Zugriff auf die Eingabedatei unter Verwendung der durch das/die Flag-Argument(e) angegebenen Flags. (Keine Leerzeichen um ein oder mehrere Kommas.)
'oflag=flag[,flag]...'
Zugriff auf die Ausgabedatei unter Verwendung der durch das/die Flag-Argument(e) angegebenen Flags. (Keine Leerzeichen um ein oder mehrere Kommas.)
Hier sind die Flags.
append'
Schreiben im Append-Modus, so dass jeder dd-Schreibvorgang an den aktuellen Inhalt der Datei angehängt wird, auch wenn ein anderer Prozess gerade in diese Datei schreibt. Dieses Flag ist nur für die Ausgabe sinnvoll. Wenn Sie dieses Flag mit dem Operanden 'of=file' kombinieren, sollten Sie auch 'conv=notrunc' angeben, es sei denn, Sie wollen, dass die Ausgabedatei vor dem Anhängen abgeschnitten wird.
'cio'
Gleichzeitiger E/A-Modus für Daten verwenden. Dieser Modus führt eine direkte E/A durch und hebt die POSIX-Anforderung auf, alle E/A in dieselbe Datei zu serialisieren. Eine Datei kann nicht gleichzeitig im CIO-Modus und mit einem Standard Open geöffnet werden.
'direkt'
Direkte E/A für Daten verwenden, um den Puffercache zu umgehen. Beachten Sie, dass der Kernel Beschränkungen für die Größe von Lese- oder Schreibpuffern auferlegen kann. Bei einem ext4-Zieldateisystem und einem Linux-basierten Kernel führt beispielsweise die Verwendung von 'oflag=direct' dazu, dass Schreibvorgänge mit EINVAL fehlschlagen, wenn die Größe des Ausgabepuffers nicht ein Vielfaches von 512 ist.
'directory'
Schlägt fehl, es sei denn, die Datei ist ein Verzeichnis. Die meisten Betriebssysteme erlauben keine E/A in ein Verzeichnis, daher ist dieses Flag nur von begrenztem Nutzen.
dsync'
Synchronisierte E/A für Daten verwenden. Für die Ausgabedatei erzwingt dies ein physisches Schreiben der Ausgabedaten bei jedem Schreibvorgang. Für die Eingabedatei kann dieses Flag von Bedeutung sein, wenn aus einer entfernten Datei gelesen wird, in die ein anderer Prozess synchron geschrieben hat. Metadaten (z.B. die Zeit des letzten Zugriffs und der letzten Änderung) werden nicht unbedingt synchronisiert.
'sync'
Synchronisierte E/A sowohl für Daten als auch für Metadaten verwenden.
'nocache'
Anforderung, den Systemdaten-Cache für eine Datei zu verwerfen. Bei count=0 werden alle zwischengespeicherten Daten für die Datei angegeben, andernfalls wird der Cache für den verarbeiteten Teil der Datei verworfen. Auch bei count=0 wird ein Fehler beim Verwerfen des Caches diagnostiziert und im Exit-Status angezeigt.
Beachten Sie, dass Daten, die noch nicht im Speicher vorhanden sind, nicht aus dem Cache entfernt werden. Beachten Sie daher die Verwendung der 'sync'-Konvertierungen in den folgenden Beispielen, die dazu dienen, die Wirksamkeit des 'nocache'-Flags zu maximieren.
Hier sind einige Anwendungsbeispiele:
# Cache für die gesamte Datei löschen
dd if=ifile iflag=nocache count=0
# Sicherstellen, dass der Cache für die gesamte Datei gelöscht wird
dd of=ofile oflag=nocache conv=notrunc,fdatasync count=0
# Empfehlung, den Cache für einen Teil der Datei zu löschen
# Beachten Sie, dass der Kernel nur vollständige und
# bereits persistierte Seiten.
dd if=ifile iflag=nocache skip=10 count=10 of=/dev/null
# Streamen Sie Daten, indem Sie nur den Read-Ahead-Cache verwenden.
# Siehe auch das 'direct'-Flag.
dd if=ifile of=ofile iflag=nocache oflag=nocache,sync
'nonblock'
Nicht-blockierende E/A verwenden.
'noatime'
Den Zugriffszeitstempel der Datei nicht aktualisieren. Siehe Datei-Zeitstempel. Einige ältere Dateisysteme ignorieren dieses Flag stillschweigend, daher ist es eine gute Idee, es an Ihren Dateien zu testen, bevor Sie sich darauf verlassen.
'noctty'
Weisen Sie die Datei nicht als Kontrollterminal für dd zu. Dies hat keinen Effekt, wenn die Datei kein Terminal ist. Auf vielen Hosts (z.B. GNU/Linux-Hosts) hat dieses Flag überhaupt keine Wirkung.
'nofollow'
Symbolischen Links nicht folgen.
'nolinks'
Scheitert, wenn die Datei mehrere harte Links hat.
'binär'
Binäre E/A verwenden. Dieses Flag wirkt sich nur auf Nicht-Standard-Plattformen aus, die zwischen Binär- und Text-E/A unterscheiden.
'text'
Text-E/A verwenden. Wie 'binary' hat dieses Flag keine Auswirkung auf Standardplattformen.
'fullblock'
Volle Blöcke aus der Eingabe akkumulieren. Der read-Systemaufruf kann vorzeitig zurückkehren, wenn kein voller Block verfügbar ist. In diesem Fall muss read weiter aufgerufen werden, um den Rest des Blocks zu füllen. Dieses Flag kann nur zusammen mit iflag verwendet werden. Dieses Flag ist z. B. bei Pipes nützlich, da diese kurze Lesevorgänge zurückgeben können. In diesem Fall wird dieses Flag benötigt, um sicherzustellen, dass ein 'count='-Argument als Blockzählung und nicht als Zählung von Leseoperationen interpretiert wird.
Diese Flags sind alle GNU-Erweiterungen zu POSIX. Sie werden nicht von allen Systemen unterstützt, und 'dd' lehnt Versuche ab, sie zu benutzen, wenn sie nicht unterstützt werden. Beim Lesen von der Standardeingabe oder Schreiben auf die Standardausgabe sollten die Flags 'nofollow' und 'noctty' nicht angegeben werden, und die anderen Flags (z.B. 'nonblock') können beeinflussen, wie sich andere Prozesse mit den betroffenen Dateideskriptoren verhalten, selbst nachdem dd beendet wurde.
Das Verhalten von dd ist nicht spezifiziert, wenn andere Operanden als 'conv=', 'iflag=', 'oflag=' und 'status=' mehr als einmal angegeben werden.
Die obigen numerischen Strings (n und bytes) sind vorzeichenlose dezimale Ganzzahlen, denen ein Multiplikator folgen kann: 'b'=512, 'c'=1, 'w'=2, 'xm'=m, oder einer der Standard-Blockgrößen-Suffixe wie 'k'=1024 (siehe Blockgröße). Diese Multiplikatoren sind GNU-Erweiterungen zu POSIX, mit der Ausnahme, dass POSIX erlaubt, dass Bytes von 'k', 'b' und 'xm' gefolgt werden. Blockgrößen (d.h. durch Bytes-Strings angegeben) müssen ungleich Null sein.
Jede Blockgröße, die Sie über 'bs=', 'ibs=', 'obs=', 'cbs=' angeben, sollte nicht zu groß sein - Werte, die größer als ein paar Megabyte sind, sind im Allgemeinen verschwenderisch oder (wie im Fall von Gigabyte..Exabyte) geradezu kontraproduktiv oder fehlerverursachend.
Um Daten mit einem Offset oder einer Größe zu verarbeiten, die kein Vielfaches der E/A-Blockgröße ist, können Sie eine numerische Zeichenkette n verwenden, die mit dem Buchstaben 'B' endet. Die folgenden Shell-Befehle kopieren beispielsweise Daten in 1-MiB-Blöcken zwischen einem Flash-Laufwerk und einem Band, speichern oder stellen aber einen 512-Byte-Bereich am Anfang des Flash-Laufwerks nicht wieder her:
flash=/dev/sda
band=/dev/st0
# Kopieren Sie alle Daten außer den ersten 512 Bytes vom Flash-Laufwerk auf das Band.
dd if=$flash iseek=512B bs=1MiB of=$tape
# Kopieren Sie vom Band zurück ins Flash und lassen Sie die ersten 512 Bytes stehen.
dd if=$tape bs=1MiB of=$flash oseek=512B
Für ausfallende Speichergeräte gibt es andere Werkzeuge mit einer Vielzahl von Zusatzfunktionen, die es erleichtern, so viele Daten wie möglich zu retten, bevor das Gerät endgültig stirbt, z.B. GNU ddrescue. In manchen Fällen ist ein solches Werkzeug jedoch nicht verfügbar oder der Administrator fühlt sich mit der Handhabung von dd wohler. Als einfache Rettungsmethode rufen Sie dd wie im folgenden Beispiel gezeigt auf: der Operand 'conv=noerror,sync' wird verwendet, um nach Lesefehlern fortzufahren und schlechte Lesevorgänge mit NULs aufzufüllen, während 'iflag=fullblock' für kurze Lesevorgänge sorgt (die traditionell nie auf Flash oder ähnlichen Geräten auftreten):
# Daten von einer (nicht eingehängten!) Partition eines defekten Geräts retten.
dd conv=noerror,sync iflag=fullblock </dev/sda1 > /mnt/rescue.img
Das Senden eines 'INFO'-Signals (oder eines 'USR1'-Signals, wenn dieses nicht verfügbar ist) an einen laufenden dd-Prozess bewirkt, dass er E/A-Statistiken in den Standardfehler ausgibt und dann den Kopiervorgang fortsetzt. Im folgenden Beispiel wird dd im Hintergrund ausgeführt, um 5 GB an Daten zu kopieren. Der kill-Befehl veranlasst ihn zur Ausgabe von E/A-Zwischenstatistiken, und wenn dd normal beendet oder durch das SIGINT-Signal beendet wird, gibt er die endgültigen Statistiken aus.
# Ignorieren Sie das Signal, damit wir nicht versehentlich das dd-Kind beenden.
# Beachten Sie, dass dies nicht erforderlich ist, wenn SIGINFO verfügbar ist.
trap '' USR1
# Führen Sie dd mit dem iflag fullblock aus, um kurze Lesevorgänge zu vermeiden
# die durch den Empfang von Signalen ausgelöst werden können.
dd iflag=fullblock if=/dev/zero of=/dev/null count=5000000 bs=1000 & pid=$!
# Ausgabe der Statistiken jede Sekunde.
while kill -s USR1 $pid 2>/dev/null; do sleep 1; done
Das obige Skript wird im folgenden Format ausgegeben:
  3441325+0 Datensätze in
  3441325+0 Datensätze raus
3441325000 Bytes (3,4 GB, 3,2 GiB) kopiert, 1,00036 s, 3,4 GB/s
5000000+0 Datensätze ein
5000000+0 Datensätze raus
5000000000 Bytes (5,0 GB, 4,7 GiB) kopiert, 1,44433 s, 3,5 GB/s
Der Operand 'status=progress' aktualisiert regelmäßig die letzte Zeile der obigen Übertragungsstatistik.
Auf Systemen ohne das 'INFO'-Signal reagiert dd stattdessen auf das 'USR1'-Signal, sofern die Umgebungsvariable POSIXLY_CORRECT nicht gesetzt ist.
Ein Exit-Status von Null bedeutet Erfolg, ein Wert ungleich Null bedeutet einen Fehler.


{{DEFAULTSORT:dd}}
{{DEFAULTSORT:dd}}
</noinclude>
</noinclude>

Version vom 26. Mai 2023, 18:38 Uhr

dd (disk dump) - Bit-genaue Kopie einer Datei erstellen

Beschreibung

dd (disk dump) erstellt bit-genaue Kopien von Datenträgern, Partitionen oder Dateien.

Bit-genau

bedeutet, dass Bit-für-Bit bzw. Byte-für-Byte ausgelesen und beschrieben wird, unabhängig von dessen Inhalt und Belegung.

Diskdump ist ein sehr flexiebles Werkzeug, das ab einem bestimmten Startpunkt eine bestimmte Menge »roher« Daten liest und diese 1:1 in eine Zieldatei oder auf ein Zielgerät schreibt.

  • Zusätzlich kann dd die gelesen Daten konvertieren.

Diese Eigenschaft erlaubt es, Dateien beliebiger Dateisysteme zu sichern, selbst wenn Linux diese nicht lesen kann.

dd if=QUELLE of=ZIEL [OPTIONEN]

QUELLE und ZIEL können hierbei sowohl ein Device als auch eine Datei sein.

  • Werden keine weiteren Optionen angegeben, so werden alle Daten aus QUELLE gelesen.
  • Handelt es sich bei QUELLE um eine Partition, wird deren gesamter Inhalt kopiert:
# dd if=/dev/hda of=/dev/hdc 

Im Beispiel wird die gesamte erste IDE-Festplatte (/dev/hda) des Systems auf die dritte (/dev/hdc) kopiert.

  • Es sollte jedem bewusst sein, dass der alte Inhalt der dritten Festplatte damit überschrieben wird.
  • Auch sollte diese über die gleiche Kapazität wie die erste Platte verfügen (sonst muss man sich die Anzahl der kopierten Bytes merken).
  • Um die Daten später zurückzuspielen, vertauscht man die Angaben von QUELLE und ZIEL.

Ist das Ziel einer Kopieraktion eine Datei, könnte bei Kernel-Versionen <2.4 die Beschränkung der Dateigröße von 2 GB unser Vorhaben zunichte machen, in einem solchen Fall muss die QUELLE auf mehrere Zieldateien aufgeteilt werden.

  • Hierzu benötigt dd mehrere Optionen.
  • Mit bs=BYTES muss die Anzahl Bytes, die in einem Schritt zu lesen oder schreiben sind, angegeben werden.
  • Wieviele Schritte getätigt werden sollen, legt die Option count=ANZAHL fest.
  • Um bspw.
  • den Masterbootsektor (Mbr) der ersten Festplatte in eine Datei zu schreiben, könnte man folgenden Aufruf verwenden:
# dd if=/dev/hda of=/tmp/mbr.save bs=512 count=1 

Um jetzt den Superblock (1 k groß) der ersten Partition zu sichern, müssen sowohl Mbr als auch der 512 Bytes lange Bootsektor (also zwei Blöcke) übersprungen werden.

  • Hierzu verwendet man die Option skip=ANZAHL.
# dd if=/dev/hda of=/dev/superblock.save bs=512 count=2 skip=2 

Wenn dd seine Arbeit verrichtet hat, gibt es eine Statistik aus:

3385223+0 records in
3385223+0 records out
1733234176 bytes (1.7 GB) copied, 6.42173 seconds, 270 MB/s

Mit Hilfe des Signals SIGUSR1(10) kann dd auch während der Arbeit eine Statistik ausgeben:

# dd if=/dev/zero of=/dev/null count=10MB & pid=$!
# kill -10 $pid

Installation

siehe Coreutils#Installation

Syntax

$  dd [Option] if=Inputfile of=Outputfile

Optionen

bs=bytes Erzwingen von ibs=bytes und obs=bytes.
cbs=bytes Konvertieren von bytes Bytes auf einmal.
conv=schlüsselwörter Konvertieren der Datei gemäß der kommagetrennten Liste von Schlüsselwörtern.
count=blöcke Nur blöcke Eingabeblöcke kopieren.
ibs=bytes Lesen von bytes Bytes auf einmal.
if=datei Lesen aus datei statt von der Standardeingabe.
obs=bytes Schreiben von bytes Bytes zur Zeit.
of=datei Schreiben in datei statt in die Standardausgabe.
seek=blöcke Überspringen von blöcke Blöcken der Größe von obs beim Beginn der Ausgabe.
skip=blöcke Überspringen von blöcke Blöcken der Größe von ibs beim Beginn der Eingabe.

bytes können folgende multiplikativen Endungen tragen: xM M, c 1, w 2, b 512, kD 1000, k 1024. MD 1.000.000, M 1.048.576, GD 1.000.000, G 1.073.741.824, und so weiter für T, P, E, Z, Y.

Schlüsselwörter

ascii von EBCDIC in ASCII.
ebcdic von ASCII in EBCDIC.
ibm von ASCII in alternatives EBCDIC.
block Auffüllen von mit Zeilenumbrüchen terminierten Datensätzen durch Leerzeichen bis zur cbs-Größe.
unblock Ersetzen von nachlaufenden Leerzeichen in Datensätzen von cbs-Größe mit Zeilenumbrüchen.
lcase Ändern von Großbuchstaben in Kleinbuchstaben.
notrunc Kein Abschneiden der Ausgabedatei.
ucase Ändern von Kleinbuchstaben in Großbuchstaben.
swab Jedes Paar von Eingabebytes vertauschen.
noerror Nach Lesefehlern fortfahren.
sync Jeden Eingabeblock mit NULLen zur ibs-Größe auffüllen; wenn mit block oder unblock benutzt, stattdessen mit Leerzeichen.

Parameter

Umgebungsvariablen

Exit-Status

Anwendung

Backup eines MBR erstellen

dd if=/dev/hda bs=512 count=1 of=/tmp/mbr.bin

Komprimiertes Backup einer Partition

Backup
dd if=/dev/sda1 | gzip > /tmp/sda1.gz
Restore
gunzip -c /tmp/image.gz | dd of=/dev/hda1

Datenträger klonen

Mit folgendem Befehl, kann man einen Datenträger (sda) auf einen anderen Datenträger klonen.

  • Hierbei gibt man die Blocksize an, um eine bessere Performance zu erreichen.

ACHTUNG: Die Datenträger sollten nicht im Dateisystem gemountet sein.

  • Am besten eine Live CD verwenden.
dd if=/dev/sda of=/dev/sdb bs=2048

Fortschritt anzeigen

dd status=progress if=/dev/hda of=/dev/hdb bs=2048

Datenträger-Image erstellen

dd if=/dev/sda1 | pv -s18G | gzip | ssh -p2227 root@mx10.foxtom.de "dd of=/media/daten/backup/mx50sda1.gz"

Datenträger mit zufälliger Zeichenfolge überschreiben

dd if=/dev/urandom of=/dev/sda

Datei erstellen

dd if=/dev/zero of=/mnt/name bs=1M count=500

Datenträgergeschwindigkeit messen

Betriebssystem-Cache abschalten

Um die Geschwindigkeiten eines Datenträgers zu testen, sollte der Cache des Betriebssystems abgeschaltet werden.

  • Lese-Cache: iflag=sync
  • Schreib-Cache: oflag=sync
Schreibgeschwingigkeit
$ dd if=/dev/zero of=/tmp/lesetest bs=1M count=1000 oflag=sync
Lesegeschwindigkeit
$ dd if=/tmp/lesetest of=/dev/null iflag=sync

Datenträger

Imagefile erstellen

# dd if=/dev/DEVICE of=FILE
Achtung
Das Gerät sollte nicht gemountet sein
Beispiel
# dd if=/dev/dvd of=dvd.img

Eine Diskette aus einem Imagefile erstellen

# dd if=image file of=/dev/fd0 

Achtung, das Diskettenlaufwerk darf nicht gemountet sein!

Beispiel
# dd if=/tmp/abc_diskette.img of=/dev/fd0

Eine CD in ein Imagefile schreiben

Genauso wie von Disketten lassen sich auch von CDs Images erstellen: dd if=cd-laufwerk of=image file Achtung, das CD-Laufwerk darf nicht gemountet sein!

Beispiel

dd if=/dev/cdrom of=/tmp/CD-image.img

Ein Imagefile mounten

mount -o loop imagefile ziel

Das Imagefile kann so wie eine Festplatte / ein Verzeichnis behandelt werden.

  • Sehr praktisch, um zum Beispiel ein CD-Abbild als "virtuelles CD-Laufwerk" zu benutzen.
  • Geht natuerlich auch mit anderen Imagedateien, zum Beispiel Diskettenimages oder Festplattenimages
# mount -o loop /tmp/cd-image.img /mnt/virtualCD

Master Boot Record

Der dd-Befehl ist auch geeignet, um den Master Boot Record einer Festplatte auszulesen und in eine Datei zu schreiben.

# dd if=festplatte of=dateiname bs=512 count=1
Beispiel
# dd if=/dev/hda of=/tmp /mbr.img bs=512 count=1
Zurückschreiben

Den mit dem vorigen Befehl gesicherten MBR kann man natuerlich auch wieder auf eine Festplatte zurueckschreiben.

# dd if=dateiname of=festplatte bs=512 count=1
Beispiel
# dd if=/tmp/mbr.img of=/dev/hda bs=512 count=1

Die primäre Partitionstabelle wiederherstellen, ohne den MBR zu überschreiben

# dd if=mbr.img of=/dev/hda bs=1 count=64 skip=446 seek=446

Einen komprimiertes Image von einer Festplatte oder Partition erstellen

Um von einer Festplattenpartition ein Backup zu machen, ist dieser Befehl sinnvoll.

  • Durch die Komprimierung kann oft ca. die Häfte des Platzes gespart werden.
# dd if=partition/festplatte bs=64k |gzip -c >dateiname.img.gz
Beispiel (1. Partition der 1. Festplatte)
# dd if=/dev/hda1 bs=64k |gzip -c >/tmp/hda1.img.gz
Beispiel 2 (Verschlüsselt auf entfernten Rechner übertragen)
dd if=/dev/hda1 bs=64k |gzip -c | ssh user@rechner2 'cat >/tmp/rechner1.hda1.img.gz'

Das komprimierte Image wieder zurückschreiben

cat dateiname.gz |gzip -d | dd of=festplatte bs=64k

Beispiel 1

cat /tmp/hda1.img.gz |gzip -d | dd of=/dev/hda1 bs=64k

Beispiel 2

ssh user@rechner2 'cat /tmp/rechner2.hda1.img.gz' |gzip -d | dd of=/dev/hda1 bs=64k

README

Dd erstellen 1:1-Kopien von Datenträgern aller Art und rettet so beispielsweise die Daten von kränkelnden Festplatten.

  • Das Tool Mkisofs sammelt Daten aus dem Verzeichnisbaum und schreibt sie in ein ISO-Image.
  • So lassen sich Backups auf CD/DVD sichern oder bootfähige Medien erzeugen.

Zum Brennen von Daten-CDs oder -DVDs stehen auf der Kommandozeile mehrere Anwendungen zur Verfügung.

  • Bevor es jedoch ans eigentliche Brennen geht, muss ein so genanntes Joliet-Erweiterungen, erzeugt Images für bootbare Medien und Dateien und kann automatische Backups anlegen, wobei es einzelne Dateien ausschließt.
  • Eine Alternative kommt in Form von Dd, das nicht nur ISO-Abbilder erzeugt, sondern oft auch die letzte Rettung für die Daten von sterbenden Festplatten darstellt.

Rockridge/Joliet: Die Rockridge-Erweiterung ergänzt das ISO-Dateisystem um Unix-typische Dateiinformationen, wie Besitzer, Gruppe, Zugriffsrechte und symbolische Links.

  • So tritt beim Kopieren von Daten aus einem Unix-Dateisystem auf CD kein Informationsverlust ein.
  • Zudem erlaubt Rockridge längere Dateinamen.
  • Die Microsoft-Erweiterung Joliet des ISO-9660-Standards lässt ebenfalls lange Dateinamen zu.

Convert und Copy

Das praktische kleine Tool Dd müsste eigentlich den Namen Cc tragen: Convert & Copy.

  • Da dieser aber schon für den C-Compiler vergeben war, griffen die Entwickler einfach zum nächsten Buchstaben im Alphabet.

Dd erstellt 1:1-Kopien von Datenträgern.

  • Egal ob Festplattenpartitionen, CDs oder DVDs -- Dd liest und schreibt zuverlässig blockweise.
  • Da Dd diese Blöcke nicht verarbeitet oder interpretiert, spielt es keine Rolle, um welches Dateisystem es sich handelt.
  • Sogar vor Festplatten mit Fehlern schreckt Dd nicht zurück (siehe Abschnitt "Letzte Rettung").
  • Der einfache Aufruf für Dd lautet:
dd if=Quelle of=Ziel

Block: Eine fortlaufende Ansammlung von Bytes auf einem Datenträger.

  • Einige Geräte wie Festplatten, Disketten und CD-/DVD-Laufwerke organisieren ihre Daten in solchen Blöcken ("block devices").
  • Andere Geräte arbeiten zeichenorientiert ("character devices") und lesen/schreiben einzelne Bytes.

Über if geben Sie also an, von wo Dd die Daten liest, und hinter of definieren Sie die Ausgabe.

  • Als Quelle und Ziel dienen oft ein Gerät, wie eine Festplatte(npartition) oder ein CD-/DVD-Laufwerk.
  • Alternativ geben Sie nach dem Gleichheitszeichen eine Datei an.
  • Um etwa die Festplattenpartition hda1 1:1 nach /dev/hdb1 zu kopieren, tippen Sie:
dd if=/dev/hda1 of=/dev/hdb1

Ebenso können Sie Dd dazu verwenden, schnell eine CD oder DVD auf der Kommandozeile zu kopieren.

  • Ein entsprechendes ISO-Image erstellen Sie beispielsweise über:
$ dd if=/dev/hdc of=abbild.iso
9153728+0 Datensätze ein
9153728+0 Datensätze aus
4686708736 bytes transferred in 1209,649659 seconds (3874435 bytes/sec)

Das Medium muss dazu nicht gemountet [1] sein.

  • Die Laufwerksangabe /dev/hdc ersetzen Sie durch den entsprechenden Gerätenamen Ihres Laufwerks; das ISO-Image landet anschließend in der Datei abbild.iso des aktuellen Verzeichnisses.

Optimieren mit Optionen

Das Programm Dd bringt einige Schalter mit.

  • Ein praktischer Parameter, der die Arbeit des Programms maßgeblich beschleunigt, ist bs (englisch "block size" = Blockgröße).
  • Standardmäßig arbeitet Dd mit 512 Byte großen Blöcken -- es liest jeweils 512 Bytes ein und schreibt diese in die Ausgabedatei.
  • Wählen Sie größere Blöcke, arbeitet Dd dementsprechend schneller.

So sorgt der Aufruf:

# dd if=/dev/hda1 of=/dev/hdb1 bs=2k

dafür, dass Dd die Partition in 2 KByte (2048 Bytes) großen Blöcken kopiert.

Unterschreitet der letzte Block die angegebene Blockgröße, füllt dd ihn nicht auf:

$ dd if=/dev/hda1 of=/dev/hdb1 bs=6k
16059+1 Datensätze ein
16059+1 Datensätze aus
98670592 bytes transferred in 13,801482 seconds (7149275 bytes/sec)

Die Ausgabe zeigt, dass Dd 16059 Blöcke der Größe 6144 Bytes und einen "übrig gebliebenen" Block von 4096 Byte kopiert hat.

Neben der Blockgröße können Sie angeben, wie viele dieser Blöcke Dd lesen soll: Um 40 MByte zu kopieren, schreiben Sie bs=1M count=40.

  • Dabei spezifiziert die Option count die Anzahl der Blöcke.
  • Das macht beispielsweise Sinn, wenn Sie den Boot-Sektor einer Festplatte sichern wollen -- Sie kopieren in diesem Fall nur den ersten, 512 Bytes großen Block mit dem Aufruf:
# dd if=/dev/hda of=bootsektor bs=512 count=1

Letzte Rettung

Das Programm Dd erweist sich auch als unverzichtbarer Helfer, wenn es um die Rettung von Daten aus zerstörten Dateisystemen geht.

  • Bevor Sie sich an die Reparatur begeben, sollten Sie zunächst ein Backup vornehmen.
  • Dazu erstellen Sie mit Dd eine 1:1-Kopie des zerstörten Systems und führen auf dieser die Reparaturversuche durch.

Da Dd standardmäßig zerstörte Sektoren von der Kopie ausschließt, setzen Sie die Parameter conv=noerror,sync ein:

dd bs=512 conv=noerror,sync if=/dev/hda of=/dev/hdb

Auf diese Weise teilen Sie Dd mit, dass es mit dem Lesen und Ablegen von Daten auch dann fortfahren soll, wenn es defekte Sektoren findet.

  • Dabei sorgt noerror dafür, dass Dd bei Fehlern nicht abbricht, und sync füllt unlesbare Sektoren mit Nullen auf.


Anhang

Siehe auch

Sicherheit

Dokumentation

Man-Pages
Info-Pages

Links

Projekt
Weblinks

TMP

dd - Konvertieren und Kopieren einer Datei

dd kopiert die Eingabe in die Ausgabe mit einer veränderbaren E/A-Blockgröße und führt dabei optional Konvertierungen an den Daten durch.

Syntax

dd [Operand]...
dd Option

Die einzigen Optionen sind --help und --version. Siehe #Allgemeine Optionen.

Standardmäßig kopiert dd die Standardeingabe in die Standardausgabe. Um zu kopieren, führt dd wiederholt die folgenden Schritte der Reihe nach aus:

  1. Lesen eines Eingabeblocks.
  2. Wenn die Konvertierung über 'sync' erfolgt, muss die Größe des Eingabeblocks angepasst werden. Auffüllen mit Leerzeichen, wenn mit 'block' oder 'unblock' konvertiert wird, sonst mit NUL-Bytes.
  3. Wird 'bs=' und keine der in Schritt (4) oder (5) genannten Konvertierungen angegeben, werden die Daten als ein einziger Block ausgegeben und alle übrigen Schritte übersprungen.
  4. Wenn die Konvertierung 'swab' angegeben ist, wird jedes Paar von Eingangsbytes vertauscht. Wenn die Länge der Eingabedaten ungerade ist, wird das letzte Eingabebyte beibehalten (da es nichts gibt, womit man es vertauschen könnte).
  5. Wenn eine der Konvertierungen 'swab', 'block', 'unblock', 'lcase', 'ucase', 'ascii', 'ebcdic' und 'ibm' angegeben ist, werden diese Konvertierungen durchgeführt. Diese Konvertierungen funktionieren unabhängig von der Blockierung der Eingaben und können auch mit Datensätzen umgehen, die Blockgrenzen überspannen.
  6. Aggregieren Sie die resultierenden Daten in Ausgabeblöcke der angegebenen Größe und geben Sie jeden Ausgabeblock nacheinander aus. Füllen Sie den letzten Ausgabeblock nicht auf; er kann kürzer als üblich sein.

Operanden

dd akzeptiert die folgenden Operanden, deren Syntax von der DD (data definition) Anweisung der OS/360 JCL inspiriert wurde.

'if=file'

Lesen aus einer Datei anstelle der Standardeingabe. 'of=Datei'

Schreiben in eine Datei anstelle der Standardausgabe. Wenn nicht 'conv=notrunc' angegeben ist, wird die Datei vor dem Schreiben abgeschnitten. ibs=bytes'

Setzt die Größe der Eingabeblöcke auf Bytes. Dies veranlasst dd, Bytes pro Block zu lesen. Die Voreinstellung ist 512 Bytes. obs=bytes'

Setzt die Größe des Ausgabeblocks auf Bytes. Dies veranlasst dd, Bytes pro Block zu schreiben. Die Voreinstellung ist 512 Bytes. bs=bytes'

Setzt sowohl die Eingabe- als auch die Ausgabeblockgröße auf Bytes. Dies veranlasst dd, Bytes pro Block zu lesen und zu schreiben und überschreibt alle 'ibs' und 'obs' Einstellungen. Wenn kein datenumwandelnder conv-Operand angegeben ist, wird die Eingabe in die Ausgabe kopiert, sobald sie gelesen wird, auch wenn sie kleiner als die Blockgröße ist. cbs=bytes'

Setzt die Größe des Konvertierungsblocks auf Bytes. Bei der Umwandlung von Datensätzen mit variabler Länge in solche mit fester Länge (conv=block) oder umgekehrt (conv=unblock) werden Bytes als feste Satzlänge verwendet. 'skip=n' 'iseek=n'

Überspringt n 'ibs'-Bytes-Blöcke in der Eingabedatei vor dem Kopieren. Wenn n auf den Buchstaben 'B' endet, wird n als Bytezahl und nicht als Blockzahl interpretiert. ('B' und die Schreibweise 'iseek=' sind GNU-Erweiterungen zu POSIX.) 'seek=n' 'oseek=n'


Überspringt n 'obs'-Byte-Blöcke in der Ausgabedatei vor dem Abschneiden oder Kopieren. Wenn n auf den Buchstaben 'B' endet, interpretieren Sie n als Bytezahl und nicht als Blockzahl. ('B' und die Schreibweise 'oseek=' sind GNU-Erweiterungen zu POSIX.) 'count=n'

Kopiert n 'ibs'-Byte-Blöcke aus der Eingabedatei, anstatt alles bis zum Ende der Datei. Wenn n mit dem Buchstaben 'B' endet, interpretieren Sie n als Byte-Zählung und nicht als Blockzählung; dies ist eine GNU-Erweiterung zu POSIX. Treten kurze Lesevorgänge auf, wie es z.B. beim Lesen aus einer Pipe der Fall sein kann, sorgt 'iflag=fullblock' dafür, dass 'count=' komplette Eingabeblöcke und nicht Eingabe-Lesevorgänge zählt. Als Erweiterung von POSIX kopiert 'count=0' Nullblöcke, anstatt alle Blöcke zu kopieren. status=level'

Legt den Umfang der ausgegebenen Informationen fest. Wenn dieser Operand mehrfach angegeben wird, hat der letzte Vorrang. Der Level-Wert kann einer der folgenden sein:

'keine'

Es werden keine Informations- oder Warnmeldungen in den Standardfehler ausgegeben. Fehlermeldungen werden wie üblich ausgegeben. 'noxfer'

Die endgültige Übertragungsrate und die Volumenstatistik, die normalerweise in der letzten Statuszeile erscheinen, werden nicht ausgegeben. progress'

Druckt die Übertragungsraten- und Volumenstatistiken bei der Verarbeitung jedes Eingabeblocks auf Standardfehler. Die Statistiken werden höchstens einmal pro Sekunde in einer einzigen Zeile ausgegeben, aber die Aktualisierung kann sich verzögern, wenn auf E/A gewartet wird.

Die Übertragungsinformationen werden normalerweise beim Empfang des 'INFO'-Signals oder beim Beenden von dd auf Standardfehler ausgegeben und haben in der C-Locale folgende Standardform:

7287+1 Datensätze herein 116608+0 Datensätze aus 59703296 Bytes (60 MB, 57 MiB) kopiert, 0,0427974 s, 1,4 GB/s

Die Notation "w+p" steht für w ganze Blöcke und p Teilblöcke. Ein Teilblock liegt vor, wenn ein Lese- oder Schreibvorgang erfolgreich war, aber weniger Daten als die Blockgröße übertragen wurden. Eine zusätzliche Zeile wie "1 abgeschnittener Datensatz" oder "10 abgeschnittene Datensätze" wird nach der Zeile "records out" ausgegeben, wenn bei der Verarbeitung von "conv=block" ein oder mehrere Eingabesätze abgeschnitten wurden.

Der 'status='-Operand ist eine GNU-Erweiterung zu POSIX. conv=konvertierung[,konvertierung]...'

Konvertiert die Datei wie durch das/die Konvertierungsargument(e) angegeben. (Keine Leerzeichen um ein oder mehrere Kommas.)

Konvertierungen:

'ascii'

Konvertiert EBCDIC nach ASCII, unter Verwendung der von POSIX spezifizierten Konvertierungstabelle. Dies liefert eine 1:1-Übersetzung für alle 256 Bytes. Dies impliziert 'conv=unblock'; die Eingabe wird in ASCII konvertiert, bevor nachfolgende Leerzeichen gelöscht werden. ebcdic'

Konvertiert ASCII nach EBCDIC. Dies ist die Umkehrung der 'ascii'-Konvertierung. Dies impliziert 'conv=block'; nachfolgende Leerzeichen werden vor der Konvertierung in EBCDIC hinzugefügt. ibm'


Dies funktioniert wie 'conv=ebcdic', mit dem Unterschied, dass es die alternative Konvertierungstabelle verwendet, die von POSIX spezifiziert wird. Dies ist keine 1:1 Übersetzung, sondern spiegelt die übliche historische Praxis für '~', '[' und ']' wider.

Die Konvertierungen "ascii", "ebcdic" und "ibm" schließen sich gegenseitig aus. Wenn Sie eine dieser Konvertierungen verwenden, sollten Sie auch den Operanden 'cbs=' verwenden. 'block'

Für jede Zeile in der Eingabe werden 'cbs'-Bytes ausgegeben, wobei der Zeilenumbruch in der Eingabe durch ein Leerzeichen ersetzt und die Eingabezeilen nach Bedarf abgeschnitten oder mit Leerzeichen aufgefüllt werden. unblock'

Entfernt alle nachfolgenden Leerzeichen in jedem 'cbs'-großen Eingabeblock und fügt einen Zeilenumbruch an.

Die Konvertierungen 'block' und 'unblock' schließen sich gegenseitig aus. Wenn Sie eine dieser Konvertierungen verwenden, sollten Sie auch den Operanden 'cbs=' verwenden. lcase'

Großbuchstaben in Kleinbuchstaben umwandeln. ucase'

Wandelt Kleinbuchstaben in Großbuchstaben um.

Die Konvertierungen 'lcase' und 'ucase' schließen sich gegenseitig aus. 'sparse'

Versucht, NUL-Ausgabeblöcke zu suchen, anstatt sie zu schreiben. Auf einem Dateisystem, das Sparse-Dateien unterstützt, wird dies eine Sparse-Ausgabe erzeugen, wenn die Ausgabedatei erweitert wird. Seien Sie vorsichtig, wenn Sie diese Umwandlung in Verbindung mit 'conv=notrunc' oder 'oflag=append' verwenden. Mit 'conv=notrunc' werden vorhandene Daten in der Ausgabedatei, die NUL-Blöcken aus der Eingabe entsprechen, nicht berührt. Bei 'oflag=append' sind die durchgeführten Suchvorgänge unwirksam. Ebenso werden NUL-Eingabeblöcke nicht kopiert, wenn es sich bei der Ausgabe um ein Gerät und nicht um eine Datei handelt; daher ist diese Konvertierung am nützlichsten bei virtuellen Geräten oder bei Geräten mit vorherigem Nullabgleich.

Die 'sparse'-Konvertierung ist eine GNU-Erweiterung zu POSIX. 'swab'

Vertauscht jedes Paar von Eingabebytes. 'sync'

Auffüllen jedes Eingabeblocks auf die Größe von 'ibs' mit nachstehenden Null-Bytes. Bei Verwendung mit 'block' oder 'unblock' werden Leerzeichen anstelle von Nullbytes eingefügt.

Die folgenden "Konvertierungen" sind eigentlich Dateiflags und haben keinen Einfluss auf die interne Verarbeitung:

'excl'

Schlägt fehl, wenn die Ausgabedatei bereits existiert; dd muss die Ausgabedatei selbst erstellen. 'nocreat'

Erstelle die Ausgabedatei nicht; die Ausgabedatei muss bereits existieren.

Die Konvertierungen 'excl' und 'nocreat' schließen sich gegenseitig aus und sind GNU-Erweiterungen zu POSIX. 'notrunc'

Die Ausgabedatei wird nicht abgeschnitten. 'noerror'

Nach Lesefehlern fortfahren. fdatasync'

Synchronisiert die Ausgabedaten kurz vor Beendigung, auch wenn Schreibfehler aufgetreten sind. Dies erzwingt ein physisches Schreiben der Ausgabedaten, so dass selbst bei einem Stromausfall die Ausgabedaten erhalten bleiben. Wenn weder dies noch 'fsync' angegeben wird, wird die Ausgabe wie bei Dateisystemen üblich behandelt, d.h. Ausgabedaten und Metadaten können für einige Zeit im Primärspeicher zwischengespeichert werden, bevor das Betriebssystem sie physisch schreibt, so dass Ausgabedaten und Metadaten bei Stromausfall verloren gehen können. Siehe sync: Zwischengespeicherte Schreibvorgänge mit dem permanenten Speicher synchronisieren. Diese Umwandlung ist eine GNU-Erweiterung zu POSIX. fsync'


Synchronisiert Ausgabedaten und Metadaten kurz vor der Fertigstellung, auch wenn Schreibfehler aufgetreten sind. Dies funktioniert wie 'fdatasync', mit dem Unterschied, dass auch die Ausgabemetadaten erhalten bleiben, wie z.B. die zuletzt geänderte Zeit der Ausgabedatei; aus diesem Grund kann es etwas langsamer sein als 'fdatasync', obwohl der Leistungsunterschied für dd normalerweise unbedeutend ist. Diese Umwandlung ist eine GNU-Erweiterung zu POSIX.

'iflag=flag[,flag]...'

Zugriff auf die Eingabedatei unter Verwendung der durch das/die Flag-Argument(e) angegebenen Flags. (Keine Leerzeichen um ein oder mehrere Kommas.) 'oflag=flag[,flag]...'

Zugriff auf die Ausgabedatei unter Verwendung der durch das/die Flag-Argument(e) angegebenen Flags. (Keine Leerzeichen um ein oder mehrere Kommas.)

Hier sind die Flags.

append'

Schreiben im Append-Modus, so dass jeder dd-Schreibvorgang an den aktuellen Inhalt der Datei angehängt wird, auch wenn ein anderer Prozess gerade in diese Datei schreibt. Dieses Flag ist nur für die Ausgabe sinnvoll. Wenn Sie dieses Flag mit dem Operanden 'of=file' kombinieren, sollten Sie auch 'conv=notrunc' angeben, es sei denn, Sie wollen, dass die Ausgabedatei vor dem Anhängen abgeschnitten wird. 'cio'

Gleichzeitiger E/A-Modus für Daten verwenden. Dieser Modus führt eine direkte E/A durch und hebt die POSIX-Anforderung auf, alle E/A in dieselbe Datei zu serialisieren. Eine Datei kann nicht gleichzeitig im CIO-Modus und mit einem Standard Open geöffnet werden. 'direkt'

Direkte E/A für Daten verwenden, um den Puffercache zu umgehen. Beachten Sie, dass der Kernel Beschränkungen für die Größe von Lese- oder Schreibpuffern auferlegen kann. Bei einem ext4-Zieldateisystem und einem Linux-basierten Kernel führt beispielsweise die Verwendung von 'oflag=direct' dazu, dass Schreibvorgänge mit EINVAL fehlschlagen, wenn die Größe des Ausgabepuffers nicht ein Vielfaches von 512 ist. 'directory'

Schlägt fehl, es sei denn, die Datei ist ein Verzeichnis. Die meisten Betriebssysteme erlauben keine E/A in ein Verzeichnis, daher ist dieses Flag nur von begrenztem Nutzen. dsync'

Synchronisierte E/A für Daten verwenden. Für die Ausgabedatei erzwingt dies ein physisches Schreiben der Ausgabedaten bei jedem Schreibvorgang. Für die Eingabedatei kann dieses Flag von Bedeutung sein, wenn aus einer entfernten Datei gelesen wird, in die ein anderer Prozess synchron geschrieben hat. Metadaten (z.B. die Zeit des letzten Zugriffs und der letzten Änderung) werden nicht unbedingt synchronisiert. 'sync'

Synchronisierte E/A sowohl für Daten als auch für Metadaten verwenden. 'nocache'

Anforderung, den Systemdaten-Cache für eine Datei zu verwerfen. Bei count=0 werden alle zwischengespeicherten Daten für die Datei angegeben, andernfalls wird der Cache für den verarbeiteten Teil der Datei verworfen. Auch bei count=0 wird ein Fehler beim Verwerfen des Caches diagnostiziert und im Exit-Status angezeigt.

Beachten Sie, dass Daten, die noch nicht im Speicher vorhanden sind, nicht aus dem Cache entfernt werden. Beachten Sie daher die Verwendung der 'sync'-Konvertierungen in den folgenden Beispielen, die dazu dienen, die Wirksamkeit des 'nocache'-Flags zu maximieren.

Hier sind einige Anwendungsbeispiele:

  1. Cache für die gesamte Datei löschen
dd if=ifile iflag=nocache count=0
  1. Sicherstellen, dass der Cache für die gesamte Datei gelöscht wird
dd of=ofile oflag=nocache conv=notrunc,fdatasync count=0
  1. Empfehlung, den Cache für einen Teil der Datei zu löschen
  2. Beachten Sie, dass der Kernel nur vollständige und
  3. bereits persistierte Seiten.
dd if=ifile iflag=nocache skip=10 count=10 of=/dev/null
  1. Streamen Sie Daten, indem Sie nur den Read-Ahead-Cache verwenden.
  2. Siehe auch das 'direct'-Flag.
dd if=ifile of=ofile iflag=nocache oflag=nocache,sync

'nonblock'

Nicht-blockierende E/A verwenden. 'noatime'

Den Zugriffszeitstempel der Datei nicht aktualisieren. Siehe Datei-Zeitstempel. Einige ältere Dateisysteme ignorieren dieses Flag stillschweigend, daher ist es eine gute Idee, es an Ihren Dateien zu testen, bevor Sie sich darauf verlassen. 'noctty'

Weisen Sie die Datei nicht als Kontrollterminal für dd zu. Dies hat keinen Effekt, wenn die Datei kein Terminal ist. Auf vielen Hosts (z.B. GNU/Linux-Hosts) hat dieses Flag überhaupt keine Wirkung. 'nofollow'

Symbolischen Links nicht folgen. 'nolinks'

Scheitert, wenn die Datei mehrere harte Links hat. 'binär'

Binäre E/A verwenden. Dieses Flag wirkt sich nur auf Nicht-Standard-Plattformen aus, die zwischen Binär- und Text-E/A unterscheiden. 'text'

Text-E/A verwenden. Wie 'binary' hat dieses Flag keine Auswirkung auf Standardplattformen. 'fullblock'

Volle Blöcke aus der Eingabe akkumulieren. Der read-Systemaufruf kann vorzeitig zurückkehren, wenn kein voller Block verfügbar ist. In diesem Fall muss read weiter aufgerufen werden, um den Rest des Blocks zu füllen. Dieses Flag kann nur zusammen mit iflag verwendet werden. Dieses Flag ist z. B. bei Pipes nützlich, da diese kurze Lesevorgänge zurückgeben können. In diesem Fall wird dieses Flag benötigt, um sicherzustellen, dass ein 'count='-Argument als Blockzählung und nicht als Zählung von Leseoperationen interpretiert wird.

Diese Flags sind alle GNU-Erweiterungen zu POSIX. Sie werden nicht von allen Systemen unterstützt, und 'dd' lehnt Versuche ab, sie zu benutzen, wenn sie nicht unterstützt werden. Beim Lesen von der Standardeingabe oder Schreiben auf die Standardausgabe sollten die Flags 'nofollow' und 'noctty' nicht angegeben werden, und die anderen Flags (z.B. 'nonblock') können beeinflussen, wie sich andere Prozesse mit den betroffenen Dateideskriptoren verhalten, selbst nachdem dd beendet wurde.

Das Verhalten von dd ist nicht spezifiziert, wenn andere Operanden als 'conv=', 'iflag=', 'oflag=' und 'status=' mehr als einmal angegeben werden.

Die obigen numerischen Strings (n und bytes) sind vorzeichenlose dezimale Ganzzahlen, denen ein Multiplikator folgen kann: 'b'=512, 'c'=1, 'w'=2, 'xm'=m, oder einer der Standard-Blockgrößen-Suffixe wie 'k'=1024 (siehe Blockgröße). Diese Multiplikatoren sind GNU-Erweiterungen zu POSIX, mit der Ausnahme, dass POSIX erlaubt, dass Bytes von 'k', 'b' und 'xm' gefolgt werden. Blockgrößen (d.h. durch Bytes-Strings angegeben) müssen ungleich Null sein.

Jede Blockgröße, die Sie über 'bs=', 'ibs=', 'obs=', 'cbs=' angeben, sollte nicht zu groß sein - Werte, die größer als ein paar Megabyte sind, sind im Allgemeinen verschwenderisch oder (wie im Fall von Gigabyte..Exabyte) geradezu kontraproduktiv oder fehlerverursachend.

Um Daten mit einem Offset oder einer Größe zu verarbeiten, die kein Vielfaches der E/A-Blockgröße ist, können Sie eine numerische Zeichenkette n verwenden, die mit dem Buchstaben 'B' endet. Die folgenden Shell-Befehle kopieren beispielsweise Daten in 1-MiB-Blöcken zwischen einem Flash-Laufwerk und einem Band, speichern oder stellen aber einen 512-Byte-Bereich am Anfang des Flash-Laufwerks nicht wieder her:

flash=/dev/sda
band=/dev/st0
  1. Kopieren Sie alle Daten außer den ersten 512 Bytes vom Flash-Laufwerk auf das Band.
dd if=$flash iseek=512B bs=1MiB of=$tape
  1. Kopieren Sie vom Band zurück ins Flash und lassen Sie die ersten 512 Bytes stehen.
dd if=$tape bs=1MiB of=$flash oseek=512B

Für ausfallende Speichergeräte gibt es andere Werkzeuge mit einer Vielzahl von Zusatzfunktionen, die es erleichtern, so viele Daten wie möglich zu retten, bevor das Gerät endgültig stirbt, z.B. GNU ddrescue. In manchen Fällen ist ein solches Werkzeug jedoch nicht verfügbar oder der Administrator fühlt sich mit der Handhabung von dd wohler. Als einfache Rettungsmethode rufen Sie dd wie im folgenden Beispiel gezeigt auf: der Operand 'conv=noerror,sync' wird verwendet, um nach Lesefehlern fortzufahren und schlechte Lesevorgänge mit NULs aufzufüllen, während 'iflag=fullblock' für kurze Lesevorgänge sorgt (die traditionell nie auf Flash oder ähnlichen Geräten auftreten):

  1. Daten von einer (nicht eingehängten!) Partition eines defekten Geräts retten.
dd conv=noerror,sync iflag=fullblock </dev/sda1 > /mnt/rescue.img

Das Senden eines 'INFO'-Signals (oder eines 'USR1'-Signals, wenn dieses nicht verfügbar ist) an einen laufenden dd-Prozess bewirkt, dass er E/A-Statistiken in den Standardfehler ausgibt und dann den Kopiervorgang fortsetzt. Im folgenden Beispiel wird dd im Hintergrund ausgeführt, um 5 GB an Daten zu kopieren. Der kill-Befehl veranlasst ihn zur Ausgabe von E/A-Zwischenstatistiken, und wenn dd normal beendet oder durch das SIGINT-Signal beendet wird, gibt er die endgültigen Statistiken aus.

  1. Ignorieren Sie das Signal, damit wir nicht versehentlich das dd-Kind beenden.
  2. Beachten Sie, dass dies nicht erforderlich ist, wenn SIGINFO verfügbar ist.
trap  USR1
  1. Führen Sie dd mit dem iflag fullblock aus, um kurze Lesevorgänge zu vermeiden
  2. die durch den Empfang von Signalen ausgelöst werden können.
dd iflag=fullblock if=/dev/zero of=/dev/null count=5000000 bs=1000 & pid=$!
  1. Ausgabe der Statistiken jede Sekunde.
while kill -s USR1 $pid 2>/dev/null; do sleep 1; done

Das obige Skript wird im folgenden Format ausgegeben:

 3441325+0 Datensätze in
 3441325+0 Datensätze raus
3441325000 Bytes (3,4 GB, 3,2 GiB) kopiert, 1,00036 s, 3,4 GB/s
5000000+0 Datensätze ein
5000000+0 Datensätze raus
5000000000 Bytes (5,0 GB, 4,7 GiB) kopiert, 1,44433 s, 3,5 GB/s

Der Operand 'status=progress' aktualisiert regelmäßig die letzte Zeile der obigen Übertragungsstatistik.

Auf Systemen ohne das 'INFO'-Signal reagiert dd stattdessen auf das 'USR1'-Signal, sofern die Umgebungsvariable POSIXLY_CORRECT nicht gesetzt ist.

Ein Exit-Status von Null bedeutet Erfolg, ein Wert ungleich Null bedeutet einen Fehler.