我在/var/log/kern.log中收到指示驱动器故障的消息。 在驱动器(ext4 – > ext3)之间复制我的$HOME消息:
[ 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
这些消息大量出现,这是其中的一个。 sdb是源驱动器。
如何找出该扇区属于哪个文件/ inode? 我只是想知道,所以我可以从备份中恢复有问题的文件。 比下面的代码更快,再加上输出的后续分析?
find . -type f -print \ -exec cp \{\} /dev/null \; \ -exec tail -n 1 /var/log/kern.log \;
操作系统:Ubuntu Oneiric。
编辑:上面的命令也输出到stderr的文件,无法读取。
粗略的想法是
debugfs testb / ncheck / icheck命令来确定该块是否正在使用以及正在使用它的文件的名称 在smartmontools项目站点有一个坏块HOWTO,详细描述了这个过程。
通过运行fdisk -lu /dev/sdb查找扇区所在的分区。 假设它是从扇区45612307开始的“sdb2”。
从95891008中减去50278701。
接下来确定每个块有多less个扇区: tune2fs -l /dev/sdb2 | grep Block tune2fs -l /dev/sdb2 | grep Block 。 假设是4096。
计算块/扇区比率:512字节/扇区/ 4096字节/块= 0.125块/扇区。
从扇区计算块:50278701 * 0.125 = 6284837.625。
使用debugfs找出哪个块正在使用。 如果icheck 6284837返回inode 12345,则运行ncheck 12345 。
注意事项:您可能需要closures日志function。 这可能不适用于ext4。