如何从磁盘中提取原始 ext3 inode 数据?

Mic*_*nez 4 ext4 ext2 ext3

在 ext3(或 ext2/4,选择您的风格)文件系统上,如何直接从硬盘中提取与特定 inode 对应的原始字节数据?

是否有可能给定一个 inode 编号来确定它在磁盘上的位置(可能是从分区开始的偏移量,或其他一些 LBA 偏移量),然后使用一些实用程序,例如dd或系统调用(类似于 lseek,除了在文件系统上操作?)读取该数据而不必将其作为文件引用?

我假设这可以完成,也许使用某种驱动程序级实用程序。

小智 9

imapdebugfs 中的命令可以告诉您 inode 在哪里。例子:

$ debugfs -R 'imap <128901>' /dev/whatever
debugfs 1.42.5 (29-Jul-2012)
Inode 128901 is part of block group 16
        located at block 524344, offset 0x0400
Run Code Online (Sandbox Code Playgroud)

要获得 inode 128901 的原始转储,您需要寻找字节524344*block_size + 0x0400和读取inode_size字节。您可以使用statsin 命令debugfs或单独的实用程序获取大小dumpe2fs

stats或者dumpe2fs还将为您提供所有 inode 存储区域的完整列表,以便您可以构建自己的函数,该函数执行等效的功能,imap而无需debugfs每次实际调用(或以交互方式运行)。请记住,当您进行计算时,没有 inode 零。inode 1 从第一个 inode 块的字节 0 开始。

如果您想在没有外部程序的 C 程序中执行此操作,那么您应该查看libext2所有标准 ext2 实用程序都使用的库。我自己没有使用过它,但我怀疑使用 libext2 文档加上 debugfs 的源代码作为灵感,您可以imap很容易地编写自己的类似函数。

...这就是我想到的地方,也许您并不是真的想要 inode 的原始数据。也许您想要 inode 描述的文件的内容。在这种情况下,它更容易。debugfs有一个内置命令:

debugfs -R 'cat <128901>' /dev/whatever
Run Code Online (Sandbox Code Playgroud)

打印 inode 编号为 128901 的文件的内容。