我正在用C编写一些软件,递归地列出给定目录中的所有文件,现在我需要解决内部碎片问题。
我花了很长时间来研究这一点,发现ext2上的内部碎片只出现在最后一个块中。我知道从inode编号理论上您应该能够获得第一个和最后一个块地址,但我不知道如何获得。
我已经研究了stat(),fcntl()和各种各样的方法。如何从inode编号获取最后一个数据块地址?
我还计算出,一旦我有了最后一个块的地址,我就可以测试该块中有多少空闲空间,这将给我提供内部碎片。
我知道有一个get_inode和一个get_block命令,但除此之外我一无所知!
发布于 2011-12-12 04:59:42
我不认为你可以通过像stat()这样的常规系统调用来获取磁盘块的地址。您可能必须在磁盘上找到原始inode (这意味着访问原始磁盘,并且需要更高的权限)并从那里处理数据。
传统上,您会发现文件的直接块、间接块、双重间接块和三重间接块。然而,相关的文件系统类型就像渡渡鸟一样死了(我不认为我在这个千年中见过这种文件系统类型),所以现在这不太可能有太大帮助。
可能有一个非标准的系统调用来获取信息,但我对此表示怀疑。
发布于 2011-12-12 15:54:38
也许你认为太复杂了,但是如果你将文件大小除以块大小并取模数,那么大致可以计算出内部碎片。
但这只在文件是“经典文件”的情况下才有效--稀疏文件或包含大量“其他信息”(如大型ACL或扩展属性)的文件可能会有所不同。(我不知道它们存储在哪里,但我可以想象,可能有文件系统将它们存储在最后一个块中,有效地(但不明显地)减少了内部碎片。)
https://stackoverflow.com/questions/8467053
复制相似问题