整个文件系统是否有一个索引节点表,或者每个块组都有一个索引节点表?

整个文件系统是否有一个索引节点表,或者每个块组都有一个索引节点表?

下图显示了“柱面组”(我认为现在通常称为块组)的布局,似乎描述了每个块组都有自己的索引节点表:

气缸组

然而,本书Linux 编程接口关于 inode 表有这样的说法:

文件系统的 i 节点表为驻留在文件系统中的每个文件包含一个 i 节点(索引节点的缩写)。

这意味着整个文件系统有一个索引节点表,而不是每个块组都有一个索引节点表。

那么有没有:

  • 整个文件系统的一个 inode 表
  • 每个块组有一个 inode 表,仅跟踪该组中的 inode
  • 整个文件系统的一个索引节点表被备份到组中(类似于超级块跨组备份的方式)
  • 还有别的吗?

请注意,我可能在 ext2/3 和 ext4 之间混合了一些内容,从我在网上阅读的内容中并不总是清楚所涵盖的内容。

谢谢。

答案1

规范的 ext4 文档现已发布内核文档的一部分。参考这一点,你的问题的答案是选项2,

每个块组有一个 inode 表,仅跟踪该组中的 inode

索引节点表本身被描述在索引节点描述中

inode 表是一个线性数组struct ext4_inode。该表的大小应有足够的块来存储至少sb.s_inode_size * sb.s_inodes_per_group字节。包含 inode 的块组的编号可以计算为(inode_number - 1) / sb.s_inodes_per_group,组表中的偏移量为(inode_number - 1) % sb.s_inodes_per_group。没有索引节点 0。

这确认了每个索引节点表描述了相应组中的索引节点。

块组的总体布局如下所示布局部分。它与您的图表匹配,但正如您怀疑的那样,确实可以有多个块组,每个块组都有自己的数据结构,用于描述其内容(而不是整个文件系统的内容)。

ext4 还有一个额外的怪癖:灵活的块组。启用此功能后,可以将多个块组合并为一个,并且它们的所有 inode 表都存储在第一个块组中。这意味着块组指向其 inode 表(和其他数据结构)的指针可以指向块组之外!

相关内容