我想使用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? p>
更新(更具体)
我已经拥有了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()获得的数据?我不知道这个值是否正确。
答案 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位图的位置从磁盘开始。