Dd/Anwendung: Unterschied zwischen den Versionen
K Textersetzung - „==== Links ====“ durch „=== Links ===“ |
|||
(51 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
'''dd/Anwendung''' | '''dd/Anwendung''' | ||
=== | == Beschreibung == | ||
=== | == Datei == | ||
<syntaxhighlight lang="bash" highlight="1" line> | |||
sudo dd if=/dev/ | === Datei erstellen === | ||
500M große Datei erstellen | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo dd if=/dev/zero of=/mnt/name bs=1M count=500 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=== | === Fortschritt anzeigen === | ||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
<syntaxhighlight lang="bash" highlight="1" line> | sudo dd status=progress if=/dev/hda of=/dev/hdb bs=4096 | ||
sudo dd if=/dev/ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Daten anhängen === | |||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
dd if=/dev/shm/test of=/data/sdb/test bs=1G oflag=append conv=notrunc | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=== | ==== truncate ==== | ||
Es gibt eine einfachere Möglichkeit, ein Sparse-Loch an eine Datei anzuhängen | |||
<syntaxhighlight lang="bash" highlight="1" line> | * truncate ist viel schneller als dd | ||
Um die Datei um 10 Bytes zu vergrößern, verwenden Sie | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
truncate -s +10 file.txt | |||
</syntaxhighlight> | </syntaxhighlight> | ||
siehe: https://serverfault.com/a/343726/70242 | |||
==== fallocate ==== | |||
Im Linux-Kernel 4.1 wurde die Option <tt>FALLOC_FL_INSERT_RANGE</tt> hinzugefügt | |||
* Von <tt>fallocate(2)</tt> [http://manpages.org/fallocate/2 man page] | |||
Durch die Angabe des Flags FALLOC_FL_INSERT_RANGE (verfügbar seit Linux 4.1) im Modus wird der Speicherplatz der Datei vergrößert, indem ein Loch innerhalb der Datei Größe eingefügt wird, ohne vorhandene Daten zu überschreiben | |||
* Die Lücke beginnt am Offset und erstreckt sich über len Bytes | |||
* Beim Einfügen des Lochs in die Datei wird der Inhalt der Datei ab dem Offset um len Bytes nach oben (d. h. zu einem höheren Datei-Offset) verschoben | |||
* Das Einfügen eines Lochs innerhalb einer Datei erhöht die Dateigröße um len Bytes | |||
Und vor Kurzem wurde diese Option [https://github.com/karelzak/util-linux/commit/b439065634e693dda385a6e5269e1d9258d6d471 zu util-linux hinzugefügt] | |||
-i, --insert-range | |||
Insert a hole of length bytes from offset, shifting existing data | |||
Wenn also <tt>util-linux</tt> Version 2.30 veröffentlicht wird und Ihre Linux-Distribution auf diese Version aktualisiert wird, werden wir in der Lage sein, die Dateigröße blitzschnell zu erhöhen, indem wir sie ausführen | |||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
fallocate -i -l 1G -o 128M /path/to/file | |||
</syntaxhighlight> | </syntaxhighlight> | ||
wobei <tt>128M</tt> die aktuelle Dateigröße ist | |||
; Quelle | |||
# https://superuser.com/questions/850267/how-to-append-data-in-a-file-by-dd | |||
== Datenträger == | |||
<syntaxhighlight lang="bash" highlight="1" line> | === Klonen === | ||
sudo dd if=/dev/ | Datenträger /dev/sda auf /dev/sdb klonen | ||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo dd if=/dev/sda of=/dev/sdb bs=4096 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
; | Hier wurde eine Blocksize angegeben, um eine bessere Performance zu | ||
< | |||
; ACHTUNG | |||
</ | <blockquote> | ||
Die Datenträger [[SOLLTEN]] nicht gemountet sein! | |||
</blockquote> | |||
=== | === Image erstellen === | ||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
<syntaxhighlight lang="bash" highlight="1" line> | |||
sudo dd if=/dev/DEVICE of=FILE | sudo dd if=/dev/DEVICE of=FILE | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Zeile 77: | Zeile 77: | ||
; Achtung | ; Achtung | ||
<blockquote> | <blockquote> | ||
Das Gerät sollte nicht gemountet sein | Das Gerät [[sollte]] nicht gemountet sein | ||
</blockquote> | </blockquote> | ||
; Beispiel | ; Beispiel | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
sudo dd if=/dev/dvd of=dvd.img | sudo dd if=/dev/dvd of=dvd.img | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Zeile 87: | Zeile 87: | ||
; Eine CD in ein Imagefile schreiben | ; 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! | 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! | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
sudo dd if=/dev/cdrom of=cdrom.img | sudo dd if=/dev/cdrom of=cdrom.img | ||
</syntaxhighlight> | </syntaxhighlight> | ||
; Ein Imagefile mounten | ; Ein Imagefile mounten | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
sudo mount -o loop imagefile ziel | sudo mount -o loop imagefile ziel | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Das Imagefile kann so wie eine Festplatte / ein Verzeichnis behandelt werden | Das Imagefile kann so wie eine Festplatte / ein Verzeichnis behandelt werden | ||
<syntaxhighlight lang="bash" highlight="1" line> | * 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 | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo mount -o loop /tmp/cd-image.img /mnt/virtualCD | sudo mount -o loop /tmp/cd-image.img /mnt/virtualCD | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Master Boot Record | === Komprimiertes Backup === | ||
Der dd-Befehl ist auch geeignet, um den Master Boot Record einer Festplatte auszulesen und in eine Datei zu schreiben | ; Backup | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
sudo dd if=/dev/sda1 | gzip > /tmp/sda1.gz | |||
</syntaxhighlight> | |||
; Restore | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo gunzip -c /tmp/image.gz | dd of=/dev/hda1 | |||
</syntaxhighlight> | |||
=== Mit Zufallszahlen überschreiben === | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo dd if=/dev/urandom of=/dev/sda | |||
</syntaxhighlight> | |||
== Bootsektor == | |||
Master Boot Record == | |||
Der dd-Befehl ist auch geeignet, um den Master Boot Record einer Festplatte auszulesen und in eine Datei zu schreiben | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo dd if=festplatte of=dateiname bs=512 count=1 | sudo dd if=festplatte of=dateiname bs=512 count=1 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
; Beispiel | ; Beispiel | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
sudo '''dd if=/dev/hda of=/tmp /mbr.img bs=512 count=1''' | sudo '''dd if=/dev/hda of=/tmp /mbr.img bs=512 count=1''' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
; Zurückschreiben | ; Zurückschreiben | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
sudo dd if=dateiname of=festplatte bs=512 count=1 | sudo dd if=dateiname of=festplatte bs=512 count=1 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Den mit dem vorigen Befehl gesicherten MBR kann man natuerlich auch wieder auf eine Festplatte zurueckschreiben | Den mit dem vorigen Befehl gesicherten MBR kann man natuerlich auch wieder auf eine Festplatte zurueckschreiben | ||
; Beispiel | ; Beispiel | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
sudo dd if=/tmp/mbr.img of=/dev/hda bs=512 count=1 | sudo dd if=/tmp/mbr.img of=/dev/hda bs=512 count=1 | ||
</syntaxhighlight> | |||
; Backup eines MBR erstellen | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo dd if=/dev/hda bs=512 count=1 of=/tmp/mbr.bin | |||
</syntaxhighlight> | </syntaxhighlight> | ||
==== Primäre Partitionstabelle wiederherstellen ==== | ==== Primäre Partitionstabelle wiederherstellen ==== | ||
; Primäre Partitionstabelle wiederherstellen, ohne MBR zu überschreiben | ; Primäre Partitionstabelle wiederherstellen, ohne MBR zu überschreiben | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
sudo dd if=mbr.img of=/dev/hda bs=1 count=64 skip=446 seek=446 | sudo dd if=mbr.img of=/dev/hda bs=1 count=64 skip=446 seek=446 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Zeile 131: | Zeile 155: | ||
=== Komprimiertes Image erstellen === | === Komprimiertes Image erstellen === | ||
; Komprimiertes Image von einer Festplatte oder Partition erstellen | ; Komprimiertes Image von einer Festplatte oder Partition erstellen | ||
Um von einer Festplattenpartition ein Backup zu machen, ist dieser Befehl sinnvoll | Um von einer Festplattenpartition ein Backup zu machen, ist dieser Befehl sinnvoll | ||
<syntaxhighlight lang="bash" highlight="1" line> | * Durch die Komprimierung kann oft ca. die Häfte des Platzes gespart werden | ||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo dd if=partition/festplatte bs=64k |gzip -c >dateiname.img.gz | sudo dd if=partition/festplatte bs=64k |gzip -c >dateiname.img.gz | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==== Beispiel 1 ==== | ==== Beispiel 1 ==== | ||
Erste Partition der ersten | Erste Partition der ersten Festplatte | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
sudo dd if=/dev/sda1 bs=64k |gzip -c >/tmp/sda1.img.gz | sudo dd if=/dev/sda1 bs=64k |gzip -c >/tmp/sda1.img.gz | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==== Beispiel 2 (Verschlüsselt auf entfernten Rechner übertragen) ==== | ==== Beispiel 2 (Verschlüsselt auf entfernten Rechner übertragen) ==== | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
sudo dd if=/dev/hda1 bs=64k |gzip -c | ssh [mailto:user@rechner user@rechner2] 'cat >/tmp/rechner1.hda1.img.gz' | sudo dd if=/dev/hda1 bs=64k |gzip -c | ssh [mailto:user@rechner user@rechner2] 'cat >/tmp/rechner1.hda1.img.gz' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
; Komprimiertes Image zurückschreiben ==== | ; Komprimiertes Image zurückschreiben ==== | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
sudo cat dateiname.gz |gzip -d | dd of=festplatte bs=64k | sudo cat dateiname.gz |gzip -d | dd of=festplatte bs=64k | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==== Beispiel 3 ==== | ==== Beispiel 3 ==== | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
sudo cat /tmp/hda1.img.gz |gzip -d | dd of=/dev/hda1 bs=64k | sudo cat /tmp/hda1.img.gz |gzip -d | dd of=/dev/hda1 bs=64k | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==== Beispiel 4 ==== | ==== Beispiel 4 ==== | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
ssh [mailto:user@rechner2 user@rechner2] 'cat /tmp/rechner2.hda1.img.gz' |gzip -d | dd of=/dev/hda1 bs=64k | ssh [mailto:user@rechner2 user@rechner2] 'cat /tmp/rechner2.hda1.img.gz' |gzip -d | dd of=/dev/hda1 bs=64k | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Zeile 167: | Zeile 192: | ||
* So lassen sich Backups auf CD/DVD sichern oder bootfähige Medien erzeugen | * So lassen sich Backups auf CD/DVD sichern oder bootfähige Medien erzeugen | ||
== Daten-CDs oder -DVD == | |||
Zum Brennen von Daten-CDs oder -DVDs stehen auf der Kommandozeile mehrere Anwendungen zur Verfügung | 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 <span >'''Joliet'''</span>-Erweiterungen, erzeugt Images für bootbare Medien und Dateien und kann automatische Backups anlegen, wobei es einzelne Dateien ausschließt | * Bevor es jedoch ans eigentliche Brennen geht, muss ein so genanntes <span >'''Joliet'''</span>-Erweiterungen, erzeugt Images für bootbare Medien und Dateien und kann automatische Backups anlegen, wobei es einzelne Dateien ausschließt | ||
Zeile 173: | Zeile 198: | ||
; Rockridge/Joliet | ; Rockridge/Joliet | ||
Rockridge-Erweiterung ergänzt das ISO-Dateisystem um Unix-typische Dateiinformationen, wie Besitzer, Gruppe, Zugriffsrechte und symbolische Links | 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 | * So tritt beim Kopieren von Daten aus einem Unix-Dateisystem auf CD kein Informationsverlust ein | ||
* Zudem erlaubt Rockridge längere Dateinamen | * Zudem erlaubt Rockridge längere Dateinamen | ||
* Die Microsoft-Erweiterung Joliet des ISO-9660-Standards lässt ebenfalls lange Dateinamen zu | * Die Microsoft-Erweiterung Joliet des ISO-9660-Standards lässt ebenfalls lange Dateinamen zu | ||
=== Convert und Copy === | === Convert und Copy === | ||
Das praktische kleine Tool Dd müsste eigentlich den Namen Cc tragen: Convert & 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 | Dd erstellt 1:1-Kopien von Datenträgern | ||
<syntaxhighlight lang="bash" highlight="1" line> | * Egal ob Festplattenpartitionen, CDs oder DVDs -- Dd liest und schreibt zuverlässig blockweise | ||
* Da Dd diese <span >'''Blöcke'''</span> 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 | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
dd if=''Quelle'' of=''Ziel'' | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<span >'''Block:'''</span> Eine fortlaufende Ansammlung von Bytes auf einem Datenträger | <span >'''Block:'''</span> 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 | Über ''if'' geben Sie also an, von wo Dd die Daten liest, und hinter ''of'' definieren Sie die Ausgabe | ||
<syntaxhighlight lang="bash" highlight="1" line> | * 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 | |||
; Festplattenpartition ''sda1'' 1:1 nach ''/dev/sdb1'' kopieren | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
dd if=/dev/sda1 of=/dev/sdb1 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Ebenso können Sie Dd dazu verwenden, schnell eine CD oder DVD auf der Kommandozeile zu kopieren | Ebenso können Sie Dd dazu verwenden, schnell eine CD oder DVD auf der Kommandozeile zu kopieren | ||
<syntaxhighlight lang="bash" highlight="1" line> | * Ein entsprechendes ISO-Image erstellen Sie beispielsweise über | ||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
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) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Das Medium muss dazu nicht gemountet | Das Medium muss dazu nicht gemountet 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 === | === Optimieren mit Optionen === | ||
Das Programm Dd bringt einige Schalter mit | Das Programm Dd bringt einige Schalter mit | ||
<syntaxhighlight lang="bash" highlight="1" line> | * 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 | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
</syntaxhighlight> | </syntaxhighlight> | ||
dd if=/dev/hda1 of=/dev/hdb1 bs=2k | 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 | dafür, dass Dd die Partition in 2 KByte (2048 Bytes) großen Blöcken kopiert | ||
<syntaxhighlight lang="bash" highlight="1" line> | |||
Unterschreitet der letzte Block die angegebene Blockgröße, füllt Dd ihn nicht auf | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
</syntaxhighlight> | </syntaxhighlight> | ||
$ dd if=/dev/hda1 of=/dev/hdb1 bs=6k | $ 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 | 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'' | 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'' | ||
<syntaxhighlight lang="bash" highlight="1" line> | * 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 | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
dd if=/dev/hda of=bootsektor bs=512 count=1 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Letzte Rettung === | === Letzte Rettung === | ||
Das Programm Dd erweist sich auch als unverzichtbarer Helfer, wenn es um die Rettung von Daten aus zerstörten Dateisystemen geht | 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 | Da Dd standardmäßig zerstörte Sektoren von der Kopie ausschließt, setzen Sie die Parameter ''conv=noerror,sync'' ein | ||
<syntaxhighlight lang="bash" highlight="1" line> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
dd bs=512 conv=noerror,sync if=/dev/hda of=/dev/hdb | 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 | 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.{{SORTIERUNG:dd/Anwendung}} | |||
== Geschwindigkeit messen == | |||
Datenträgergeschwindigkeit messen | |||
; Betriebssystem-Cache abschalten | |||
Um die Geschwindigkeiten eines Datenträgers zu testen, sollte der Cache des Betriebssystems abgeschaltet werden | |||
{| class="wikitable options big" | |||
|- | |||
| Lese-Cache || iflag=sync | |||
|- | |||
| Schreib-Cache || oflag=sync | |||
|} | |||
; Schreibgeschwingigkeit | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo dd if=/dev/zero of=/tmp/lesetest bs=1M count=1000 oflag=sync | |||
</syntaxhighlight> | |||
; Lesegeschwindigkeit | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo dd if=/tmp/lesetest of=/dev/null iflag=sync | |||
</syntaxhighlight> | |||
<noinclude> | <noinclude> | ||
== Beispiel == | |||
; Backup | |||
Dateisysteme sichern, auch wenn Linux diese nicht lesen kann | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo dd if=QUELLE of=ZIEL [OPTIONEN] | |||
</syntaxhighlight> | |||
; QUELLE und ZIEL | |||
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 | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo dd if=/dev/sda of=/dev/sdc | |||
</syntaxhighlight> | |||
Im Beispiel wird die gesamte erste Festplatte (/dev/sda) des Systems auf die dritte (/dev/sdc) 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 | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo dd if=/dev/sda of=/tmp/mbr.save bs=512 count=1 | |||
</syntaxhighlight> | |||
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 | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo dd if=/dev/sda of=/dev/superblock.save bs=512 count=2 skip=2 | |||
</syntaxhighlight> | |||
Wenn dd seine Arbeit verrichtet hat, gibt es eine Statistik aus | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
3385223+0 records in | |||
3385223+0 records out | |||
1733234176 bytes (1.7 GB) copied, 6.42173 seconds, 270 MB/s | |||
</syntaxhighlight> | |||
Mit Hilfe des Signals SIGUSR1(10) kann dd auch während der Arbeit eine Statistik ausgeben | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo kill -10 $pid | |||
<!-- | |||
dd if=/dev/zero of=/dev/null count=10MB & pid=$! | |||
--> | |||
== Anhang == | == Anhang == | ||
=== Siehe auch === | === Siehe auch === | ||
{{Special:PrefixIndex/ | <div style="column-count:2"> | ||
<categorytree hideroot=on mode="pages">Linux/Storage/Tools</categorytree> | |||
</div> | |||
---- | |||
{{Special:PrefixIndex/dd}} | |||
=== Links === | === Links === | ||
==== Weblinks ==== | ==== Weblinks ==== |
Aktuelle Version vom 3. September 2025, 13:15 Uhr
dd/Anwendung
Beschreibung
Datei
Datei erstellen
500M große Datei erstellen
sudo dd if=/dev/zero of=/mnt/name bs=1M count=500
Fortschritt anzeigen
sudo dd status=progress if=/dev/hda of=/dev/hdb bs=4096
Daten anhängen
dd if=/dev/shm/test of=/data/sdb/test bs=1G oflag=append conv=notrunc
truncate
Es gibt eine einfachere Möglichkeit, ein Sparse-Loch an eine Datei anzuhängen
- truncate ist viel schneller als dd
Um die Datei um 10 Bytes zu vergrößern, verwenden Sie
truncate -s +10 file.txt
siehe: https://serverfault.com/a/343726/70242
fallocate
Im Linux-Kernel 4.1 wurde die Option FALLOC_FL_INSERT_RANGE hinzugefügt
- Von fallocate(2) man page
Durch die Angabe des Flags FALLOC_FL_INSERT_RANGE (verfügbar seit Linux 4.1) im Modus wird der Speicherplatz der Datei vergrößert, indem ein Loch innerhalb der Datei Größe eingefügt wird, ohne vorhandene Daten zu überschreiben
- Die Lücke beginnt am Offset und erstreckt sich über len Bytes
- Beim Einfügen des Lochs in die Datei wird der Inhalt der Datei ab dem Offset um len Bytes nach oben (d. h. zu einem höheren Datei-Offset) verschoben
- Das Einfügen eines Lochs innerhalb einer Datei erhöht die Dateigröße um len Bytes
Und vor Kurzem wurde diese Option zu util-linux hinzugefügt
-i, --insert-range
Insert a hole of length bytes from offset, shifting existing data
Wenn also util-linux Version 2.30 veröffentlicht wird und Ihre Linux-Distribution auf diese Version aktualisiert wird, werden wir in der Lage sein, die Dateigröße blitzschnell zu erhöhen, indem wir sie ausführen
fallocate -i -l 1G -o 128M /path/to/file
wobei 128M die aktuelle Dateigröße ist
- Quelle
Datenträger
Klonen
Datenträger /dev/sda auf /dev/sdb klonen
sudo dd if=/dev/sda of=/dev/sdb bs=4096
Hier wurde eine Blocksize angegeben, um eine bessere Performance zu
- ACHTUNG
Die Datenträger SOLLTEN nicht gemountet sein!
Image erstellen
sudo dd if=/dev/DEVICE of=FILE
- Achtung
Das Gerät sollte nicht gemountet sein
- Beispiel
sudo dd if=/dev/dvd of=dvd.img
- 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!
sudo dd if=/dev/cdrom of=cdrom.img
- Ein Imagefile mounten
sudo 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
sudo mount -o loop /tmp/cd-image.img /mnt/virtualCD
Komprimiertes Backup
- Backup
sudo dd if=/dev/sda1 | gzip > /tmp/sda1.gz
- Restore
sudo gunzip -c /tmp/image.gz | dd of=/dev/hda1
Mit Zufallszahlen überschreiben
sudo dd if=/dev/urandom of=/dev/sda
Bootsektor
Master Boot Record == Der dd-Befehl ist auch geeignet, um den Master Boot Record einer Festplatte auszulesen und in eine Datei zu schreiben
sudo dd if=festplatte of=dateiname bs=512 count=1
- Beispiel
sudo '''dd if=/dev/hda of=/tmp /mbr.img bs=512 count=1'''
- Zurückschreiben
sudo dd if=dateiname of=festplatte bs=512 count=1
Den mit dem vorigen Befehl gesicherten MBR kann man natuerlich auch wieder auf eine Festplatte zurueckschreiben
- Beispiel
sudo dd if=/tmp/mbr.img of=/dev/hda bs=512 count=1
- Backup eines MBR erstellen
sudo dd if=/dev/hda bs=512 count=1 of=/tmp/mbr.bin
Primäre Partitionstabelle wiederherstellen
- Primäre Partitionstabelle wiederherstellen, ohne MBR zu überschreiben
sudo dd if=mbr.img of=/dev/hda bs=1 count=64 skip=446 seek=446
Komprimiertes Image erstellen
- 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
sudo dd if=partition/festplatte bs=64k |gzip -c >dateiname.img.gz
Beispiel 1
Erste Partition der ersten Festplatte
sudo dd if=/dev/sda1 bs=64k |gzip -c >/tmp/sda1.img.gz
Beispiel 2 (Verschlüsselt auf entfernten Rechner übertragen)
sudo dd if=/dev/hda1 bs=64k |gzip -c | ssh [mailto:user@rechner user@rechner2] 'cat >/tmp/rechner1.hda1.img.gz'
- Komprimiertes Image zurückschreiben ====
sudo cat dateiname.gz |gzip -d | dd of=festplatte bs=64k
Beispiel 3
sudo cat /tmp/hda1.img.gz |gzip -d | dd of=/dev/hda1 bs=64k
Beispiel 4
ssh [mailto:user@rechner2 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 etwa 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
Daten-CDs oder -DVD
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
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
- Festplattenpartition sda1 1
- 1 nach /dev/sdb1 kopieren
dd if=/dev/sda1 of=/dev/sdb1
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 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.
Geschwindigkeit messen
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
sudo dd if=/dev/zero of=/tmp/lesetest bs=1M count=1000 oflag=sync
- Lesegeschwindigkeit
sudo dd if=/tmp/lesetest of=/dev/null iflag=sync
Beispiel
- Backup
Dateisysteme sichern, auch wenn Linux diese nicht lesen kann
sudo dd if=QUELLE of=ZIEL [OPTIONEN]
- QUELLE und ZIEL
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
sudo dd if=/dev/sda of=/dev/sdc
Im Beispiel wird die gesamte erste Festplatte (/dev/sda) des Systems auf die dritte (/dev/sdc) 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
sudo dd if=/dev/sda 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
sudo dd if=/dev/sda 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 <syntaxhighlight lang="bash" highlight="1" line copy> sudo kill -10 $pid
Anhang
Siehe auch
Links
Weblinks