UNIX 文件系统中的目录是如何实现的?

Anu*_*hne 1 filesystems directory files

这个问题是Unix 文件系统中如何实现目录的扩展

我的目标是实现基本的文件系统:在读取 inode 编号和名称后,我们知道文件的名称,因此我们可以列出目录内容,但我们无法确定条目的类型:它是另一个目录还是文件。如果目录中有 1000 个条目,那么读取 1000 个 inode 只是为了确定它是文件还是目录看起来太傻了。

我在这里遗漏了什么还是只是这样?

Huy*_*ens 7

基本上:这是你的决定

如果“UNIX 文件系统”是指 UFS,那么父目录 inode 不会缓存文件类型,它只包含文件和相应的 inode。来源:UFS 文件系统(PDF,请参阅第 15.2.2 章)

这可能不是所有文件系统的情况,这是一种设计选择。对于您的文件系统,它可能是您的设计选择。

对于这个选择的愚蠢,我不同意。想一想系统必须检查目录下的文件类型多少次?您必须平衡ls -l命令的频率与缓存 inode 中的信息所需的额外空间。
如果您的文件系统是类集群(例如 glusterfs)或类网络(例如 nfs),那么这可能是一个好主意,因为访问所有 inode 可能存在延迟。在本地存储上,这可能不太重要。
另外你的文件系统试图实现什么?如果它被设计为对包含数千个文件的目录有效,那么可能值得考虑缓存文件类型,如果它被设计为精简且占用空间最小,那么缓存是不可避免的。

关于 ext2、3 和 4 以及文件类型功能的注意事项

似乎ext2-4可以完全按照您的想法行事。它可以缓存目录条目中的文件类型。这仅对filetype作为文件系统创建时间的功能有效。使用此功能时,ext4 将使用不同的目录条目结构,该结构可以具有文件类型的缓存。这也适用于 ext2 和 ext3

  • 除了空间开销之外,还有一个缺点是在多个地方维护相同的信息。打开文件后,锁定的不是文件名,而是inode。一个文件可以链接到多个目录中。如果元数据仅存储在目录中(而不是在目录和 inode 中),那么当两个硬链接具有冲突的元数据时该怎么办? (2认同)