1

我想使用 C 语言在 ext2 映像中访问特定的 inode(使用其编号)。我打算通过使用 open() 系统调用打开 ext2 映像,然后使用具有正确偏移量的 lseek() 遍历它,直到我到达 inode。这个对吗?还是我做错了什么?我有点困惑使用 open() 是否正确,或者有更合适的功能来做到这一点。

int fd = open("ext2fs.img", O_RDONLY);
assert(fd != -1);


off_t startPosition = lseek(fd, 0, SEEK_CUR);
assert(startPosition != -1);

我应该只添加偏移量到 startPosition 直到我到达 inode 吗?但是如何搜索特定的 inode?

更新(更具体)

我已经有了 ext2 文件系统的布局(http://www.nongnu.org/ext2-doc/ext2.html),这给了我需要的一切(所有偏移量)。我需要创建一个 C 程序来操作元数据和数据。例如,删除和复制文件。

我知道该怎么做,但我在执行它时遇到了麻烦。

例如:为了测试我是否知道自己在做什么,我正在尝试读取教授提供的 ext2 磁盘映像中的空闲 inode 数量,这样做:

#define SUPER_BLOCK 1024

int main()
{
    int freeInodes;

    int fd = open("path.img", O_RDONLY);
    off_t startPosition = lseek(fd, 0, SEEK_CUR);

    lseek(fd, startPosition + SUPER_BLOCK + 16, SEEK_CUR);
    read(fd, freeInodes, 4);
    printf("Number of free inodes: %d", freeInodes);
}

我收到的输出是:“空闲 inode 数量:32767”

我是否正确解释了从 read() 获得的数据?我不知道收到的这个值是否正确。

4

2 回答 2

1

除了绕过文件系统安全性之外,通过 inode 访问没有真正的用例。在 Linux 中,debugfs允许您这样做。如果您认为这是绝对要求,请尝试 debugfs 的源代码。

考虑使用来自文件树遍历 (ftw()/nftw() ) 的 stat() 调用作为回调,或直接使用 stat() + scandir() 以加快编码速度。任何一个都将允许您获取您有权统计的文件的所有 inode。和开放或什么。

于 2014-11-20T00:58:13.900 回答
1

您可以尝试对文件系统映像进行原始读取,类似于在fsck.ext{2,3,4}. 但是,这需要广泛了解 ext{2,3,4} 布局、磁盘结构以及对幻数(指向位图/其他元数据的磁盘偏移量)的理解,以确定 inode 位图的位置在磁盘上启动。

于 2014-11-20T02:06:39.527 回答