Solaris のシステム管理 (デバイスとファイルシステム)

i ノード

i ノードリストは、i ノード 2 から順番に検査されます。(i ノード 0 と i ノード 1 は予約ノード)。各 i ノードの不整合は、次の面から検査されます。

i ノードの形式とタイプ

各 i ノードには、そのタイプと状態を記述するモードのワードが入っています。i ノードには、次の 9 つのタイプがあります。

i ノードの状態は、次の 3 つのうちのいずれかです。

ファイルシステムの作成時、決まった数の i ノードは無効になっています。これらは、必要なときが来るまで割り当てられません。「割り当て済みの i ノード」とは、ファイルを指す i ノードです。「未割り当ての i ノード」は、ファイルを指さないので空のはずです。「部分的に割り当て済み」の状態は、i ノードが正しくフォーマットされていないことを意味します。たとえば、ハードウェア障害が原因で i ノードリストに不正なデータが書き込まれると、i ノードは「部分的に割り当て済み」の状態になることがあります。fsck コマンドが実行できる唯一の修正動作は、その i ノードを消去することです。

リンク数の検査

各 i ノードには、そこにリンクされているディレクトリエントリ数が入っています。fsck コマンドは、ルート (/) ディレクトリから順番にディレクトリ構造全体を検査し、i ノードごとに実際のリンク数を計算して、各 i ノードのリンク数を検証します。

i ノードに格納されているリンク数が fsck コマンドによって判断された実際のリンク数と一致しない場合は、次の 3 つの状況が考えられます。

重複ブロックの検査

各 i ノードには、それが使用するすべてのブロックのリスト、またはリストを指すポインタ (間接ブロック) が入っています。間接ブロックは i ノードによって所有されるので、間接ブロックの整合性が失われると、それを所有する i ノードが直接影響を受けます。

fsck コマンドは、i ノードから使用される各ブロック番号を、割り当て済みブロックのリストと比較します。別の i ノードからすでにブロック番号が使用されていると、そのブロック番号は重複ブロックのリストに入れられます。それ以外の場合は、割り当て済みブロックのリストが更新され、ブロック番号が追加されます。

重複ブロックが見つかると、fsck コマンドは再び i ノードリストを調べて、各重複ブロックを使用するほかの i ノードを検索します。fsck コマンドでは、どの i ノードでエラーが発生しているか、正確に判断することはできません。このため、保持する i ノードと消去する i ノードを選択するように促すプロンプトが表示されます。i ノード内に多数の重複ブロックが入っている場合は、ファイルシステムに書き込まれていない間接ブロックの影響を受けている可能性があります。

不正なブロック番号の検査

fsck コマンドは、i ノードから使用される各ブロック番号を検査して、その値がファイルシステム内の最初のデータブロック番号の値よりも大きく、最後のデータブロック番号の値より小さいかどうかを調べます。ブロック番号がこの範囲に含まれない場合は、不正なブロック番号と見なされます。

間接ブロックがファイルシステムに正しく書き込まれていないことが原因で、i ノード内に不正なブロック番号が発見されることがあります。fsck コマンドはその i ノードの消去を促すプロンプトを表示します。

i ノードサイズの検査

各 i ノードには、参照するデータブロック数が入っています。実際のデータブロック数は、割り当て済みのデータブロック数と間接ブロック数の合計です。fsck コマンドはデータブロック数を計算し、そのブロック数を i ノードから使用されるブロック数と比較します。i ノードに不正なブロック数が入っていると、fsck コマンドはその修正を促すプロンプトを表示します。

各 i ノードには、64 ビットのサイズフィールドがあります。このフィールドは、i ノードに関連付けられたファイル内の文字数 (データバイト数) を示します。i ノードのサイズフィールドに整合性があるかどうかは、サイズフィールド内の文字数を使用して、i ノードに関連付けるべきブロック数を計算し、その結果を i ノードから使用される実際のブロック数と比較して概算で検査されます。