MINIX内部碎片2

问题描述:

我正在写C中的一些软件,递归列出给定目录中的所有文件,现在我需要解决内部碎片问题。MINIX内部碎片2

我花了很长时间研究这个,发现ext2的内部碎片只发生在最后一个块中。我知道从理论上的inode号码你应该能够得到第一个和最后一个块地址,但我不知道如何。

我已经调查stat()fcntl()和各种方式。我如何从inode号码获取最后的块地址?

我也想通了,一旦我有最后一个块,我可以测试一下,看看有多少可用空间是在该块的地址,这会给我的内部碎片。

我知道有一个get_inode和一个get_block命令,但除此之外不知道!

+0

检查,如何'filefrag'公用工程。 http://linux.die.net/man/8/filefrag说它使用FIEMAP或FIBMAP - 它是ioctl的 – osgx

+0

谢谢,即时通讯正在寻找现在找到filefrags代码,看看它是如何做到的... – Charlie

+0

Ollie,它是e2fsprogs的一部分,路径是'/ misc/filefrag.c'。这个工具是特定于linux的,并且可能不适用于某些FS(支持EXT2/3/4) – osgx

我不认为你可以通过正规系统的磁盘块的地址得到调用,如stat()。您可能需要在磁盘上找到原始inode(这意味着访问原始磁盘,并且需要提升权限)并从那里处理数据。

通常,您会发现文件的直接块,间接块,双重间接块和三重间接块。然而,相关的文件系统类型几乎和渡渡鸟一样死了(我不认为我已经看到过这个千年的文件系统类型),所以现在不太可能有什么帮助。

有可能是一个非标准的系统调用来获取信息,但我怀疑它。

+0

因此它会是一个巨大的痛苦的屁股?这是我的文档所说的'3。下一步将是弄清楚如何遍历所有目录并访问每个文件的起始i节点。从这一点开始,您可以识别文件的最后一个块,并计算出该块内剩余的空间。所以也许有人对我说谎! – Charlie

+0

是的,这将是一个庞大的PitA。给定inode,你可以(理论上)通过从磁盘读取inode本身来找到文件的最后一个块(因此需要对原始磁盘进行特权访问)并确定最后一个块的存储位置等。_OTOH_,让我们退后一步...不是文件的大小,模块化磁盘块大小,最后一个块使用的空间量?这不会给你这些块的磁盘地址 - 但它确实为你提供了推断内部碎片所需的信息,不是吗? –

+0

是的,但我正在努力学位课程规范,我希望我可以改变他们说我们需要做的事情,但我不能:-(我已经花了大约2天的时间看着这个现在,它真的开始风我起来! – Charlie

也许你觉得太复杂,但大致的内部碎片应该能够计算出,如果你的块大小分割文件大小,并利用模。与稀疏文件或文件持有多少“等信息”(如巨大的ACL或扩展属性),有可能是一个差 -

但是,如果该文件是一个“典型的一个:”这是唯一有效的。 (我不知道他们存储在何处,但我能想象,有可能是将它们存储在最后一个块,有效(但unnoticedly)减少内部碎片的文件系统。)