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 ノードのディスク上の位置とその可用性をトラッキングします。
フィールド | 内容 |
---|---|
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 ノードを識別するために使用される i ノード番号
- 参照カウント。 参照カウント・フィールドが 0 の場合、 メモリー内の i ノードが解放されます。
メモリー内の i ノードが (例えば close サブルーチンによって) 解放されると、メモリー内のこの i ノードの参照カウントは 1 減らされます。 この削減の結果として、メモリー内のこの i ノードに対する参照カウントが 0 になった場合、 この i ノードはメモリー内の i ノード・テーブルから解放され、 メモリー内のこの i ノードの内容が i ノードのディスク・コピーに書き出されます (2 つのバージョンが異なる場合)。