Datenwiederherstellung und Datenrettung mit Linux


Einleitung
Neben der Funktionierenden Technik sind in der IT die daten das wichtigste. Es gibt verschiedene Ansätze, für Datenintegrität und sicherheit zu sorgen. Die wohl wichtigten Möglichkeiten sind:
  • Redundanz: Daten werden gespiegelt, z.B. durch ein RAID-1.
  • Sicherungen: Regelmäßige Backups ermöglichen es zumindest Daten von einem bestimmten Stand wiedereinzuspielen.

Doch was tun, wenn auf weder auf Redundanz (z.B.: Totalausfall incl. Redundanzen) noch auf Sicherungen (z.B.:nicht vorhanden oder auch ausgefallen) zurückgegriffen werden kann, und der unangenehme Fall des Datenverlustes eintritt. Meißt können die Daten vom Datenträger noch mit speziellen Programmen gerettet werden.
Dieser Artikel beschäftigt sich mit dem Thema "Datenrettung mit Linux".
Hierfür kommt das Programm ddrescue zum Einsatz.

Installation
Zur Installation wird wie bei debian üblich apt-get verwendet:
Installation von ddrescue mittels apt-get
rescue:~# apt-get install gddrescue
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  gddrescue
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 33.1kB of archives.
After unpacking 127kB of additional disk space will be used.
Get:1 http://ftp.de.debian.org sid/main gddrescue 1.2-1 [33.1kB]
Fetched 33.1kB in 0s (114kB/s)
Selecting previously deselected package gddrescue.
(Reading database ... 217900 files and directories currently installed.)
Unpacking gddrescue (from .../gddrescue_1.2-1_i386.deb) ...
Setting up gddrescue (1.2-1) ...

rescue:~# 
		


Funktionsweise von ddrescue
Zunäst könnte die Funktionsweise des Programms von Interesse sein:
Normalerweise werden Daten mit befehlen wie cp oder Programmen wie mc kopiert. Dabei handelt es sich um ein Zusammenspiel von Programmen und Betriebssystem. Der Kopierbefehl wird natürlich im Betriebssystemkern bearbeitet, welcher eventuell auftretende Lesefehler an das Programm zurückgibt. In der Praxis heißt das, dass der Kopierbefehl mit z.B. einem Lese oder Zugriffsfehler abbricht.
ddrescue greift quasi direkt auf die Daten zu. Bei ersten Durchlauf werden alle Daten welche sich auf anhieb auslesen lassen gerettet, und Zugriffsfehler werden "vermerkt", wobei diese Sektoren einfach übersprungen werden. Bei den Folgedurchgängen wird gezielt versucht die fehlerhaften Sektoren auszulesen. Weiterhin sind nun die Optionen die das Programm beitet von Interesse. Ein schlichter Aufruf des Programms mit der Option --help gibt einen Überblick:
Optionen von ddrescue
rescue:~# ddrescue --help
GNU ddrescue - Data recovery tool.
Copies data from one file or block device to another,
trying hard to rescue data in case of read errors.

Usage: ddrescue [options] infile outfile [logfile]
Options:
  -h, --help                   display this help and exit
  -V, --version                output version information and exit
  -b, --block-size=     hardware block size of input device [512]
  -B, --binary-prefixes        show binary multipliers in numbers [default SI]
  -c, --cluster-size=  hardware blocks to copy at a time [128]
  -C, --complete-only          do not read new data beyond logfile limits
  -e, --max-errors=         maximum number of error areas allowed
  -i, --input-position=   starting position in input file [0]
  -n, --no-split               do not try to split error areas
  -o, --output-position=  starting position in output file [ipos]
  -q, --quiet                  quiet operation
  -r, --max-retries=        exit after given retries (-1=infinity) [0]
  -s, --max-size=       maximum size of data to be copied
  -t, --truncate               truncate output file
  -v, --verbose                verbose operation
Numbers may be followed by a multiplier: b = blocks, k = kB = 10^3 = 1000,
Ki = KiB = 2^10 = 1024, M = 10^6, Mi = 2^20, G = 10^9, Gi = 2^30, etc...

Report bugs to bug-ddrescue@gnu.org
rescue:~# 
		
Von besonderem Interesse sind die Optionen:
  • --max-retries=<n>
    Hiermit kann angegeben werden wie oft versucht werden soll "kaputte" Datenbereiche zu lesen.
    Je nach zu rettenden Daten muss von Fall zu Fall bzw. auch nach Datenformat unterschieden werden, ob und wie diese Option verwendet wird.

    --max-retries=-1
    Eignet sich falls eine komplette Wiederherstellung angestrebt wird. Diese Option veranlasst das Programm alle Daten zu retten, dabei wird versucht "kaputte" Sektoren so lange zu lesen, bis diese sich auslesen lassen.

    --max-retries=0
    Eignet sich um beispielsweise Video-daten zu retten, hier "merkt man es kaum", falls ein paar Sektoren nicht in Ordnung sind.

  • --verbose
    Veranlasst das Programm detailierte Informationen über den Status auszugeben.

Die detailierte Ausgabe von ddrescue verstehen
Um missverständnissen oder Fehlinterpretationen vorzubeugen wird noch auf die Ausgabe des Programms eingegangen:
Ausgabe Beschreibung Beispiel Anmerkung
rescued: gibt an wieviel der Datenmenge bisher gerettet werden konnte rescued: 724307 kB bedeutet, dass bisher 724307 kB gerettet werden konnten Dieser Wert steigt mit der Zeit, und nähert sich der Gesamtgröße.
errsize: zeigt wieviel von der Datenmenge von Fehlern betroffen ist. errsize: 360 kB bedeutet, dass bisher 360 kB fehlerhaft sind. Dieser Wert sollte gegen Null gehen, im besten Fall steht hier auch 0, was bedeutet, dass alle Daten gelesen werden konnten.
current rate:
average rate:
Gibt die aktuelle bzw. die durchschnittliche Lesegeschwindigkeit aus, mit der das Laufwerk arbeitet. current rate: 512 B/s => das Laufwerk Liest gerade mit einer Geschwingikeit von 512 Byte pro Sekunde
average rate: 1170 kB/s => durchschnittlich hat das Laufwerk bisher mit einer Rate von 1170 kiloByte pro Sekunde gelesen
Gerade wenn defekte Sektoren gelesen werden, verringert sich die Lesegeschwindigkeit sehr stark, das ist ganz normal.
ipos:
opos:
Leseposition in dem zu rettenden Datenvolumen und Schreibposition in der Ausgabedatei. -
-
-
errors: Hier wird die Anzahl an Fehlern während dem Auslesen angezeigt. errors: 706 bedeutet, dass bisher 706 Fehler bei Lesen aufgetreten sind. Die Zahl der Fehler steigt mit der Laufzeit des Programms, denn es wird jeder Fehler gezält.
Copying data...
Splitting error areas...
Zeigt, dass Daten kopiert werden. (erster Durchgang)
Zeigt, dass jetzt fehlerhaftebereiche unterteilt werden (Folgedurchgänge)
- -


Anwendung von ddrescue anhand von Beispielen
Beispiel 1: Videodaten retten
Im ersten Beispiel wird versucht ein Video von einer verkratzten CD zu retten. Da die CD keine tiefen Kratzer hat, und hiervon auch nicht sonderlich viele, kann man von "normaler" Abnutzung bzw. Verscheißerscheinungen sprechen. Ein versuch die Datei mit dem cp-Befehl zu kopieren, endet mit einem Fehler bei ca. der Hälfte der Daten, d.h. danach steht nur die hälfte des Videomaterials zur Verfügung.
ddrescue wird nur mit der Option
--verbose
bzw.
-v
aufgerufen, somit gibt ddrescue detailierte Informationen über den Status aus.
Ein Durchlauf könnte beispielsweise so aussehen:
Beispielausgabe einer Wiederherstellung bzw. Rettung eines GeburtstagsFeierVideos
rescue:~# ddrescue -v /cdrom/Backup-01.01.2000.tar.bz2 /backup/Backup-01.01.2000.tar.bz2


About to copy 720824 kBytes from /cdrom/Geburtstagsfeier-2000.avi to /backup/Geburtstagsfeier-2000.avi
    Starting positions: infile = 0 B,  outfile = 0 B
    Copy block size: 128 hard blocks
Hard block size: 512 bytes
Max_retries: 0    Split: yes    Truncate: no

Press Ctrl-C to interrupt
rescued:   719443 kB,  errsize:   1380 kB,  current rate:        0 B/s
   ipos:   652148 kB,   errors:    2710,    average rate:     254 kB/s
   opos:   652148 kB
Splitting error areas... 
		

Wendet man sich der Ausgabe des Progamms zurück, erkennt man, dass die Zahl der Zugriffsfehler (errors:) mit 2710 doch relativ hoch erschient.
Beruhigend ist jedoch, dass sich die fehlerhaften Daten auf nur 1380 kb balaufen.
Für diesen Konkreten Fall bedeutet dies, dass von einer ca. 700 MB großen Datei (entspricht ca. 45 Minuten Videomaterial), nur ca. 1 MB (entspricht ca. 5 Sekunden Videomaterial) nicht gerettet werden konnte.
Wobei die 5 Sekunden "Verlust" auf das ganze Video verteilt sind. Also kann man getrost davon ausgehen, dass man nicht mal selbst etwas davon bemerkt, wenn man sich das Video ansieht.


Beispiel 2: Rettung eines Backup's aus dem Jahre 2000
Dieses Beispiel ist besonders interessant, wenn man bedenkt, dass der Datenträger gut gelagert war. Man möchte meinen gebrannte CD's und DVD's "sind für die Ewigkeit", dem ist bei weitem nicht so, deshalb sollte man BESONDERS WICHTIGE Daten eventuell. regelmäßig erneut brennen.
Das wiederholte Brennen schafft eine gewisse Redundanz, und damit sinkt die Wahrscheinlichkeit des Komplettverlustes.
Beispielausgabe einer Wiederherstellung bzw. Rettung eines Backup's
rescue:~# ddrescue -v /cdrom/Backup-01.01.2000.tar.bz2 /backup/Backup-01.01.2000.tar.bz2


About to copy 720824 kBytes from /cdrom/Backup-01.01.2000.tar.bz2 to /backup/Backup-01.01.2000.tar.bz2
    Starting positions: infile = 0 B,  outfile = 0 B
    Copy block size: 128 hard blocks
Hard block size: 512 bytes
Max_retries: 0    Split: yes    Truncate: no

Press Ctrl-C to interrupt
rescued:   719443 kB,  errsize:   1380 kB,  current rate:        0 B/s
   ipos:   652148 kB,   errors:    2710,    average rate:     254 kB/s
   opos:   652148 kB
Splitting error areas... 
		

Natürlich ist es bei einem Archiv erstrebenswert, dieses völlig fehlerfrei bzw. lückenlos zu retten, da es sich sonst unter umständen nicht mehr entpacken lässt oder die Datenintegrität nicht mehr gegeben ist.
Um die Integrität zu prüfen, können Hash-Programme verwendet werden. Beispielsweise könnte mittels eines MD5-Hashes überprüft werden, ob die Daten in ordnung sind.
Um es auf den Punkt zu bringen, die Daten sollen Komplett bis aufs letzte Byte gerettet werden. ddrescue kann auch nicht zaubern, aber zumindest mit einer gewissen "hartnäckigkeit" versuchen alles zu retten.
Hier kommt die bereits oben erwähnte Option:
-r, --max-retries=>n<        exit after given retries (-1=infinity) [0]
ins Spiel. Wird hier n=-1 gewählt, so beendet sich ddrescue erst, wenn alle Daten gelesen werden konnten.
Diese Option könnte sich je nach Beschädigung des Datenträgers als sehr Zeitintensiv erweisen, doch wenn die Daten wirklich wichtig sind, wird man auch das in Kauf nehmen müssen.