为什么 inode 大小是固定的?

为什么 inode 大小是固定的?

我正在阅读有关文件系统和存储介质的内容,但我不明白为什么如果我创建一个块大小的文件,我就不能拥有比较大文件更小的索引节点。操作系统不能根据文件大小动态选择inode大小吗?

答案1

inode 固定大小的原因之一是,在传统的 Unix 文件系统格式(例如 ext4 仍然非常接近)中,inode 是本质上存储在单个表中。对于固定大小的项目,根据索引号定位项目很简单。对于任何其他数据结构,都需要更多的工作,也许更重要的是,需要在数据结构中进行更多的随机访问读取。

文件本身的大小不会影响索引节点本身,索引节点传统上存储前几个数据块的位置。对于较长的文件,系统会分配额外的块(间接块)来保存其余位置。 (参见维基百科页面为了一张漂亮的照片。)

我说“传统”,因为例如 ext4 实际上做事不同,它可以将符号链接的内容保存在 inode 本身中(它们通常很短,因此不分配完整的块很有用),而传统的单块树被替换为范围树,即跨越几个块。

据我所知,在 ext4 上支持大于最小大小的 inode 的原因是允许存储新字段,并将额外空间用于扩展属性。查看第一个链接中的表,ext4 inode 上原始 128 字节以上的额外字段主要存储更高精度的时间戳。在 SELinux 系统中,安全标签被实现为扩展属性,因此能够将它们直接存储在 inode 中可能非常有用。

较新的文件系统(如 btrfs、XFS 和 ZFS)具有不太正统的格式,可能会以不同的方式执行操作,而且我对 BSD 系统上使用的文件系统了解不多。

答案2

索引节点本身保存文件元数据,而不保存任何数据。因此,尺寸是小还是大并不重要。此外,除了普通文件之外,还存在索引节点。例如,对于命名管道,它根本没有数据。

话虽如此,索引节点的确切格式和大小是特定于文件系统的,并且可以具有文件系统设计者想要的任何类型的行为。对于 Linux/Unix 系统,文件系统必须能够在 inode 中提供最少的信息集,但文件系统可以在磁盘和内存中内部存储更多信息。

相关内容