在 linux 和 ext3/4 上从原始设备中的偏移量反向查找 inode/文件?

lil*_*njn 11 linux ext3 inode ext4

在 linux 中,给定原始磁盘设备的偏移量,是否可以映射回分区 + inode?

例如,假设我知道字符串“xyz”包含在 /dev/sda 上的字节偏移量 1000000 处:(例如 xxd -l 100 -s 1000000 /dev/sda 显示以“xyz”开头的转储)

1)如何确定偏移量 1000000 位于哪个分区(如果有)?(我想这很容易,但为了完整起见,我将其包括在内)

2) 假设偏移量位于分区中,我该如何查找它属于哪个 inode(或确定它是空闲空间的一部分)?大概这是特定于文件系统的,在这种情况下,有人知道如何为 ext4 和 ext3 执行此操作吗?

小智 16

我只需要做类似的事情,所以我想我会分享我的解决方案。

您可以通过检查 udisks --show-info 输出的“偏移量”和“大小”元素来查看驱动器字节偏移量属于哪个分区;例如

user@host:~$ sudo udisks --show-info /dev/sda1 | grep -i 'offset'
    offset:                    1048576
    alignment offset:          0
Run Code Online (Sandbox Code Playgroud)

从磁盘偏移量中减去这个偏移量,得到分区中的字节偏移量。所以 /dev/sda 中的磁盘偏移量 (10000000) 是 /dev/sda1 中的分区偏移量 (10000000 - 1048576) = 8951424

您可以使用以下命令找出分区中的块大小:

user@host:~$ sudo tune2fs -l /dev/sda1  | grep -i 'block size'
Block size:               4096
Run Code Online (Sandbox Code Playgroud)

将分区字节偏移除以块大小来确定块偏移,本例中为 8951424 / 4096 = 2185

运行以下命令以找出占用该块的 inode:

user@host:~$ sudo debugfs -R "icheck 2185" /dev/sda1
debugfs 1.41.11 (14-Mar-2010)
Block   Inode number
2185    123456 
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令找出该 inode 的文件名:

user@host:~$ sudo debugfs -R "ncheck 123456" /dev/sda1
debugfs 1.41.11 (14-Mar-2010)
Inode   Pathname
123456  /tmp/some-filename.txt
Run Code Online (Sandbox Code Playgroud)

http://www.randomnoun.com/wp/2013/09/12/determining-the-file-at-a-specific-vmdk-offset上有更详细的描述