dd

Der Masterbootrecord, auch „MBR“ genannt, ist 512 Bytes groß und liegt am Anfang eines Datenträgers.
Der Bootloader selbst belegt die ersten 446 Bytes, gefolgt von Partitionstabelleninformationen.

Mit dem Programm dd kann nicht nur ein Image einer Partition oder gar einer ganzen Festplatte gemacht werden.
Der Bootload sowie die Partitionstabelle lassen sich ebenso separat abspeichern.

Bootloader sichern

Hiermit wird der Bootloader ohne Partitionstabelle gesichert

dd if=<Pfad_zu_Gerätedatei> of=<Pfad_zu_Sicherungsdatei> bs=446 count=1

Hiermit wird der gesamte MBR mit Partitionstabelle gesichert

dd if=<Pfad_zu_Gerätedatei> of=<Pfad_zu_Sicherungsdatei> bs=512 count=1

Bootloader restore

Zurückspielen kann man das ganze indem man die Pfade von „if“ und „of“ vertauscht.

Ein Image das mit dd erstellt wurde lässt sich mit mount als Loop-Device einbinden.

mount -o loop <Pfad_zu_Imagedatei> <Pfad_zu_Mountpoint>

Mount einzelner Partitionen

Dies gilt für Images einzelner Partitionen, doch was ist mit Images ganzer Festplatten.
Hier ist es nicht so einfach. Man kann nicht die ganze Festplatte aus dem Image als Loop-Device einbinden.
Man muss auch hier einzelne Partitionen einbinden.

Um herauszufinden welche Partition sich wo im Image befindet, muß man den „Offset“ wissen.
Der „Offset“ gibt den Anfang der Partition an und wird mit dem Programm fdisk ausgelesen.

fdisk -l -u <Pfad_zu_Imagedaei>

Die Ausgabe kann so aussehen:

Platte /dev/sda: 500.1 GByte, 500107862016 Byte
255 Köpfe, 63 Sektoren/Spur, 60801 Zylinder, zusammen 976773168 Sektoren
Einheiten = Sektoren von 1 Ã 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000b4541

Gerät  boot.     Anfang        Ende     Blöcke   Id  System
/dev/sda1              63      208844      104391   83  Linux
/dev/sda2          208845    30925124    15358140   83  Linux
/dev/sda3        30925186   976768064   472921439+   5  Erweiterte
/dev/sda5        30925188    35118089     2096451   82  Linux Swap / Solaris
/dev/sda6        35118153   976768064   470824956   83  Linux

Der Wert unter „Anfang“ ist der Offset der jew. Partition die man Mounten möchte.
Damit eine Partition aus dem Image gemountet werden kann muss der „Offset“ noch mit der Sektorgröße multipliziert werden.
Also z.B. für die 6. Partition: 35118153 * 512 = 17980494336

Nun können wir die 6. Partition mounten mit

mount -o loop,offset=55841425920 <Pfad_zu_Imagedatei> <Pfad_zu_Mountpoint>

Die hier aufgeführten Informationen habe ich von der Quelle: Wiki-Ubuntuusers

Testdatei

Manchmal braucht man Testdateien für irgendwelche Messungen und Tests.
Mit dem Device urandom kann dd eine solche Datei erzeugen.
Hier der Befehl

dd if=/dev/zero of=./testfile bs=10M count=2

oder mit urandom

dd if=/dev/urandom of=./testfile bs=10M count=2

Mit diesem Befehl wird aktuellen Verzeichnis die Datei Testfile mit einer Größe von 20MB erstellt.

Alles shreddern

Mit dd lassen sich auch Geräte vollkommen löschen (Low-Level-Format).

Mit Nullen überschreiben

dd if=/dev/zero of=<PFAD_ZU_GERÄT>

Mit Zufallszahlen überschreiben

dd if=/dev/random of=<PFAD_ZU_GERÄT>

oder

dd if=/dev/urandom of=<PFAD_ZU_GERÄT>

Fortschritsanzeige

Bei langwirigen Vorgängen, weiß man nicht bei wieviel Megabyte sich dd gerade befindet.

Dies kann mit einem kill-Befehl ermittelt werden.
Diesem Befehl sendet man das Signals -USR1.

Informationen, zu laufenden Prozessen, können mit den Befehlen ps, pgrep oder pidof abgefragt werden.
Signalen können dann mit den Befehlen kill, pkill oder killall gesendet werden.

Man ermittelt, in einem weiteren Terminalfenster, also zunächst die ProzessID oder den Prozessnamen und sendet diesen das Signal „-USR1“.

Mit ps und kill

  • ProzessID der laufenden Terminal-Prozesse ermitteln.
ps -a 
  • Signal senden
kill -USR1 <PROZESSID>

Der aktuelle Fortschritt von dd wird nun in dem Terminal-Fenster ausgegeben, in dem dd gestartet wurde.

  • Schleife
dd if=<PFAD_ZU_GERÄT> of=<PFAD_ZU_GERÄT> & ddpid=$! ; while [ $(ps -a | grep $ddpid) ]; do kill -SIGUSR1 $ddpid; sleep 10; done

Mit pkill
Wenn nur ein dd Prozess läuft, kann man das Signal auch an den Prozessnamen übergeben.

  • Signal senden
pkill -USR1 -x dd
  • Schleife
dd if=<PFAD_ZU_GERÄT> of=<PFAD_ZU_GERÄT> & while [ ! $(pkill -USR1 -x dd) ]; do sleep 10 ; : ; done
Navigation
Drucken/exportieren
QR-Code
QR-Code dd (erstellt für aktuelle Seite)