如何确定哪个文件/inode 占用给定扇区

如何确定哪个文件/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

消息是批量发送的,这是其中的一个批量。sdb是源驱动器。

我如何找出扇区属于哪个文件/inode?我只是想知道,这样我就可以从备份中恢复相关文件。有没有比以下代码加上后续输出分析更快的方法?

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

操作系统:Ubuntu Oneiric。

编辑:上面的命令也输出stderr无法读取的文件。

答案1

粗略的想法是

  1. 根据物理扇区号进行一些计算,找出文件系统的块号
  2. 使用debugfstestb/ncheck/icheck 命令来查明该块是否正在使用以及正在使用该块的文件的名称

有一个smartmontools 项目网站上的 bad block HOWTO更详细地描述该过程。

答案2

  1. 运行 查找扇区位于哪个分区fdisk -lu /dev/sdb。假设它是“sdb2”,从扇区 45612307 开始。

  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返回 inode 12345,则运行ncheck 12345

注意事项:您可能需要关闭日志功能。这可能不适用于 ext4。

相关内容