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

krl*_*mlr 9 linux ubuntu hard-drive analysis forensics

我收到/var/log/kern.log了表明驱动器故障的消息。$HOME在驱动器之间复制 my 时出现消息(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
Run Code Online (Sandbox Code Playgroud)

消息成批出现,这是其中之一。sdb是源驱动器。

如何找出扇区所属的文件/inode?我只是想知道这样我就可以从备份中恢复有问题的文件。有什么比下面的代码加上对输出的后续分析更快的吗?

find . -type f -print \
               -exec cp \{\} /dev/null \; \
               -exec tail -n 1 /var/log/kern.log \;
Run Code Online (Sandbox Code Playgroud)

操作系统:Ubuntu Oneiric。

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

Mar*_*ner 7

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

警告:您可能需要关闭日记功能。这可能不适用于 ext4。


the*_*bit 4

粗略的想法是

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

smartmontools 项目站点上有一个坏块 HOWTO更详细地描述了该过程。