web-dev-qa-db-ja.com

セクターのリストからファイルのリストを生成するにはどうすればよいですか?

ハードディスクに障害が発生し、GNUのddrescueを使用してディスク(1TB)から一部のデータをレスキューすることができました。ディスクの最後の800GBは完全で、単一のエラーはありませんでしたが、最初の200GBでは、ほぼ14000のエラー(badblocks)がエリア全体に広がっていました。 ddrescueは、badblockがどこにあるかを説明するログファイルを作成します。

ddrescuesコマンドラインパラメータ:

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

ログファイルは次のようになります。

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

プラス(+)は連続した適切なスペース、マイナス(-)は読み取り不可能なスペースを意味します。位置とサイズは16進数です。 '+'で終わる行をストライピングするバッドブロックの位置のリストがありますが、このバッドブロックをファイルシステム上のファイル(ちなみにNTFS)に関連付ける方法が必要です。

DiskExplorer のようなものを使用してこれを手動で実行できることは知っていますが、14000セクターの場合は地獄になります。だから、これを行うための多かれ少なかれ自動でエレガントな方法がありますか?

7
Miguel Santos

この質問の大成功以来、もしあれば、私は答えがないままにされてきました。しかし、調査を続けたところ、1999年に作成されたnfi.exeというMicrosoftユーティリティが、 Windows NT 4および2000用のOEMサポートツールフェーズ3サービスリリース2 の一部であることがわかりました。ユーティリティは私が必要としたことを正確に実行し、セクターを受け取り、ファイルを返します。しかし、それは個々のセクターに対して行われるため、プロセスを自動化するためのスクリプトを作成する必要がありました。このように機能するのはPython(2.7+)スクリプトです。

入力としてddrescueログファイルを受け取り、それを解析し、ファイル内の各セクターに対してnfi.exeを呼び出し、ファイルのアルファベット順のリストを生成します。

>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

例:

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

ここで、sdb.logはddrescueのログです。

\ device\harddisk0\dr0は、HDへのNTスタイルのパスです( WinObj と呼ばれるsysinternalsツールとディスクの管理ユーティリティを使用して検出します) WinObj showing physical device listenter image description here

filelist.txtは、必要なファイルリストです。次のようになります。

\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

スクリプトの他の引数はオプションであり、-hを指定して実行すると説明されます。デフォルトでは、スクリプトはnfi.exeが同じディレクトリにあると想定します。そうでない場合は、-npathtonfi.exeを使用します。

最後に、スクリプトへのリンクは次のとおりです。 sector_correlator.py

これは非常に初歩的なものであり、エラー処理はありませんが、機能します。

6
Miguel Santos

これは、故障したドライブをチェックしようとしたことに基づく回答(#1)の補足です。 1)引き続きnfi.exeを取得して使用できます(少なくともwinxpを使用)。上記のAns#1のリンクされたMSページにoem3sr2.Zipとしてリストされているファイルをダウンロードします。

現在のバージョンのnfi.exeでは、ドライブパスを掘り下げる必要がないことがわかりました。単純なドライブ文字で十分です。例:「K:」

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

ただし(私の強みはPerlにあるので、Pythonを読んでもあまり期待しないでください)、スクリプトは「-」に一致する行ごとに1つのブロックしかチェックしないようです。したがって、ログファイルが200個の連続した不良ブロック(ログファイル行の2番目の番号)を報告した場合、スクリプトは最後の199ブロックでさまざまなファイルの関連付けをチェックしていません。

Linuxでは、ddrescuelog -l- badsectors.logを使用して展開し、すべての不良ブロックを表示できます。残念ながら、その理由はわかりませんが、Ubuntuのddrescueの実装にはddrescuelogが含まれていません(ただし、debianから最新のものを入手し、コンパイルしてインストールするのは、私が見た中で最も簡単です)。

1
J Tweed

私は今不良ディスクを回復しています、そしてこれを試すつもりです:

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

...これ(バージョン2.1以降)にはddru_ntfsfindbadが含まれています:

Ddru_ntfsfindbadは、どのファイルがddrescueログファイルの不良セクタに関連しているかを見つけるためのNTFSパーティションのユーティリティです。

インストールとは、ソースからコンパイルすることを意味しますが、Ubuntuマシン(VM)が横になっているため、提供されている手順で簡単にできます。

0
Mark Cranness