在 ext3(或 ext2/4,选择您的风格)文件系统上,如何直接从硬盘中提取与特定 inode 对应的原始字节数据?
是否有可能给定一个 inode 编号来确定它在磁盘上的位置(可能是从分区开始的偏移量,或其他一些 LBA 偏移量),然后使用一些实用程序,例如dd
或系统调用(类似于 lseek,除了在文件系统上操作?)读取该数据而不必将其作为文件引用?
我假设这可以完成,也许使用某种驱动程序级实用程序。
小智 9
imap
debugfs 中的命令可以告诉您 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
字节。您可以使用stats
in 命令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 的文件的内容。