JFS 体系结构可通过其磁盘布局特性的上下文进行说明。磁盘布局是 JFS 用来控制文件系统的格式。本文讨论盘区的文件几何构造、目录格式、块分配映射表格式、inode 和布局结构的其它特性。本文还提供了文件布局使用的 B 树数据结构的细节和示例。选择 B 树是为了提高读写盘区
如果给定 inode 号,用 inode 分配映射表,通过以下步骤,可以找到 inode 的物理位置:
1. 找到描述该 inode 的 IAG。需要找到 inode 分配映射表在 B+ 树中的键(字节偏移量)。
iag key = ((Inode number / Inodes per iag) * Inodes per iag) + 4096 (EQ 1)
|
2. 查找已找到的 IAG 中引用的 inode 。这可用于在 IAG 工作映射表和持续映射表中索引。
iag inode index = (Inode number) mod (Inodes per iag) (EQ 2)
|
3. 查找 IAG 中的 inode 盘区描述符,该描述符描述包含指定 inode 的 inode 盘区。
inode extent descriptor = (iag inode index) / (Inode per inode extent) (EQ 3)
|
4. 要找的 inode 位于找到的 inode 盘区内、适当的偏移量处。
inode offset = ((iag inode index) mod (Inodes per inode extent)
* sizeof dinode) (EQ 4)
|
图 11 显示了查找 inode #9157 的例子。inode 分配映射表本身由聚集 inode 表中文件集的分配映射表 inode 描述。
通过前面介绍的公式,将 inode 号,#9157,转换成一个偏移量:
iag key = ((inum / num_inodes_per_iag ) * (num_inodes_per_iag )) + 4096
= ((9157 / 4096) * 4096 ) + 4096
= 12288
iag inode index = inum mod num_inodes_per_iag
= (9157 mod 4096 )
= 965
inode extent descriptor = iag_inode_index / num_inodes_per_extent
= 965 / 32
= 30
inode offset = (iag_inode_index mod num_inodes_per_extent)
* sizeof dinode
= (965 mod 32) * 512
= 5 * 512
= 2560
|
为简化 JFS 维护命令,及便于理解布局策略的动态性,inode 分配映射文件盘区的大小总为 4KB。
当新文件集创建时,必须分配一个 IAG 以及第一个 inode 盘区,以处理文件集的元数据文件。(即,保留的 inode 和根目录 inode )。