JFS i ノードの処理

ジャーナル・ファイルシステム (JFS) 内のファイルは、 内部で索引ノード (i ノード) として表されます。 JFS の i ノードは、 ディスク上で静的形式で存在し、ファイルに関するアクセス情報、 およびファイルのデータ・ブロックの実ディスク・アドレスを指すポインターを持っています。

ファイルシステムに使用可能なディスク i ノードの数は、ファイルシステムのサイズ、 割り当てグループ・サイズ (デフォルトで 8 MB)、 および i ノード当たりのバイト数 (デフォルトで 4096) によって異なります。 これらのパラメーターは、ファイルシステムの作成時に mkfs コマンドで指定します。 使用可能なすべての i ノードを使用するために十分なファイルが作成済みであれば、 ファイルシステムにフリー・スペースがある場合でも、これ以上のファイルを作成することはできません。

使用可能な i ノードの数を判別するには、df -v コマンドを使用してください。 ディスク i ノードは、 /usr/include/jfs/ino.h ファイルに定義されます。

JFS 用のディスク i ノードの構造体

JFS におけるディスク i ノードは、それぞれ 128 バイトの構造体です。 ファイルシステムの i ノード・リスト内の特定の i ノードのオフセットによって、 オペレーティング・システムが i ノードを識別するための固有の番号 (i ノード番号) が生成されます。 i ノード・マップ と呼ばれるビットマップは、 ファイルシステムに使用可能なフリー・ディスク i ノードをトラッキングします。

ディスク i ノードには以下の情報が組み込まれます。

フィールド 内容
i_mode ファイルのタイプおよびアクセス権モード・ビット
i_size バイト単位のファイルのサイズ
i_uid ユーザー ID のアクセス権
i_gid グループ ID のアクセス権
i_nblocks ファイルに割り当てるブロック数
i_mtime ファイルが最後に変更された時刻
i_atime ファイルが最後にアクセスされた時刻
i_ctime i ノードが最後に変更された時刻
i_nlink ファイルへのハード・リンクの数
i_rdaddr[8] データの実ディスク・アドレス
i_rindirect もしあれば、間接ブロックの実ディスク・アドレス

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

ディスク i ノード内の i_rdaddr フィールドには、 8 つのディスク・アドレスが入っています。 これらのアドレスは、 ファイルに割り当てられた最初の 8 つのデータ・ブロックを指します。 i_rindirect フィールドのアドレスは、 間接ブロックを指します。 間接ブロックは単一間接ブロックまたは二重間接ブロックのいずれかです。 したがって、ファイルのブロック割り当てには、直接、間接、 または二重間接という 3 つの方法があります。

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

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

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

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

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

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