Steve Best,Linux 技术中心,IBM
Dave Kleikamp,Linux 技术中心,IBM
本文描述磁盘日志文件系统(JFS)布局,以及使用磁盘布局结构来实现可扩展性、可靠性和性能的机制。还会了解用来操作这些结构的策略和算法,以及 JFS 是在哪里使用遍布文件系统的 B+ 树来提高文件系统操作性能。
JFS 体系结构可通过其磁盘布局特性的上下文进行说明。磁盘布局是 JFS 用来控制文件系统的格式。本文讨论盘区的文件几何构造、目录格式、块分配映射表格式、inode 和布局结构的其它特性。本文还提供了文件布局使用的 B+ 树数据结构的细节和示例。选择 B+ 树是为了提高读写盘区的性能,这是 JFS 执行的最普通操作。
分区、聚集、分配组、文件集
这里是磁盘布局的“全景图”。
分区
JFS 文件系统建立在分区上,分区是由 FDISK 导出到 JFS 的抽象。
分区有:
固定分区块尺寸,其合法值为 512、1024、2048 或 4096 字节。分区块尺寸定义了分区上支持的最小 I/O 单元。这对应于组成分区的物理设备的基本磁盘扇区大小,最普遍的尺寸是 512 字节。
大小为:PART_NBlocks,是分区磁盘块数。
分区磁盘块的抽象地址空间 [ 0.. PART_NBlocks - 1 ]。
聚集
为了支持 DCE DFS(分布式计算环境分布式文件系统),JFS 将磁盘空间分配池(称为聚集)的概念, 与可安装的文件系统子树(称为文件集)的概念分开。本文中聚集和文件集的术语与其 DFS 用法一致。每个分区刚好只有一个聚集;每个聚集可能有多个文件集。在第一个发行版中,JFS 仅支持每个聚集一个文件集;但是,所有元数据都已设计成适用于所有情况。

图 1 显示带有两个文件集的聚集的布局。
聚集有:
在此聚集的开始部分有 32K 保留区域。
固定的聚集块尺寸,其合法值为 512、1024、2048 或 4096 字节,但不小于分区块尺寸。聚集块尺寸定义了聚集上支持的最小空间分配单元。不要把它与分区块尺寸混淆起来,后者定义的是 I/O 的最小单元。
主聚集超级块和辅助聚集超级块。超级块包含聚集方面的信息,例如:聚集的大小、分配组的大小、聚集块的尺寸等等,辅助聚集超级块是主聚集超级块的直接副本。如果主聚集超级块损坏,则使用辅助聚集超级块。这些超级块位于固定位置。这使得 JFS 不依赖任何其它信息,就能够找到它们。超级块结构在 jfs_superblock.h 的 struct jfs_superblock 中定义。
聚集 inode 表,包含描述聚集范围的控制结构的 inode 。聚集 inode 表逻辑上包含一个 inode 数组。聚集无目录结构;在聚集或文件集名字空间中,任何地方都没有聚集 inode 。
辅助聚集 inode 表,包含从聚集 inode 表复制的 inode 。由于对任何文件系统信息的查找而言,聚集 inode 表中的 inode 都是至关重要的,所以它们每一个在辅助聚集 inode 表中都有备份。当然,不会复制 inode 的实际数据,而只是复制可用来查找数据和 inode 本身的寻址结构。
聚集 inode 映射表,描述聚集 inode 表。聚集 inode 分配映射表包含聚集 inode 上及其磁盘位置上的分配状态信息。
辅助聚集 inode 映射表,描述辅助聚集 inode 表。由于必须复制聚集 inode 表本身,辅助聚集 inode 映射表实际上是与聚集 inode 分配映射表分开的映射结构。
块分配映射表,描述在聚集内分配和释放聚集磁盘块的控制结构。块分配映射表在聚集磁盘块内进行一对一映射。
fsck 工作区(未在图 1 中显示),它为 fsck 提供用来跟踪聚集块分配的空间。因为 JFS 支持超大聚集,所以这一区域是必需的;当 fsck 运行时,可能没有足够的内存用来跟踪内存中的这些信息。超级块描述了这一区域。每个聚集块需要一位。fsck 工作区总是存在于聚集的末端。
内嵌日志(未在图 1 中显示)为记录聚集中的元数据更改提供了空间。超级块描述了这一区域。内嵌日志总是紧跟 fsck 工作空间后。
初始情况下,在聚集创建时分配了第一个 inode 盘区。按需要动态分配和释放其它 inode 盘区。每个聚集 inode 描述聚集本身的某些方面,如下:
保留聚集 inode 0。
聚集 inode 1,即自身 inode ,描述包括聚集 inode 映射表的聚集磁盘块。这是一种循环表示法,因为聚集 inode 1 本身也在自己所描述的文件中。可通过强制规定至少第一个聚集 inode 盘区要在众所周知的位置,即主聚集超级块后面 4K 的位置,来处理以上显而易见的循环表示法问题。因此,JFS 能轻而易举地找到聚集 inode 1,从聚集 inode 1,通过跟随 inode 1 中的 B+ 树,能找到聚集 inode 表的余下 inode 。
要复制聚集 inode 表,JFS 还需要找到聚集 inode 1 的副本,以查找所复制表的其余部分。超级块会包含一个盘区描述符,该描述符描述辅助聚集 inode 表的第一个 inode 盘区的位置。JFS 能够从中找到辅助聚集 inode 1,以及辅助聚集 inode 表的余下部分。
聚集 inode 2 描述块分配映射表。
聚集 inode 3 描述安装时的内嵌日志。虽然分配了 inode ,但无数据存入磁盘。
聚集 inode 4 描述在聚集格式化期间发现的坏块。在块映射表中这些标记成已分配。该 inode 是数据为坏块的普通文件。
保留聚集 inode 5 到 15 以备将来扩展。
从聚集 inode 16 开始,每个文件集有一个 inode ,即文件集分配映射表 inode 。这个 inode 描述了表示文件集的控制结构。当更多文件集添加到聚集中时,为了容纳更多的文件集 inode ,聚集 inode 表本身可能必须增大。
分配组
分配组(AG)把聚集中的空间分成大块,并且允许 JFS 资源分配策略使用众所周知的方法,来实现更好的 JFS I/O 性能。首先,分配策略尝试将相关数据的磁盘块和磁盘 inode 集群起来,使磁盘实现好的局域性。文件通常是顺序地读写,而目录中的文件通常一起访问。其次,为了容纳局域性,分配策略尝试在整个聚集中分配不相关数据。聚集内的分配组用从 0 开始的 AG(分配组)索引。即用 AG 标识。
必须选择分配组大小,以使 AG 足够大以不断提供连续资源分配。为了将聚集扩充或缩小时所需进行的更新数最小化,分配组必须限制最大组数 128。此外,JFS 将对 8192 个聚集块的分配组大小规定其最小值。分配组大小必须总是 1 个 dmap 页(1、2、4、8、 ...dmap 页)描述的块数的 2

投稿指南


