Vollständiges Sichern einer ganzen Platte
Backup von einer lokalen Platte zu einer anderen
Dabei wird eine 1 zu 1 Kopie angefertigt, also inklusive MBR und Partitionstabelle. Mit welcher Schnittstelle die Quell- oder Zielfestplatte angeschlossen ist, spielt nur in Bezug auf die Datenrate eine Rolle.
Backup mit dd
dd ist ein Tool, welches sich zum Sichern von Festplatten oder Partitionen eignet.
Es wird angenommen, dass die komplette Festplatte (/dev/sda) zu sichern und unter /mnt/backup eine andere Platte mit genügend freiem Platz eingehangen ist. Die zu sichernde Festplatte sollte Fehlerfrei sein.
root@debian:~# dd if=/dev/sda bs=4K of=/mnt/backup/Sicherung_sda-`date -I`.img
Blockgröße
Die oben gewählte Blockgröße von 4K (4096 Byte) bewirkt, dass Daten mit dieser Byteanzahl auf einmal gelesen und geschrieben werden. Standardmäßig sind 512 Byte Voreinstellung, welche durch internes prefetching der Festplatte eher hinderlich sein können. Um den maximalen Durchsatz zu erreichen, muss die Blockgrößen, ein Vielfaches der physikalischen 512 Byte, experimentell ermittelt werden. Da moderne Festplatten und SSDs 4K große oder größere physikalische Blockgrößen aufweisen, sollte man mit diesem Wert als Minimum starten.
Status
Da GNU dd standardmäßig keine Fortschrittsanzeige bietet, kann man mit einem Trick jedoch den aktuellen Status erfahren. Wenn nicht noch weitere dd-Prozesse laufen, lässt sich dieser in der Konsole ausgeben, wo dd gestartet wurde.
root@debian:~# kill -SIGUSR1 $(pidof dd)
Die dd-Ausgabe sieht dann beispielsweise so aus:
2611645+0 Datensätze ein 2611644+0 Datensätze aus 10697293824 Bytes (11 GB) kopiert, 264,342 s, 40,5 MB/s
Backup mit pv
pv ist ein Tool, welches dd bei dieser Aufgabe in einigen Punkten voraus ist.
- es erkennt/wählt automatisch die passende Blockgröße
- es bietet eine Fortschrittsanzeigen mit dem aktuellen Datendurchsatz an
- bei der Angabe der Quell-Dateigröße, errechnet es die voraussichtliche Übertragungsdauer
- möchte man die Übertragung 'on-the-fly' mit gzip komprimieren, kann man auch zwei pv-Aufrufe in der Pipe haben. Damit sieht man den Durchsatz einmal komprimiert und einmal unkomprimiert.
Ein einfaches Beispiel
Wir nehmen wieder an, dass die komplette erste 250GB große Festplatte (/dev/sda
) zu sichern ist und unter /mnt/backup
eine andere Platte (oder ein Netzwerkdateisystem) mit genügend freiem Platz eingehangen ist:
root@debian:~# pv -s250GB -cN "sda" /dev/sda > /mnt/backup/VollSicherung_sda-`date -I`.img
Die Ausgabe könnte bei übertragenden 130GB wie folgt aussehen:
sda: 130GB 0:35:55 [61MB/s] [================> ] 52% ETA 00:33:48
Wahl des Dateisystems
Wird die Sicherung auf eine lokal angeschlossene Platte durchgeführt, so ist die Wahl des Dateisystems nicht unwichtig. Oft ist es so, dass die Sicherung auf EXT Dateisysteme schneller als auf FAT ist. Sicherungen auf NTFS sind durch den Userspace Treiber ntfs-3g noch um einiges langsamer.
Bei fat32 muss man allerdings an die maximale Dateigröße von 2 GB pro Datei denken und noch split in die Pipe einbauen wenn dies nicht vom Backupprogramm automatisch gemacht wird.
Wenn direkt auf ein anderes Blockgerät (wie Festplatte) geschrieben wird, ist ein Dateisystem natürlich nicht nötig.
Backup über das Netzwerk
Sobald man mehr als einen Rechner im Netz hat, bietet es sich an das Image auf einen anderen Rechner im LAN zu sichern. Nachfolgend einige Beispiele
Backup mit dd über netcat
Hier wird netcat-traditional verwendet, um das Image ohne grossen Overhead über das Netzwerk zu transportieren. Am besten geht das, indem man den Clientrechner mit einer LiveCD wie http://grml.org bootet.
Das Paket netcat-traditional ist kompatibel mit dem netcat aus debian/sarge. Man kann damit also auch noch sehr alte Debian-Installationen sichern um sie virtualisiert unter z.B. KVM weiter zu betreiben.
Einfaches Beispiel
Warnung: Der Netzwerkverkehr ist weder verschlüsselt noch mit einem Passwort geschützt. |
Auf dem Zielserver muss netcat im listen Modus auf Port 1234 starten und das Image wegschreiben:
(Der Nachteil an dd ist, dass man keine Fortschrittsanzeige bekommt. Daher ist in der Pipe noch ein pv integriert.)
user@debian:~$ netcat -l -p 1234 | pv -rtb > Clientimage-`date -I`.dd
Auf dem zu sichernden Client-Rechner kann dann die folgende Zeile abgesetzt werden. Wobei Zielserver ein auflösbarer Name oder die IP-Adresse sein muss.
root@debian:~# dd if=/dev/sda bs=4K | netcat Zielserver 1234
Wenn der Zielserver keine Daten mehr erhält, muss man auf dem Client-Rechner einmal STRG+c drücken. Es fliessen dann abschliessend noch ein paar KB über die Leitung bevor netcat auf dem Zielserver dann das Ende der Übertragung feststellt und eine Zusammenfassung ausspuckt.
Erweitertes Beispiel
Überträgt man das zu sichernde Image über das Internet möchte man die Daten meist verschlüsseln, damit sie niemand mitlesen kann und komprimieren, damit die Übertragung schneller geht. Nebenbei hat man den Effekt, dass das komprimierte Image weniger Platz auf der Festplatte braucht.
Dazu wird einfach pigz zur Kompression und aespipe zur Verschlüsslung zwischengeschaltet.
Auf dem Rechner auf dem das Image gesichert wird, muss jetzt zusätzlich entschlüsselt werden. (Alternativ könnte man das Image natürlich auch gleich verschlüsselt lassen und erst beim Zurückspielen entschlüsseln. Dazu müsste man sich aber natürlich das Passwort merken...)
user@debian:~$ netcat -l -p 32168 | aespipe -d > Clientimage-`date -I`.dd.gz
Auf dem Client, wo das Image gezogen wird, muss zusätzlich komprimiert und verschlüsselt werden:
root@debian:~# dd if=/dev/sda bs=4K | pigz -2 | aespipe | netcat Zielserver 32168
- Tipp
- Anstelle von /dev/sda kann man auch nur eine Partition oder einen LVM Logical Volume sichern, z.B. über if=/dev/mapper/vg00-ossp1.
Forensisches Backup
Schlecht lesbare (oder defekte) Datenträger wie CDROMs/DVDs oder Festplatten mit defekten Sektoren bedürfen anderer Tools, um hier das Maximum an Daten zu retten. Normale Werkzeuge wie dd oder pv brechen bei Lesefehlern ab und es ist oft unmöglich eine komplette Kopie zu fertigen. Hierfür gibt es spezielle DD-Varianten oder eigene Entwicklungen, die nicht lesbare Bereiche mit Nullen auffüllen, mehrere Images zusammenfügen, die Image-Dateien automatisch in bestimmte Größen teilen können und noch viel mehr. Es kommt auf die Vollständigkeit der Daten und weniger auf die Geschwindigkeit an. Auf einem solchen Image können dann die Datenrettung versucht werden, ohne das Original zu beeinflussen und so die eigentlichen Daten für immer zu verlieren.
GNU ddrescue
Eine Möglichkeit ist das GNU ddrescue aus dem gddrescue Paket. Es versucht trotz Lesefehler so viele Daten wie möglich zu bekommen und füllt fehlende Bereiche mit Nullen auf. Es arbeitet weitgehend automatisch. Die Grundanwendung ist beispielsweise mit folgendem bedient:
root@debian:~# ddrescue -n /dev/sdg /media/Backup/imagefile.img rescue.log
Eine scheinbar defekte Festplatte sdg wird mittels gddrescue in eine Datei geschrieben. Dabei wird ein Logfile rescue.log angelegt, welches bei einem Abbruch den Vorgang an dieser Stelle fortsetzen lässt. Ständig wird der Fortschritt und eine Statistik über Lesefehler, Leseversuche ausgegeben.
Initial status (read from logfile) rescued: 0 B, errsize: 0 B, errors: 0 Current status rescued: 18426 MB, errsize: 0 B, current rate: 39518 kB/s ipos: 18426 MB, errors: 0, average rate: 32750 kB/s opos: 18426 MB, time from last successful read: 0 s
dd_rescue
ddrescue ist ein komplett anderes Programm und hat damit wenig mit gddrescue gemein. Im Unterschied kann es die gelesenen Daten allerdings auf die Standardausgabe ausgeben, womit zum Beispiel Sicherungen über das Netzwerk möglich sind.
root@debian:~# dd_rescue /dev/sdg /media/WD-SATA_daten/imagefile.img -l rescue.log
Die Statusanzeige stellt sich so dar:
dd_rescue: (info): ipos: 16711680.0k, opos: 16711680.0k, xferd: 16711680.0k errs: 0, errxfer: 0.0k, succxfer: 16711680.0k +curr.rate: 22325kB/s, avg.rate: 22783kB/s, avg.load: 3.8%
Diese Werkzeuge und viele mehr sind im Forensik Wiki aufgeführt und beschrieben.
Komprimierung
Da Festplattenabbilder in der Regel sehr große Dateien erzeugen, kann es schwierig werden, den benötigten Platzt frei zu machen. Da die Dateisysteme der Quellplatte selten voll belegt sind, gibt es freie Bereiche, die das Komprimieren dieser großen Dateien sehr effektiv gestalten.
Mit gzip, xz bzip2 oder lzop lässt sich das wie gewöhnt erledigen. Um die Komprimierungszeit auf einem Multiprozessorsystem zu verkürzen, bietet sich die parallel arbeitendnen Alternativen pigz, pxz oder pbzip2 an, welche diese effektiv nutzen.
root@debian:~# gzip sda.img
root@debian:~# ls sda.img.gz
sda.img.gz
Diese Tools lassen sich natürlich in eine Pipe einbauen.
Komprimierungsfaktor maximieren
Um den Komprimierungsfaktor des späteren Abbildes zu maximieren, kann man, wenn möglich, das oder die gemounteten Dateisysteme der Quellfestplatte vorher komplett mit Nullen beschreiben. Das funktioniert, weil gelöschte Dateien nie wirklich gelöscht werden; die Daten bis zum Überschreiben also noch unverändert weiterbestehen (je nach Dateisystem). Mit dd in so ein gemountetes FS (/media/Daten) schreiben und die erzeugte Datei anschließend löschen:
root@debian:~# dd if=/dev/zero of=/media/Daten/nullfile
root@debian:~# rm /media/Daten/nullfile
Alternativ kann zerofree verwendet werden, welches auf einem read-only oder ausgehängtem EXT Dateisystem angewendet werden kann. Dafür ist es schneller als dd und läßt image Dateien (z.B. qcow) nicht auf ihre maximale Größe anwachsen. Der Geschwindigkeitsvorteil rührt vom Verständnis von zerofree für EXT2/3 Dateisysteme, es ist deshalb nur für diese geeignet. Nach der Analyse werden also bloß die nötigen Blöcke genullt.
Mit "-v" erhält man eine Fortschrittsanzeige in Prozent, mit "-n" wäre es nur eine Trockenübung:
root@debian:~# zerofree -n /dev/sda1
57.9%
12684/11166882/39072080