这个问题延伸到Unix 文件系统中的目录是如何实现的?
我的目标是实现基本的文件系统:在读取 inode 编号和名称后,我们知道文件的名称,因此我们可以列出目录内容,但我们无法确定条目的类型:它是另一个目录还是文件。如果目录中有 1000 个条目,那么仅仅读取 1000 个 inode 来确定它是文件还是目录看起来就太傻了。
我在这里错过了什么还是只有这种方式?
答案1
基本上:这是你的决定
如果“UNIX 文件系统”指的是 UFS,那么父目录 inode 不会缓存文件类型,它只包含文件和相应的 inode。来源:UFS 文件系统(PDF,请参阅第 15.2.2 章)
并非所有文件系统都是如此,这是一种设计选择。对于你的文件系统来说它可能是你的设计选择。
对于这个选择的愚蠢,我不同意。想想系统要检查一个目录下的文件类型多少次?您必须平衡ls -l
命令的频率与在索引节点中缓存信息所需的额外空间。
如果您的文件系统是类集群(例如 glusterfs)或类网络(例如 nfs)的文件系统,那么由于访问所有 inode 可能存在延迟,这可能是一个好主意。在本地存储上,这可能不是一个问题。
此外,您的文件系统想要实现什么目标?如果它被设计为对包含数千个文件的目录有效,那么可能值得考虑缓存文件类型,如果它被设计为精简且占用空间最小,则无法避免缓存。
关于 ext2、3 和 4 以及文件类型功能的注意事项
似乎ext2-4
完全可以实现您的想法。它可以缓存目录项中的文件类型。该功能仅filetype
在文件系统创建时有效。当使用这个特性时,那么ext4 对目录项使用不同的结构它可以有文件类型的缓存。这也适用于 ext2 和 ext3。