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

MINIX内部碎片2 我正在编写C中的一些软件,递归地列出给定目录中的所有文件,现在我需要解出内部碎片。,c,stat,minix,C,Stat,Minix,我花了很长时间研究这个问题,发现ext2上的内部碎片只发生在最后一个块中。我知道,从理论上讲,从一个inode数,你应该能够得到第一个和最后一个块地址,但我不知道如何 我已经研究了统计、fcntl和各种方法。如何从inode编号获取最后一个块地址 我还发现,一旦我有了最后一个块的地址,我可以测试该块中有多少可用空间,这将给我内部碎片 我知道有一个get_inode和一个get_block命令,但除此之外我一无所知 我认为您无法通过常规系统调用(如stat)获取磁盘块的地址。您可能必须在磁盘上找到

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

我已经研究了统计、fcntl和各种方法。如何从inode编号获取最后一个块地址

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


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

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

典型地,你会发现一个文件有直接块、间接块、双间接块和三间接块。然而,相关的文件系统类型几乎和dodo一样死气沉沉,我想我在这个千年里还没有见过这种文件系统类型,所以现在这不太可能有什么帮助


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

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

典型地,你会发现一个文件有直接块、间接块、双间接块和三间接块。然而,相关的文件系统类型几乎和dodo一样死气沉沉,我想我在这个千年里还没有见过这种文件系统类型,所以现在这不太可能有什么帮助


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

也许您认为太复杂了,但如果您将文件大小除以块大小并取模,则大致可以计算出内部碎片


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

也许你认为太复杂了,但是,如果您将文件大小除以块大小并取模,则大致可以计算出内部碎片


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

所以这将是一个巨大的痛苦?这就是我的文档所说的'3'。下一步是了解如何遍历所有目录并访问每个文件的起始i节点。从这一点上,您可以识别文件的最后一个块,并计算出该块中还有多少空间!是的,这将是一个巨大的皮塔。给定inode,理论上,您可以通过从磁盘读取inode本身来找到文件的最后一个块,因此需要对原始磁盘进行特权访问,并确定最后一个块存储在哪里,等等。OTOH,让我们退一步……文件的大小不是以磁盘块大小、最后一个块中使用的空间量为模吗?这并没有给你这些块的磁盘地址,但它确实给了你推断内部碎片所需的信息,不是吗?是的,但我正在攻读学位课程规范,我希望我能去改变他们说我们需要做的事情,但我不能:-我已经花了大约两天的时间研究这个问题,现在真的开始让我发疯了!那么这将是一个巨大的痛苦的屁股?这就是我的文档所说的'3'。下一步是了解如何遍历所有目录并访问每个文件的起始i节点。从这一点上,您可以识别文件的最后一个块,并计算出该块中还有多少空间!是的,这将是一个巨大的皮塔。给定inode,理论上,您可以通过从磁盘读取inode本身来找到文件的最后一个块,因此需要对原始磁盘进行特权访问,并确定最后一个块的存储位置,等等,
让我们退一步…文件的大小不是以磁盘块大小为模数,还是最后一个块中使用的空间量?这并没有给你这些块的磁盘地址,但它确实给了你推断内部碎片所需的信息,不是吗?是的,但我正在攻读学位课程规范,我希望我能去改变他们说我们需要做的事情,但我不能:-我已经花了大约两天的时间研究这个问题,现在真的开始让我发疯了!检查filefrag实用程序的工作原理。说它使用FIEMAP或FIBMAP-这是ioctl的任务,我现在正在寻找filefrags代码,看看它是如何做到的…奥利,它是e2fsprogs的一部分,路径是/misc/filefrag.c。此实用程序特定于linux,可能无法与某些支持EXT2/3/4的FS一起使用检查filefrag实用程序的工作原理。说它使用FIEMAP或FIBMAP-这是ioctl的任务,我现在正在寻找filefrags代码,看看它是如何做到的…奥利,它是e2fsprogs的一部分,路径是/misc/filefrag.c。此实用程序特定于linux,可能无法与支持EXT2/3/4的某些FS一起使用