Physische Datenrettung mit Linux

Pyhsische Datenrettung mit Linux

Mit einer physischen Datensicherung lassen sich alle Datenbestände eines leicht beschädigten Datenträgers 1:1 auf einen funktionsfähigen Datenträger übertragen. Nicht behebbare Fehler können mit leeren Bereichen aufgefüllt werden, sodass wenigstens alle lesbaren Bereiche zuverlässig kopiert werden können. Die physische Datensicherung kann mit entsprechenden tools oftmals Daten sichern, die bei logischen Zugriffen (Kopieren von einzelnen Dateien) nicht mehr lesbar sind.

Grundsätzlich sollte man auf einem defekten Datenträger nicht mehr schreiben. Sonst kann es passieren, dass sich der Zustand des Datenträgers noch weiter verschlechtert. Stattdessen sollte man zunächst eine physische 1:1-Sicherung des Datenträgers machen. Wenn nötig, kann man auf der Kopie dann das Dateisystem reparieren etc.

Zur physischen Datensicherung wird ein Speicherabbild (Image) des Datenträgers erstellt. Dies kann beispielsweise mit Linux-Tools erfolgen. Ist der Datenträger aktuell im Einsatz (z.B. Datenträger mit Boot-Partition), muss man eine Live-CD verwenden, z.B. die ubuntu, Knoppix, Systemrescue-CD. Ansonsten kann man auch ein bereits gebootetes Linux verwenden.

Da eine physische Sicherung einfach alle Daten 1:1 sichert, spielt es überhaupt keine Rolle, welches Dateisystem von welchem Betriebssystem (z.B. ext4 für Linux, FAT32/NTFS für Windows) auf den Partitionen der Festplatte verwendet wird. Selbst unbekannte oder versteckte Dateisysteme können so gesichert werden und sogar die Partitionierung wird gleich mitgesichert.

In den Beispielen (s.u.) wird eine defekte DVD von /dev/sr0 in die Datei /tmp/dvd.bin gerettet. Bei Festplatten würde man beispielsweise /dev/sda in die Datei /tmp/hd.img oder auf eine andere Festplatte /dev/sdb sichern. Bei letzterem wird die zweite Festplatte überschrieben, daher sollte man vorher sicherstellen, auf welche Festplatte man schreibt.

Datenrettung mit dd (disk druid)

Mit Disk Druid kann man unter Linux einen kompletten Datenträger 1:1 physisch kopieren. Mit der Option conv=noerror setzt Disk Druid die Ausführung auch bei Fehlern fort, mit oflag=direct wird direct I/O benutzt:

dd if=/dev/sr0 of=/tmp/dvd.bin conv=noerror oflag=direct

Datenrettung mit dd_rescue

Zur Datenrettung besser geeignet ist dd_rescue, welches beispielsweise dynamische Blockgrößen verwendet, wenn ein Fehler gefunden wurde. Fehlerhafte Bereiche werden mit leeren Bereichen aufgefüllt.

Installation:

sudo apt-get install dd_rescue

Ausführung:

dd_rescue -A /dev/sr0 /tmp/dvd.bin

Quelle: http://www.garloff.de/kurt/linux/ddrescue/

Datenrettung mit ddrescue

Die besten Laborergebnisse ließen sich mit dem Tool ddrescue (Achtung, andere Schreibweise!) erzielen:

Installation unter ubuntu natty und debian squeeze:

sudo  apt-get install gddrescue

Rettungsversuch:

ddrescue /dev/sr0 /tmp/dvd.bin /tmp/dvd.log

Ausgabe bei einem Rettungsversuch:

Press Ctrl-C to interrupt
Initial status (read from logfile)
rescued:         0 B,  errsize:       0 B,  errors:       0
Current status
rescued:     4044 MB,  errsize:       0 B,
current rate:    5701 kB/s   ipos:     4044 MB,   errors:       0,
average rate:    4564 kB/s   opos:     4044 MB,
time from last successful read:       0 s
Finished

Dieses Tool war im Labor tatsächlich in der Lage, ohne weitere Parameter sämtliche Fehler auf einer augenscheinlich sehr kaputten DVD zu beheben und sauber in eine Datei zu schreiben. Sollten dennoch Fehler auftreten, kann man mittels log-File nur die fehlerhaften Bereiche nochmal kopieren. Man kann sogar zwei gleiche defekte DVDs zusammenführen, wenn die defekten Bereiche sich nicht überlappen.

Falls man immer noch Probleme hat, sollte man weitere Parameter probieren, etwa --direct oder --max-retries=10 oder --block-size=2048 oder --complete-only

Quelle: http://linux.die.net/man/1/ddrescue

Teils liest man in Foren von raw-devices, die für ddrescue verwendet werden sollen. Dies ist bei neueren Kerneln jedoch nicht mehr nötig. Wenn man mit Standardeinstellungen nicht zum gewünschten Ergebnis kommt, sollte man es jedoch mit der Option -d versuchen: Diese aktiviert die Kernel-Option O_DIRECT und ermöglicht so Lesezugriffe ohne OS-Caches.

Eine Rolle können jedoch hardware Hardware-Caches spielen. Je nach verwendeter Hardware kann die Option --reverse verbesserte Ergebnisse liefern. Ist --reverse gesetzt, wird die Reihenfolge der Leseversuche aller abzuarbeitenden Blöcke umgekehrt, was ggf. auch das Caching durch Hardware beeinflusst. Auch ohne die Option --reverse verwendet ddrescue derartige Mechanismen als Fallback bei Lesefehlern.

DVD-Image brennen

Nach der Datenrettung liegen die Daten zunächst in der Datei /tmp/dvd.bin. Dieses DVD-Image kann nun mit einem Brennprogramm wie nero unter Windows oder k3b unter Linux wieder auf eine leere DVD gebrannt werden. Bei k3b geht man auf Tools/Burn Image... und wählt /tmp/dvd.bin als image aus. Image type ist plain data image. Die Warnung Seems not to be a usable image kann man ignorieren. Anschließend kann der Brennvorgang gestartet werden. Die entstandene Kopie ist eine hoffentlich fehlerfreie 1:1 Kopie des ursprünglichen Datenträgers.

Kopieren einer defekten Festplatte mit ddrescue

Im Folgenden werden alle Daten einer Festplatte mit dem Device-Namen /dev/sdX auf eine Festplatte mit Device-Namen /dev/sdY kopiert. Die Festplatte /dev/sdY wird entsprechend überschrieben und alle darauf liegenden Daten gehen unwiederbringlich verloren, denn bis zur Größe der Quellfestplatte wird von vorn überschrieben. Entsprechend ist die Identifizierung von Quell- und Zielplatte ungemein wichtig, um ungewollte Datenvernichtung zu vermeiden.

Im Labor wird im Folgenden die Live-CD SystemRescueCD verwendet, alle Schritte erfolgen entsprechend als root-Benutzer. Die Device-Namen der Festplatten (z. B. /dev/sdX) und Partitionen (z. B. /dev/sdX1) eines Systems lassen sich feststellen mit

cat /proc/partitions

Man kann diesen Befehl vor und nach Einstecken einer USB-Festplatte ausführen, um unterschiedliche Ausgaben zu erhalten und die USB-Festplatte zu identifizieren. Filesysteme lassen sich zu Absicherungszwecken zusätzlich feststellen mit

blkid

Zunächst erfolgt ein Durchlauf mit Standardeinstellungen:

ddrescue --force /dev/sdX /dev/sdY /tmp/ddrescue.log

GNU ddrescue 1.18.1
rescued:   494888 MB,  errsize:    675 kB,  current rate:   45940 kB/s
   ipos:   494889 MB,   errors:      14,    average rate:   13848 kB/s
   opos:   494889 MB, run time:    9.92 h,  successful read:       0 s ago
Copying non-tried blocks... Pass 1 (forwards)
-------------------------
rescued:   500107 MB,  errsize:   41984 B,  current rate:        0 B/s
   ipos:   349894 MB,   errors:      21,    average rate:   13806 kB/s
   opos:   349894 MB, run time:   10.06 h,  successful read:      56 s ago
Splitting failed blocks...
-------------------------
rescued:   500107 MB,  errsize:   38912 B,  current rate:        0 B/s
   ipos:   349894 MB,   errors:      22,    average rate:   13796 kB/s
   opos:   349894 MB, run time:   10.06 h,  successful read:      14 s ago
Finished

Bereits mit Standardeinstellungen hat ddrescue identifizierte Lesefehler im Volumen von etwa 636 kB automatisch beseitigt. Die verbleibenden 40 kB müssen jetzt in weiteren Rettungsversuchen gerettet werden. Da eine Log-Datei verwendet wurde, kennt ddrescue die fehlerhaften Stellen und grenzt den Rettungsversuch entsprechend automatisch ein. Insofern ist es nicht nötig, die komplette Festplatte erneut zu durchschreiten. Die verbleibenden Fehler werden nun in 20 Versuchen mit der Option -d für die Umgehung von Kernel-Caches zu retten versucht. Sollten nicht alle Fehler beseitigt sein, kann man den Befehl einfach mehrfach durchführen und z. B. 200 Versuche zulassen.

ddrescue --force -d -r20 /dev/sdX /dev/sdY /tmp/ddrescue.log 

GNU ddrescue 1.18.1
Initial status (read from logfile)
rescued:   500107 MB,  errsize:   38912 B,  errors:      22
Current status
rescued:   500107 MB,  errsize:   36864 B,  current rate:        0 B/s
   ipos:   233060 MB,   errors:      21,    average rate:       85 B/s
   opos:   233060 MB, run time:      24 s,  successful read:       3 s ago
Retrying bad sectors (forwards)... Retry 1
-------------------------
Current status
rescued:   500107 MB,  errsize:    8192 B,  current rate:        0 B/s
   ipos:   233065 MB,   errors:       2,    average rate:        0 B/s
   opos:   233065 MB, run time:    7.73 h,  successful read:    7.73 h ago
Finished

Mit etwas Glück liegen die verbleibenden beiden Fehler im Volumen von 8 kB nicht benutzten Bereichen des Dateisystems. Möglicherweise werden die 8 kB auch von etwa ein oder zwei Dateien belegt, die somit teilweise zerstört wären. Richtig ungünstig wird es, wenn das Dateisystem selbst beschädigt ist, insbesondere Beschreibungsstruktur oder Metadaten. Zur Sicherheit sollte man das Dateisystem entsprechend nach dem Rettungsvorgang einer eingehenden Prüfung unterziehen. ddrescue bietet selbst für die verbleibenden beiden Fehler eine Reihe weiterer Optionen, wie das die Benutzeranleitung vermuten lässt (man ddrescue). Durch Austausch der defekten Festplatte mit der Zielfestplatte lässt sich das System wie gehabt weiter verwenden.

Insgesamt erreicht ddrescue meist sehr gute Ergebnisse in Anbetracht der Hartnäckigkeit der beseitigten Fehler. Ein weiterer Vorteil von ddrescue ist die Geschwindigkeit, speziell bei Verwendung einer log-Datei.