Wie kann ich eine Liste von Dateien aus einer Liste von Sektoren generieren?

7

Ich hatte einen Festplattenfehler und konnte mit GNUs einige Daten von der Festplatte (1 TB) retten ddrescue. Die letzten 800 GB der Festplatte waren perfekt, kein einzelner Fehler, aber bei den ersten 200 GB gab es fast 14000 Fehler (Badblocks), die über den gesamten Bereich verteilt waren. ddrescueErstellt eine Protokolldatei, die beschreibt, wo sich die Badblocks befinden.

ddrescues Befehlszeilenparameter:

ddrescue /dev/sdb /dev/sdd /mnt/sdc1/sdb.log -r -1 -f -d -v

Die Protokolldatei sieht folgendermaßen aus:

#      pos        size  status
0x00000000  0x1C08CE00  +
0x1C08CE00  0x00000200  -
0x1C08D000  0x011E6800  +
0x1D273800  0x00000200  -
0x1D273A00  0x005EC000  +
0x1D85FA00  0x00000200  -
...         ...         ...

Das Pluszeichen (+) bedeutet zusammenhängenden guten Raum, das Minuszeichen (-) unlesbarer Raum; Position und Größe sind hexadezimal. Streifen, die mit '+' enden Ich habe eine Liste mit Badblock-Positionen, aber ich brauche eine Möglichkeit, diese Badblocks mit Dateien im Dateisystem zu korrelieren, das übrigens NTFS ist.

Ich weiß, dass ich so etwas wie DiskExplorer manuell verwenden kann, aber mit 14000 Sektoren wäre es die Hölle . Es gibt also eine mehr oder weniger automatische und elegante Möglichkeit, dies zu tun?

Miguel Santos
quelle

Antworten:

6

Seit dem großen Erfolg dieser Frage habe ich keine Antworten mehr, wenn es welche gab. Ich recherchierte jedoch weiter und fand ein Microsoft-Dienstprogramm aus dem Jahr 1999 mit dem Namen nfi.exe, das Teil des Phase-3-Service Release 2 der OEM-Support-Tools für Windows NT 4 und 2000 ist . Das Dienstprogramm macht genau das, was ich brauchte, empfängt einen Sektor und gibt eine Datei zurück. Da dies jedoch für einzelne Sektoren gilt, musste ich ein Skript erstellen, um den Prozess zu automatisieren. Es ist ein Python-Skript (2.7+), das folgendermaßen funktioniert:

Es empfängt als Eingabe eine ddrescue-Protokolldatei, analysiert sie, ruft nfi.exe für jeden Sektor in der Datei auf und generiert eine Liste mit den Dateien in alphabetischer Reihenfolge.

>sector_correlator.py -h

usage: sector_correlator.py [-h] [-v] [-n \path\to\nfi.exe] [-V] [-L]
                        logfile nt-device-path output file

Receives a list of sectors and returns a list of files which resides in them.

positional arguments:
  logfile              path to ddrescue's logfile.
  nt-device-path       NT-style path to physical device, like
                       \device\harddisk1\dr1
  output file          filelist output file name

optional arguments:
  -h, --help           show this help message and exit
  -v, --version        show program's version number and exit
  -n \path\to\nfi.exe  nfi.exe's path, if not speciified, assumes's it is in
                       the same path as the script
  -V                   enables verbose mode
  -L                   save nfi.exe's output log to nfi_raw.log

Beispiel:

sector_correlator.py sdb.log \devices\harddisk0\dr0 filelist.txt

Wobei: sdb.log das Protokoll von ddrescue ist,

\ device \ harddisk0 \ dr0 ist ein Pfad im NT-Stil zur Festplatte (Sie ermitteln ihn mit einem sysinternalen Tool namens WinObj und dem Disk Management Utility).WinObj zeigt die Liste der physischen Geräte an Geben Sie hier die Bildbeschreibung ein

und filelist.txt ist die gewünschte Dateiliste. Es wird so aussehen:

\Documents\Downloads\Evernote_4.5.1.5432.exe
\Documents\Downloads\Programs\Apophysis207SE.exe
\Documents\Downloads\Programs\GetGnuWin32-0.6.21.exe
\Documents\Downloads\Programs\mbam-setup.exe
\Documents\Downloads\Programs\msnbackup133.exe
\Documents\Downloads\Programs\x64Components_v254.exe

Die anderen Argumente im Skript sind optional und werden erklärt, wenn Sie es mit -h ausführen. Standardmäßig geht das Skript davon aus, dass sich nfi.exe im selben Verzeichnis befindet. Wenn nicht, verwenden Sie -n pathtonfi.exe.

Schließlich ist hier der Link zum Skript: Sektor_Korrelator.py

Es ist sehr rudimentär und hat keine Fehlerbehandlung, macht aber den Job.

Miguel Santos
quelle
1

Dies ist eher ein Nachtrag zur Antwort (Nr. 1), der auf meinen Versuchen basiert, mein fehlerhaftes Laufwerk zu überprüfen. 1) Sie können weiterhin nfi.exe herunterladen und verwenden (mindestens mit winxp). Sie laden die als oem3sr2.zip aufgeführte Datei auf der oben verlinkten MS-Seite in Ans # 1 herunter.

Ich habe festgestellt, dass Sie mit der aktuellen Version von nfi.exe den Laufwerkspfad NICHT ausgraben müssen. Ein einfacher Laufwerksbuchstabe reicht aus ... zB "K:"

python sector_correlator.py badsectors.log k: badfiles.txt

Allerdings (und meine Stärke liegt in Perl, also erwarte nicht viel von meinem Lesen von Python), scheint es mir, dass das Skript nur einen Block pro Zeile überprüft, der mit '-' übereinstimmt. Wenn in der Protokolldatei 200 aufeinanderfolgende fehlerhafte Blöcke gemeldet wurden (die zweite Nummer der Protokolldateizeile), hat das Skript die letzten 199 Blöcke nicht auf verschiedene Dateizuordnungen überprüft.

Unter Linux können Sie ddrescuelog -l- badsectors.log verwenden , um alle fehlerhaften Blöcke anzuzeigen . Leider und ich verstehe nicht warum, enthält Ubuntus Implementierung von ddrescue kein ddrescuelog (aber es ist ziemlich einfach, das Neueste von debian zu bekommen und es zu kompilieren und zu installieren, ungefähr das einfachste, das ich je gesehen habe).

J Tweed
quelle
0

Ich stelle gerade eine fehlerhafte Festplatte wieder her und werde Folgendes versuchen:

http://sourceforge.net/projects/ddrutility/

... die (ab Version 2.1) ddru_ntfsfindbad enthält:

Ddru_ntfsfindbad ist ein Dienstprogramm für NTFS-Partitionen, mit dem ermittelt werden kann, welche Dateien in einer ddrescue-Protokolldatei mit fehlerhaften Sektoren verknüpft sind.

Installation bedeutet Kompilieren aus dem Quellcode, aber mit einer herumliegenden Ubuntu-Maschine (VM) machten die bereitgestellten Anweisungen dies einfach.

Mark Cranness
quelle