2010-12-05 71 views
1

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

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

回答

0

有趣的想法。

我不是深深熟悉的ext3,但我可以给你一些一般的指针。

当前ext3在预定位置存储inode。每个块组都有自己的inode表,这是一个inode数组。所以当你有一个索引节点号时(例如,作为在一个目录中查找文件名的结果),你可以通过首先使用索引节点编号来选择正确的块组然后索引到该块组的inode表。

如果你想要把inode的旁边,相应的文件数据,你需要寻找在磁盘上一个inode一项新的计划。如果您愿意为每个inode分配一个块,则可能的方案是每次需要inode时分配一个新块,然后使用该块号作为inode编号。这可能有好处,对于小文件,您可以将数据存储在同一个块中。

为了做到这样的事情,创建一个新文件(即分配一个inode)必须与当前的ext3文件系统非常不同。不必使用位图来查找未使用,预分配和预初始化的inode,您将不得不分配空白块并自行初始化它。因此,您可能需要考虑文件系统在写入文件时如何分配块,然后模拟分配inode的情况。

另一种方案是将索引节点店内的目录。因此,保存I/O不是因为inode位于其数据旁边,而是因为在查找文件名时还读取了inode。这是在90年代作为BSD的FFS文件系统中的一个实验完成的,并且写成了非常好的USENIX Paper。这些想法从来没有将其引入FFS或我意识到的任何其他主流文件系统,所以看看它们如何在ext3中工作可能很有趣。

无论您是追求这些方案中的一种或拿出自己的东西,你也必须修改mke2fs的来初始化磁盘上的文件系统的方式,新的文件系统变种就会明白。

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

0

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

首先,有些工程咨询你之前也深入到黑客:使ext3的树的副本和文件系统重命名为别的东西。我发现,在将实验性更改引入文件系统时,您确实不希望将其用于主系统。即使你引入了一个随机丢失文件的错误(它最终会发生),你的系统仍应该启动。你还需要分支ext3用户空间工具来处理你的新系统。

其次,去了播威和Cesati得到Understanding the Linux Kernel, 3 ed.副本。它展示了内核子系统的组织视图,我发现它的解释是值得的。它是为较旧的内核编写的(2.6。x对于某些x < 15;我完全忘记了),但它在许多地方仍然是准确的。通读它对文件系统的描述。我相信它涵盖了ext3。

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