web-dev-qa-db-ja.com

特定のセクターを占有しているファイル/ inodeを特定する方法

ドライブの障害を示すメッセージを/var/log/kern.logで受け取りました。ドライブ間で$HOMEをコピー中にメッセージが表示されました(ext4-> ext3):

[ 5733.186033] sd 4:0:0:0: [sdb] Unhandled sense code
[ 5733.186038] sd 4:0:0:0: [sdb]  Result: hostbyte=invalid driverbyte=DRIVER_SENSE
[ 5733.186042] sd 4:0:0:0: [sdb]  Sense Key : Medium Error [current] 
[ 5733.186048] sd 4:0:0:0: [sdb]  Add. Sense: Unrecovered read error
[ 5733.186053] sd 4:0:0:0: [sdb] CDB: Read(10): 28 00 05 b7 2e 40 00 00 08 00
[ 5733.186064] end_request: critical target error, dev sdb, sector 95891008

メッセージは大量に届きますが、これはそれらの大量の1つです。 sdbはソースドライブです。

セクターがどのファイル/ iノードに属するかを知るにはどうすればよいですか?問題のファイルをバックアップから復元できるようにしたいのですが。次のコードとその後の出力の分析よりも速いものはありますか?

find . -type f -print \
               -exec cp \{\} /dev/null \; \
               -exec tail -n 1 /var/log/kern.log \;

OS:Ubuntu Oneiric。

編集:上記のコマンドは、読み取れなかったファイルもstderrに出力します。

7
krlmlr

おおまかな考えは

  1. 物理セクター番号に基づいてファイルシステムのブロック番号を見つけるためにいくつかの計算を行います
  2. debugfs testb/ncheck/icheckコマンドを使用して、ブロックが使用されているかどうか、およびブロックを使用しているファイルの名前を確認します

smartmontoolsプロジェクトサイトにある悪いブロックのHOWTOを参照 プロセスをより詳細に説明しています。

3
the-wabbit
  1. fdisk -lu /dev/sdbを実行して、セクターが存在するパーティションを見つけます。セクター45612307で始まる "sdb2"であるとします。

  2. 95891008からそれを引くと50278701になります。

  3. 次に、ブロックあたりのセクター数を決定します:tune2fs -l /dev/sdb2 | grep Block。 4096だとします。

  4. ブロック/セクター比を計算します:512バイト/セクター/ 4096バイト/ブロック= 0.125ブロック/セクター。

  5. セクターからブロックを計算します:50278701 * 0.125 = 6284837.625。

  6. Debugfsを使用して、ブロックを使用しているものを見つけます。 icheck 6284837がiノード12345を返す場合は、ncheck 12345を実行します。

警告:ジャーナリングをオフにする必要がある場合があります。これはext4では機能しない可能性があります。

5
Mark Wagner