改变inode行为

时间:2010-12-05 21:58:00

标签: filesystems linux-kernel kernel inode

我正在尝试修改ext3文件系统。基本上我想确保文件的inode保存在与存储元数据的文件相同(或相邻)的块中。希望这应该有助于磁盘访问性能

我抓住了内核源代码,编译了它,读了一堆关于inode的内容,并查看了fs子目录中的inode.c文件。但是,我只是不确定如何确保创建的任何新文件以及此文件的inode可以保存在相同或相邻的块中。任何帮助或指向进一步阅读的指示将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

有趣的想法。

我对ext3并不是很熟悉,但我可以给你一些指导。

目前ext3在预定的地方存储inode。每个块组都有自己的inode表,一个inode数组。因此,当您有一个inode编号(即,在目录中查找文件名的结果)时,您可以首先使用inode编号在磁盘上找到相应的inode,以选择正确的块组,然后索引到该块group的inode表。

如果要将inode放在相应的文件数据旁边,则需要一个新方案来查找磁盘上的inode。如果您愿意为每个inode专用一个块,那么一个可能的方案是每次需要一个inode时分配一个新块,然后使用块号作为inode号。这可能会带来好处,对于小文件,您可以将数据存储在同一个块中。

要做出类似的事情,创建一个新文件(即分配一个inode)必须与当前的ext3文件系统完全不同。您不必使用位图来查找未使用的,预分配的和预初始化的inode,而是必须分配一个空块并自行初始化它。因此,您可能希望了解文件系统在写入文件时如何分配块,然后模仿分配inode。

另一种方案是将inode 存储在目录中。因此,保存I / O不是因为inode位于其数据旁边,而是因为当您查找文件名时,您还会读取inode。这是在90年代作为BSD的FFS文件系统中的实验完成的,并且以优秀的USENIX Paper编写。这些想法从未进入过FFS,或者进入我所知道的任何其他主流文件系统,所以看看它们在ext3中是如何工作的可能会很有趣。

无论您是采用其中一种方案还是想出自己的方案,您还必须修改 mke2fs 以新文件的方式初始化磁盘上的文件系统系统变体会理解。

祝你好运!这听起来像一个有趣的项目。

答案 1 :(得分:0)

进入文件系统设计的荣誉!

首先,在深入了解黑客攻击之前先做一些工程建议:制作ext3树的副本并将文件系统重命名为其他内容。我发现在将实验性更改引入文件系统时,您确实不希望它用于主系统。即使您引入了随机丢失文件的错误(最终会发生),您的系统仍应启动。您还需要分支ext3用户空间工具以使用新系统。

其次,请获取Bovet和Cesati的Understanding the Linux Kernel, 3 ed.副本。它提供了一个有组织的内核子系统视图,我发现它的解释是值得的。它是为较旧的内核编写的(2.6。 x ,对于某些 x < 15;我完全忘了),但它在许多地方仍然准确。仔细阅读文件系统的描述。我相信它涵盖了ext3。

第三,关于你的实际项目,你并没有提出对ext3的简单修改。该文件系统具有将inode编号映射到磁盘块的非常简单的方法。您需要找到一种新的映射方式。我不希望对ext3的其余部分进行任何更改。解决这一挑战可能是您架构的关键设计点之一。请注意,保留大量的inode - >磁盘块映射无法解决您的问题:它可能不比现有的ext3好。