使用 JFS 索引节点

日志文件系统 (JFS) 中的文件在内部表示为索引节点。 JFS 索引节点在磁盘上以静态形式存在并包含文件的访问信息,以及指向文件数据块实际磁盘地址的指针。

文件系统可用的磁盘索引节点数目取决于文件系统的大小、分配组大小(缺省情况下为 8 MB)和每个索引节点比的字节数(缺省情况下为 4096)。 这些参数在文件系统创建时提供给 mkfs 命令。 如果已经创建足够的文件来使用所有可用的索引节点,那么无法创建更多文件,即使文件系统具有可用空间。

要确定可用 i 节点的数量,请使用df -v命令。 磁盘索引节点在 /usr/include/jfs/ino.h 文件中定义。

JFS 的磁盘索引节点结构

JFS 中的每个磁盘索引节点均是 128 字节的结构。 特定索引节点在文件系统索引节点列表内的偏移量生成唯一的号码(索引号),操作系统通过此索引号标识索引节点。 称为索引节点图的位图跟踪文件系统自由磁盘索引节点的可用性。

磁盘索引节点包含下列信息:

字段 内容
i_mode 文件类型和访问许可权方式位
i_size 文件大小(以字节计)
i_uid 用户标识的访问许可权
i_gid 组标识的访问许可权
i_nblocks 分配给文件的块数目
i_mtime 修改文件的最近时间
i_atime 访问文件的最近时间
i_ctime 修改索引节点的最近时间
i_nlink 至文件的硬链接的数目
i_rdaddr [8] 数据的实际磁盘地址
i_r间接 间接块的实际磁盘地址(如果存在的话)

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

磁盘索引节点内的 i_rdaddr 字段包含 8 个磁盘地址。 这些地址指向分配给文件的前 8 个数据块。 I_rindirect 字段地址指向间接块。 间接块是单个间接块或双重间接块。 因此,对于文件存在三种可能的块分配几何方法:直接、间接或双重间接。

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

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

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

JFS 核心内索引节点结构

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

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