使用 JFS2 索引节点

JFS2 中的文件在内部表示为索引节点。

JFS2 磁盘索引节点在磁盘上以静态形式存在并包含文件的访问信息,以及指向文件数据块实际磁盘地址的指针。 索引节点由 JFS2 动态分配。 磁盘索引节点在/usr/include/j2/j2_dinode.h 文件中定义。

打开文件时,操作系统创建一个核心内索引节点。 核心内索引节点包含磁盘索引节点中定义的所有字段的副本,以及用于追踪核心内索引节点的附加字段。 核心内索引节点在 /usr/include/j2/j2_inode.h 文件中定义。

JFS2 的磁盘索引节点结构

JFS2 中的每个磁盘索引节点均是 512 字节的结构。 文件系统特定索引节点分配图的索引生成唯一的号码(索引号),操作系统通过此索引号标识索引节点。 索引节点分配图追踪索引节点在磁盘上的位置以及它们的可用性。

磁盘索引节点包含下列信息:
字段 内容
di_mode 文件类型和访问许可权方式位
di_size 文件大小(以字节计)
di_uid 用户标识的访问许可权
di_gid 组标识的访问许可权
di_nblocks 分配给文件的块数目
di_mtime 修改文件的最近时间
di_atime 访问文件的最近时间
di_ctime 修改索引节点的最近时间
di_nlink 至文件的硬链接的数目
di_btroot 描述数据磁盘地址的 B+ 树的根

不能只更改文件数据而不更改索引节点,但是可以更改索引节点而不更改文件的内容。 例如,在更改许可权时,索引节点 (di_mode) 内的信息被修改,但是文件中的数据保持不变。

Di_btroot 描述 B+ 树的根。 它描述索引节点的数据。 Di_btroot 有一个字段指示使用了索引节点中其多少条目以及另一个字段描述它们是 B+ 树的叶节点还是内部节点。

磁盘索引节点不包含文件或路径名信息。 目录条目用于将文件名链接到索引节点。 任何索引节点都可以通过使用 linksymlink 子例程创建其他目录条目来链接到许多文件名。 要确定分配给文件的 i 节点编号,请使用ls -i命令。

代表定义设备的文件的索引节点包含的信息与常规文件的索引节点稍有不同。 与设备关联的文件被称为特殊文件。 在特殊设备文件中没有任何数据块地址,但是主设备号和次设备号被包含在 di_rdev 字段中。

当到索引节点的链接计数 (di_nlink) 等于 0 时,将释放磁盘索引节点。 链接表示与索引节点关联的文件名。 磁盘索引节点的链接计数为 0 时,与索引节点关联的所有数据块被释放到文件系统空白数据块的位图。 然后,索引节点被置于空白的索引节点图上。

JFS2 核心内索引节点结构

打开文件时,磁盘索引节点中的信息被复制到核心内索引节点中,以方便访问。 核心内索引节点结构包含附加的字段,该字段管理对磁盘索引节点有价值数据的访问。 核心内索引节点的字段在 j2_inode.h 文件中定义。 由核心内索引节点追踪的一些附加信息如下:
  • 核心内索引节点的状态,包括指示下列内容的标记:
    • 索引节点锁定
    • 等待索引节点解锁的进程
    • 对文件索引节点信息的更改
    • 对文件数据的更改
  • 包含文件的文件系统的逻辑设备号
  • 用于标识索引节点的索引号
  • 引用计数。 引用计数字段等于零时,核心内索引节点被释放。

当释放核心索引节点时 (例如,使用 close 子例程) ,核心索引节点引用计数将减少 1。 如果此缩减导致对核心内索引节点的引用计数变为 0 ,那么会从核心内索引节点表中释放该索引节点,并且会将核心内索引节点的内容写入该索引节点的磁盘副本 (如果两个版本不同)。