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无法读取的文件。
通过运行查找扇区所在的分区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返回 inode 12345 则运行ncheck 12345。
警告:您可能需要关闭日记功能。这可能不适用于 ext4。
粗略的想法是
debugfstestb/ncheck/icheck 命令查明该块是否正在使用以及正在使用它的文件的名称smartmontools 项目站点上有一个坏块 HOWTO更详细地描述了该过程。