ドライブの障害を示すメッセージを/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
に出力します。
おおまかな考えは
debugfs
testb/ncheck/icheckコマンドを使用して、ブロックが使用されているかどうか、およびブロックを使用しているファイルの名前を確認しますsmartmontoolsプロジェクトサイトにある悪いブロックのHOWTOを参照 プロセスをより詳細に説明しています。
fdisk -lu /dev/sdb
を実行して、セクターが存在するパーティションを見つけます。セクター45612307で始まる "sdb2"であるとします。
95891008からそれを引くと50278701になります。
次に、ブロックあたりのセクター数を決定します:tune2fs -l /dev/sdb2 | grep Block
。 4096だとします。
ブロック/セクター比を計算します:512バイト/セクター/ 4096バイト/ブロック= 0.125ブロック/セクター。
セクターからブロックを計算します:50278701 * 0.125 = 6284837.625。
Debugfsを使用して、ブロックを使用しているものを見つけます。 icheck 6284837
がiノード12345を返す場合は、ncheck 12345
を実行します。
警告:ジャーナリングをオフにする必要がある場合があります。これはext4では機能しない可能性があります。