【问题标题】:MINIX Internal Fragmentation 2MINIX内部碎片2
【发布时间】:2012-01-18 00:26:18
【问题描述】:

我正在用 C 语言编写一些软件,它会递归地列出给定目录中的所有文件,现在我需要解决内部碎片问题。

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

我已经研究过stat()fcntl() 和各种方式。如何从 inode 号中获取最后一个块地址?

我还发现,一旦我有了最后一个块的地址,我就可以测试该块中有多少可用空间,这会给我内部碎片。

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

【问题讨论】:

  • 检查filefrag 实用程序的工作原理。 linux.die.net/man/8/filefrag 说它使用 FIEMAP 或 FIBMAP - 它是 ioctl 的
  • 谢谢,我现在正在尝试寻找 filefrags 代码,看看它是如何做到的......
  • Ollie,它是 e2fsprogs 的一部分,路径是 /misc/filefrag.c。此实用程序是 linux 特定的,可能不适用于某些 FS(支持 EXT2/3/4)

标签: c stat minix


【解决方案1】:

我认为您无法通过诸如stat() 之类的常规系统调用来获取磁盘块的地址。您可能必须在磁盘上找到原始 inode(这意味着访问原始磁盘,并且需要提升权限)并从那里处理数据。

通常,您会发现文件的直接块、间接块、双重间接块和三重间接块。但是,相关的文件系统类型和渡渡鸟一样已经死了(我想我在这个千年里还没有见过这种文件系统类型),所以现在不太可能有太大帮助。

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

【讨论】:

  • 所以这会是一个巨大的痛苦吗?这就是我的文档所说的'3。下一步是研究如何遍历所有目录并访问每个文件的起始 i 节点。从那时起,您就可以识别文件的最后一个块,并计算出该块内还剩下多少空间。所以也许有人在骗我!
  • 是的,这将是一个巨大的 PitA。给定 inode,您可以(理论上)通过从磁盘读取 inode 本身(因此需要对原始磁盘进行特权访问)并确定最后一个块的存储位置等来找到文件的最后一个块。 OTOH,让我们退后一步......不是文件的大小,以磁盘块大小为模,最后一个块中使用的空间量吗?这不会为您提供这些块的磁盘地址 - 但它确实为您提供了推断内部碎片所需的信息,不是吗?
  • 是的,但我正在研究学位课程规范,我希望我可以改变他们所说的我们需要做的事情,但我不能:-(我现在花了大约 2 天的时间来研究这个它真的开始让我兴奋了!
【解决方案2】:

可能你想的太复杂了,但是如果将文件大小除以块大小并取模,大致内部碎片应该可以计算出来。

但这仅在文件是“经典文件”时才有效——对于稀疏文件或包含大量“其他信息”(例如巨大的 ACL 或扩展属性)的文件,可能会有所不同。 (我不知道它们存储在哪里,但我可以想象可能有文件系统将它们存储在最后一个块中,有效地(但不被注意地)减少了内部碎片。)

【讨论】:

    猜你喜欢
    • 2017-01-29
    • 2015-12-21
    • 2010-11-15
    • 2018-01-08
    • 2013-08-14
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    相关资源
    最近更新 更多