我收到/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
消息是批量发送的,这是其中的一个批量。sdb
是源驱动器。
我如何找出扇区属于哪个文件/inode?我只是想知道,这样我就可以从备份中恢复相关文件。有没有比以下代码加上后续输出分析更快的方法?
find . -type f -print \
-exec cp \{\} /dev/null \; \
-exec tail -n 1 /var/log/kern.log \;
操作系统:Ubuntu Oneiric。
编辑:上面的命令也输出stderr
无法读取的文件。
答案1
粗略的想法是
- 根据物理扇区号进行一些计算,找出文件系统的块号
- 使用
debugfs
testb/ncheck/icheck 命令来查明该块是否正在使用以及正在使用该块的文件的名称
有一个smartmontools 项目网站上的 bad block HOWTO更详细地描述该过程。
答案2
运行 查找扇区位于哪个分区
fdisk -lu /dev/sdb
。假设它是“sdb2”,从扇区 45612307 开始。从 95891008 中减去该数字,得到 50278701。
接下来确定每个块有多少个扇区:
tune2fs -l /dev/sdb2 | grep Block
。假设是4096。计算块/扇区比率:512 字节/扇区/4096 字节/块 = 0.125 块/扇区。
从扇区计算块:50278701 * 0.125 = 6284837.625。
使用 debugfs 找出哪个正在使用该块。如果
icheck 6284837
返回 inode 12345,则运行ncheck 12345
。
注意事项:您可能需要关闭日志功能。这可能不适用于 ext4。