Datenrettungsgeschichte

Ausgangssstatus:

  • sehr neue 500 GB Platte (Western Digital WD5000AAKB)
  • 4 Partitionen: System (10 GB), Swap (2 GB), Daten1 (1 GB), Daten2 (450 GB); Swap, Daten1 und Daten3 als logische Laufwerke innerhalb einer erweiterten Partition; alle NTFS; Windows XP

Fehler:

  • Nach nur 2 Monaten machte das System Probleme: Es hakte insgesamt; einige Programme ließen sich nicht mehr starten (u.a. Fehler über defekte DLL-Dateien); Netzwerkfreigaben waren nicht mehr zugreifbar; es ließen sich keine neuen Benutzer anlegen.
  • Nach Neuinstallation von Windows traten ähnliche Symptome auf.
  • Beim nochmaligen Versuch Windows neu zu installieren wurden im Setup die Partitionen nicht mehr erkannt. Rechner fuhr nicht mehr hoch.

Behebungs-/Rettungsversuche:

  • Auch Knoppix (von CD gebootet) sah die Partitionen nun nicht mehr. Es traten während des Bootens üble Festplatten-Fehler auf (AddrMarkNotFound; DriveReady SeekComplete DataRequest Error; UncorrectableError…).
  • leere externe 500 GB Platte besorgt um defekte Platte dumpen zu können; ext3-Dateisystem darauf angelegt
  • dumpen mit dd war erfolglos, da es, sobald ein Fehler kommt, komplett abbricht
  • (ab hier grml als Live-Linux benutzt; hat etliche Rettungstools mit drauf)
  • mit ddrescue (das macht trotz Lesefehlern weiter) versucht zu dumpen, jedoch abgebrochen, weil am Anfangsbereich der Platte anscheinend besonders viel kaputt war und es deshalb _extrem_ langsam war – höchstwahrscheinlich ist der Bereich, wo die Partitionstabelle lag, mit betroffen und deshalb erkennen die Systeme die Partitionen auch nicht mehr
  • da die System- und Swap-Partitionen am Anfang lagen und keine wichtigen Daten enthielten ddrescue anders aufgerufen um ungefähr die ersten 10 GB zu überspringen
  • ddrescue -v /dev/hda /mnt/temp/dump.bin /mnt/temp/log -i 11436756992
  • hat mit ca. 2 MB/s gedumpt und war daher erst nach 3 Tagen fertig; 50 MB Fehler sind aufgetreten
  • externe Platte an anderen Rechner angeschlossen
  • verschiedene Recovery-Tools erfolglos auf den Dump ausprobiert (u.a. testdisk) – unklar warum, evt. haben die Teile nen Problem mit, dass es kein kompletter Dump oder der Anfang komisch war

Erfolgreiches Wiederfinden der Partitionen:

  • Im Dump nach Markierungen für den Anfang von NTFS-Dateisystemen gesucht (".R.NTFS", wobei "." nichtdarstellbare Zeichen sind):
  • grep -a -b -o $‘\xeb\x52\x90\x4e\x54\x46\x53′ /media/disk/dump.bin | cut -d":" -f1 > grep_results.txt
  • grep brach irgendwann mit "Cannot allocate memory" ab; war jedoch nicht schlimm, da die wichtigen Partitionsgrenzen (Anfang von Daten1 und Daten2) schon gefunden wurden (bei einem Rechner mit 4 GB RAM)
  • alle Offsets aus grep_results.txt durchprobiert: jeweils ein readonly-loopback-Device mit entsprechendem Offset angelegt und versucht zu mounten – z.B.:
  • losetup /dev/loop0 /media/disk/dump.bin -r -o 1444063744
  • mount /dev/loop0 /mnt/temp2

Überlegungen/Anmerkungen:

  • Bei mir waren die Fundstellen 1444030976, 1444063744, 2521542656 und 2521575424. Da diese Paare (z.B. 1444030976 und 1444063744) zu dicht nebeneinander liegen (32 KB), als dass sich dazwischen eine Partition befinden könnte ist es naheliegend, dass 1444063744 und 2521575424 die echten Offsets sind. Evt. waren das Kopien des Boot/Superblocks der jeweils vorhergehenden Partition. Das soll wohl bei NTFS am Partitionsende gespeichert sein.
  • Vermutlich sind die fehlerhaften 50 MB nun noch irgendwo im Dump verteilt und einzelne Dateien zerstört.
  • Wenn im Dateisystem vorher Images von NTFS-Dateisystemen lagen könnte dies den Suchvorgang natürlich durch viele fehlerhafte Fundstellen verkomplizieren.
  • Ich hab keine Ahnung, wie sich das mit dem Partitionsende beim Loopback-Device verhält (es wird ja nur das Offset und keine Länge angegeben). Hängt vielleicht auch vom Dateisystem ab, ob es da zu Problemen kommen kann. Zumindest sollte man nicht drauf rumschreiben, daher bei losetup die Option -r für readonly.

1 Antwort auf „Datenrettungsgeschichte“


  1. 1 r00t 01. März 2011 um 20:50 Uhr

    naechstesmal statt grep: gpart
    (homepage-url wurde als spam erkannt und zensiert)

Die Kommentarfunktion wurde für diesen Beitrag deaktiviert.