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:
Filesystem | Max File Grösse |
---|---|
Fat16 | 2 GB |
Fat32 | 4 GB |
NTFS | 16 EB (Exabyte) |
ReiserFS | 8 TB |
EXT3 | 16 GB |
EXT4 | 16 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.