获取ext2映像中的特定inode(C)

时间:2014-11-19 21:39:29

标签: c filesystems inode ext2

我想使用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()获得的数据?我不知道这个值是否正确。

2 个答案:

答案 0 :(得分:1)

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

考虑使用来自文件树walk(ftw()/ nftw())的stat()调用作为回调,或者直接使用stat()+ scandir()来加快编码速度。这两种方法都允许您获取您拥有stat权限的文件的所有inode。打开或其他什么。

答案 1 :(得分:1)

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