JFS2 i ノードの処理

JFS2 内のファイルは、内部で索引ノード (i ノード) として表されます。

JFS2 のディスク i ノードは、ディスク上に静的形式で存在し、ファイルに関するアクセス情報、 およびファイルのデータ・ブロックの実ディスク・アドレスを指すポインターを持っています。 i ノードは JFS2 によって動的に割り当てられます。 ディスク i ノードは、 /usr/include/j2/j2_dinode.h ファイルに定義されます。

ファイルのオープン時に、メモリー内の i ノードがオペレーティング・システムによって作成されます。 メモリー内の i ノードには、ディスク i ノードに定義されているすべてのフィールドのコピー、 およびメモリー内の i ノードをトラッキングするための追加フィールドが入っています。 メモリー内の i ノードは、 /usr/include/j2/j2_inode.h ファイルに定義されます。

JFS2 のディスク i ノード構造

JFS2 におけるディスク i ノードは、それぞれ 512 バイトの構造体です。 ファイルシステムの特定の i ノード割り当てマップの索引によって、オペレーティング・システムが i ノードを識別するための固有の番号 (i ノード番号) が生成されます。 i ノード割り当てマップは、i ノードのディスク上の位置とその可用性をトラッキングします。

ディスク i ノードには以下の情報が組み込まれます。
フィールド 内容
di_mode ファイルのタイプおよびアクセス権モード・ビット
di_size バイト単位のファイルのサイズ
di_uid ユーザー ID のアクセス権
di_gid グループ ID のアクセス権
di_nblocks ファイルに割り当てるブロック数
di_mtime ファイルが最後に変更された時刻
di_atime ファイルが最後にアクセスされた時刻
di_ctime i ノードが最後に変更された時刻
di_nlink ファイルへのハード・リンクの数
di_btroot データのディスク・アドレスを示す B+ ツリーのルート

i ノードを変更しないで、ファイルのデータを変更することはできませんが、ファイルの内容を変更しないで、i ノードを変更することは可能です。 例えば、アクセス権を変更した場合、i ノード内の情報 (di_mode) は変更されますが、ファイル内のデータは同じままです。

di_btroot は B+ ツリーのルートについて記述します。 これは i ノードに関するデータを記述します。 di_btroot には、i ノード内の使用中のエントリー数を示すフィールドと、B+ ツリーのリーフ・ノードであるか、または内部ノードであるかを示すフィールドがあります。

ディスク i ノードには、ファイルまたはパス名の情報は入っていません。 ディレクトリー・エントリーは、 ファイル名を i ノードにリンクするために使用されます。 link または symlink サブルーチンを使用して追加のディレクトリー・エントリーを作成することにより、任意の i ノードを多数のファイル名にリンクできます。 ファイルに割り当てられた i ノード番号を判別するには、ls-i コマンドを使用してください。

デバイスを定義するファイルを表す i ノードは、 通常のファイルの i ノードとは少し異なる情報を収めています。 デバイスに関連したファイルはスペシャル・ファイル と呼びます。 スペシャル・デバイス・ファイルにはデータ・ブロック・アドレスはありませんが、 di_rdev フィールドにメジャー・デバイス番号とマイナー・デバイス番号が組み込まれています。

ディスク i ノードは、この i ノードに対するリンク・カウント (di_nlink) が 0 の場合に解放されます。 各リンクは、この i ノードに関連するファイル名を表します。 ディスク i ノードに対するリンク・カウントが 0 の場合、 この i ノードに関連するすべてのデータ・ブロックが、ファイル・システムのフリー・データ・ブロックの ビットマップに解放されます。次に、この i ノードはフリー i ノード・マップに置かれます。

JFS2 のメモリー内の i ノード構造体

ファイルをオープンすると、アクセスを容易にするために、 ディスク i ノード内の情報がメモリー内の i ノードにコピーされます。 メモリー内の i ノード構造体には、 ディスク i ノードの有用なデータへのアクセスを管理する追加のフィールドが入っています。 メモリー内の i ノードの各フィールドは、 j2_inode.h ファイルに定義されています。 メモリー内の i ノードによってトラッキングされる追加情報の一部は、次のとおりです。
  • 以下のものについて示すフラグを含む、 メモリー内の i ノードの状況
    • i ノード・ロック
    • i ノードがアンロックするのを待つプロセス
    • ファイルの i ノード情報に対する変更
    • ファイルのデータに対する変更
  • ファイルが入っているファイルシステムの論理デバイス番号
  • i ノードを識別するために使用される i ノード番号
  • 参照カウント。 参照カウント・フィールドが 0 の場合、 メモリー内の i ノードが解放されます。

メモリー内の i ノードが (例えば close サブルーチンによって) 解放されると、メモリー内のこの i ノードの参照カウントは 1 減らされます。 この削減の結果として、メモリー内のこの i ノードに対する参照カウントが 0 になった場合、 この i ノードはメモリー内の i ノード・テーブルから解放され、 メモリー内のこの i ノードの内容が i ノードのディスク・コピーに書き出されます (2 つのバージョンが異なる場合)。