Disks klonen mit dd (Disk Dump)

Backup einer Disk auf ein komprimiertes Image und Restore

Verschaffen wir uns erst einen Überblick auf die eigenen Festplatten:

sudo fdisk -l
$ Festplatte /dev/sdf: 14.9 GiB, 15980298240 Bytes, 31211520 Sektoren

Backups werden gezogen mit

dd if=/dev/sdf | gzip -9 > ~/image-compress_sdf.img.gz

Restores:

gunzip -c ~/image-compress_sdf.img.gz | dd of=/dev/sdf

Backup vom Masterboot Record

Der MasterBootRecord (MBR) setzt sich aus dem Boot-Loader und der Partitionstabelle zusammen.

  • Der MBR ist exakt 512 Bytes lang und liegt am Beginn der Festplatte.
  • Der Boot-Loader belegt die ersten 446 Bytes des MBR.

Verschaffen wir uns erst einen Überblick auf die eigenen Festplatten:

sudo fdisk -l

Nun erstellen wir uns einen Ordner im Dateisystem der Live-CD und hängen dort eine Partition ein, auf welcher die Sicherung des MBR erstellt wird. Es kann sich hierbei auch um einen USB-Stick, eine Netzwerkfreigabe oder ein anderes Medium handeln, auf welches man jederzeit Zugriff hat.

sudo mkdir /mnt/backupdisk
sudo mount /dev/sda3 /mnt/backupdisk
cd ~/sda3

Jetzt kann mit dem eigentlichen Sichern begonnen werden. Mit dem folgenden Befehlsaufruf wird der Boot-Loader der Festplatte /dev/sda als Datei bootloader_sicherung im aktuellen Verzeichnis gesichert. Die Partitionstabelle ist in dieser Sicherung nicht enthalten:

dd if=/dev/sda of=bootloader_sicherung bs=446 count=1

Der folgende Befehl sichert den gesamten MBR (inklusive Partitionstabelle) der Festplatte /dev/sda als Datei mbr_sicherung im aktuellen Verzeichnis:

dd if=/dev/sda of=mbr_sicherung bs=512 count=1  

Achtung!
Ändert man nach einer Sicherung des MBR plus Partitionstabelle die Partitionierung der Platte, muss unbedingt eine neue Sicherung angelegt werden. Spielt man eine alte Sicherung (mit alter und somit falscher Partitionstabelle) zurück, kann man auf die komplette Platte unter Umständen nicht mehr zugreifen.

Restore des Masterboot Record

Eine Sicherung des Boot-Loaders wird mit

dd if=bootloader_sicherung of=/dev/sda bs=446 count=1

zurückgespielt. Dieses Kommando kann auch mit einer kompletten Sicherung des MBRs verwendet werden: Es wird nur der Boot-Loader wiederhergestellt, die momentane Partitionstabelle bleibt unberührt.

Will man den MBR (also inklusive Partitionstabelle) zurücksichern, so lauten die Befehle wie folgt:

dd if=mbr_sicherung of=/dev/sda bs=512 count=1

Komplette Festplatte klonen

dd kann die komplette Festplatte klonen. Hierbei werden einfach (relativ rücksichtslos) alle Bits 1:1 von der einen Festplatte auf die andere kopiert. Entsprechend sollten beide Festplatten gleich gross sein. Uns so wirds gemacht:

dd if=/dev/hda of=/dev/hdb

Das kopiert die komplette Festplatte (wenn ein Masterboot Record auf hda exisitiert auch diesen) von hda nach hdb.

Partitionen klonen

Der folgende Befehl klont (kopiert) die komplette Partition /dev/hda1 auf die Partition /dev/hdb1:

dd if=/dev/hda1 of=/dev/hdb1

Da sich der Masterboot Record nicht auf der Partition befindet wird hier kein Masterboot Record kopiert, dies auch wenn es sich um die erste Partition der Festplatte handelt.

Klonen einer Partition in ein Image-File

Der folgende Befehlt erstellt ein komprimiertes Image der Partition /dev/hda1 und speichert dieses in die Datei image-compress_hda1.img im Heimatverzeichnis. Hierbei sind zwei Sachen zu beachten.

  • Die Live CD muss schreibend auf das Ziellaufwerk zugreifen können und
  • Das Format des Ziellaufwerkes muss sehr grosse Dateien unterstüzten. Je nachdem wie gross die zu sichernde Partition ist, wird die Sicherung selber auch entsprechend sehr gross.

Eine Übersicht über die maximalen Filegössen den versch. File-Systeme:

FilesystemMax File Grösse
Fat162 GB
Fat324 GB
NTFS16 EB (Exabyte)
ReiserFS8 TB
EXT316 GB
EXT416 TB

Durch das Weglassen von “of” im Befehlsaufruf werden die Daten auf die Standardausgabe geschrieben, wo sie dann per Pipe-Operator an gzip weitergeleitet werden:

dd if=/dev/hda1 | gzip -9 > ~/image-compress_hda1.img.gz

“-9” ist die höchste Komprimierungsstufe von gzip. Die ist entsprechend auch langsam. “-1” ist die kleinste Komprimierungsstufe und entsprechend am schnellsten.

Klonen einer Remote-Disk in ein lokal gespeichertes Image-File

Für das Erstellen eines Klons einer Remote-Disk auf ein lokal gespeichertes Image-File kann man auf zwei Varianten durch führen:

Ausführung auf dem Remote-System

dd if=/dev/sda | gzip -9 - | ssh user@local dd of=image.gz

Ausführung auf dem lokalen System

ssh user@remote "dd if=/dev/sda | gzip -1 -" | dd of=image.gz

Restore eines Images

Ein gesichertes Image-File kann folgendermassen zurückgesichert werden:

gunzip -c ~/image-compress_hda1.img.gz | dd of=/dev/hda1

Hier wird die Sicherung image-compress_hda1.img.gz in die Partition /dev/hda1 gesichert.
Wenn es sich um ein Image handelt welche nicht komprimiert wurde:

dd if=/mnt/image-compress_hda1.img.gz | dd of=/dev/hda1

Mit dd erstellte Images einbinden

Image einer Partition ohne Masterboot Record einbinden

Ein mit dd erstelltes Image lässt sich als Loop-Device mit dem Befehl mount einbinden. So kann auf das Image wie auf ein normales Laufwerk zugegriffen werden.

sudo mkdir /mnt/loop_mount

Jetzt kann man das mit dd erzeugt Image mit mount einbinden:

sudo mount -o loop ~/loop_image.img /mnt/loop_mount

Nun kann man auf alle Dateien, Verzeichnisse etc. des Images wie auf ein reguläres Laufwerk zugreifen. Nach der Benutzung muss man das Image dann wieder mit umount aushängen:

sudo umount /media/loop_mount

Image einer Partition inkl. Masterboot Record einbinden

Hat man nicht nur eine Partition, sondern die gesamte Festplatte inclusive MBR gesichert, braucht man den Offset, der jeweiligen Partition. Diesen kann man mit dem Befehl

sudo fdisk -l -u /Pfad/zum/Image.img

herausfinden. Die Ausgabe sieht bei 3 primären Partitionen ungefähr so aus:

Platte /Pfad/zum/Image.img: 0 MByte, 0 Byte
255 Köpfe, 63 Sektoren/Spuren, 0 Zylinder, zusammen 0 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Disk identifier: 0xd53d826f

    Gerät            boot. Anfang      Ende         Blöcke     Id  System
/Pfad/zum/Image.img1   *          63   104872319    52436128+   7  HPFS/NTFS
Partition 1 hat unterschiedliche phys./log. Enden:
     phys=(1023, 254, 63) logisch=(6527, 254, 63)
/Pfad/zum/Image.img2       104872320   109065284    2096482+   82  Linux Swap / Solaris
Partition 2 hat unterschiedliche phys./log. Anfänge (nicht-Linux?):
     phys=(1023, 0, 1) logisch=(6528, 0, 1)
Partition 2 hat unterschiedliche phys./log. Enden:
     phys=(1023, 254, 63) logisch=(6788, 254, 63)
/Pfad/zum/Image.img3       109065285   156296384    23615550   83  Linux
Partition 3 hat unterschiedliche phys./log. Anfänge (nicht-Linux?):
     phys=(1023, 0, 1) logisch=(6789, 0, 1)
Partition 3 hat unterschiedliche phys./log. Enden:
     phys=(1023, 254, 63) logisch=(9728, 254, 63)

Der Wert hinter der entsprechende Partition unter Anfang, ist der Offset, dieser muss jedoch noch mit der weiter oben angegebenen Sektorgröße multipliziert werden (hier 512). Der Offset für die 3. Partition währe also 109065285 * 512 = 55841425920. Nun Folgt der Mountbefehl mit dem entsprechenden Offset (hier wieder am Beispiel der 3. Partition):

sudo mkdir /media/loop_mount # Verzeichniss anlegen
sudo mount -o loop,offset=55841425920 /Pfad/zum/Image.img /media/loop_mount

Das wärs. 🙂

Den Fortschritt von dd abfragen

Wenn das dd-Kommando einmal abgesetzt wurde, wünscht man sich bei größeren Kopiervorgängen eine Kontrollmöglichkeit über den Fortschritt. Dies geht, indem man dem dd-Prozess das Signal USR1 sendet.
Man öffnet dazu eine zweite Konsole. Mit

ps -a

ermittelt man die Prozessnummer von dd.
Mit dem Befehl

kill -USR1 <prozessnummer>

wird der dd-Prozess veranlasst, die bisher kopierte Datenmenge anzuzeigen. Diese Ausgabe erfolgt in dem Konsolenfenster, indem dd gestartet wurde.

Links