FS(5) — UNIX Programmer’s Manual
名称
fs, inode − ファイルシステムボリュームのフォーマット
形式
#include<sys/types.h>
#include<sys/fs.h>
#include<sys/inode.h>
解説
すべてのファイルシステム記憶ボリューム (例えば、ディスクや 9 トラックのテープ)は、 特定の重要な情報についての共通のフォーマットを備えています。 こうしたボリュームのそれぞれは、一定数のブロックに分割されます。 ブロックサイズは、ファイルシステムのパラメータです。BBLOCK から 始まり BBSIZE で示される大きさだけ続いているセクタは、 1次および 2次ブートストラッププログラムを収めるために使用されます。
実際のファイルシステムは、SBSIZE サイズの大きさのスーパーブロック (super block) を備えた SBLOCK セクタから始まります。 インクルードファイル <sys/fs.h> によって定義されているスーパーブロックのレイアウトは次の通りです。
#define FS_MAGIC0x011954
struct fs{
structfs ∗fs_link;/∗ ファイルシステムのリンクされたリスト ∗/
structfs ∗fs_rlink;/∗ コア内のスーパーブロックに使用される ∗/
daddr_tfs_sblkno;/∗ ファイルシステム内のスーパーブロックのアドレス ∗/
daddr_tfs_cblkno;/∗ ファイルシステム内のシリンダブロックのオフセット ∗/
daddr_tfs_iblkno;/∗ ファイルシステム内の iノードブロックのオフセット ∗/
daddr_tfs_dblkno;/∗ シリンダグループの後の最初のデータのオフセット ∗/
long fs_cgoffset;/∗ シリンダ内のシリンダグループオフセット ∗/
long fs_cgmask;/∗ mod fs_ntrak の計算に使用される ∗/
time_tfs_time;/∗ 最後に書き込まれた時間 ∗/
longfs_size;/∗ ファイルシステム内のブロック数 ∗/
longfs_dsize;/∗ ファイルシステム内のデータブロック数 ∗/
longfs_ncg;/∗ シリンダグループの数 ∗/
longfs_bsize;/∗ ファイルシステム内の基本ブロックのサイズ ∗/
longfs_fsize;/∗ ファイルシステム内のフラグブロックのサイズ ∗/
longfs_frag;/∗ ファイルシステム内の 1つのブロック内のフラグ数 ∗/
/∗ これらはコンフィギュレーションパラメータである ∗/
longfs_minfree;/∗ 未使用ブロックの最小限度パーセンテージ ∗/
longfs_rotdelay;/∗ 最適な次のブロックに関するミリセカンド数 ∗/
longfs_rps;/∗ 1秒当りのディスク回転数 ∗/
/∗ これらのフィールドは他のフィールドから算出することができる ∗/
longfs_bmask;/∗ ブロックオフセットの“blkoff”計算値 ∗/
longfs_fmask;/∗ フラグオフセットの“fragoff”計算値 ∗/
longfs_bshift;/∗ 論理ブロック数の“lblkno”計算値 ∗/
longfs_fshift;/∗ フラグの“numfrags”計算値 ∗/
/∗ これらはコンフィギュレーションパラメータである ∗/
longfs_maxconting;/∗ 最大連続ブロック数 ∗/
longfs_maxbpg;/∗ シリンダグループ当りの最大ブロック数 ∗/
/∗ これらのフィールドは他のフィールドから算出することができる ∗/
longfs_fragshift;/∗ フラグシフトに対するブロック ∗/
longfs_fsbtodb;/∗ fsbtodb および dbtofsb シフト定数 ∗/
longfs_sbsize;/∗ スーパーブロックの実際のサイズ ∗/
longfs_csmask;/∗ csum ブロックオフセット ∗/
longfs_csshift;/∗ csum ブロック数 ∗/
longfs_nindir;/∗ NINDIR の値 ∗/
longfs_inopb;/∗ INOPB の値 ∗/
longfs_nspf;/∗ NSPF の値 ∗/
longfs_optim;/∗ 最適化選択、下記参照 ∗/
longfs_sparecon[5];/∗ 将来の定数のために予約されている ∗/
/∗ シリンダグループの数およびそれらの長さによって決定されるサイズ ∗/
daddr_t fs_csaddr;/∗ シリンダグループ要約領域のブロックアドレス ∗/
longfs_cssize;/∗ シリンダグループ要約領域のサイズ ∗/
longfs_cgsize;/∗ シリンダグループサイズ ∗/
/∗ これらのフィールドはハードウェアから導き出されなければならない ∗/
longfs_ntrak;/∗ シリンダ当りのトラック数 ∗/
long fs_nsect;/∗ トラック当りのセクタ数 ∗/
longfs_spc;/∗ シリンダ当りのセクタ数 ∗/
/∗ これはディスクドライブの区分から算出される ∗/
long fs_ncyl;/∗ ファイルシステム内のシリンダ数 ∗/
/∗ これらのフィールドは他のフィールドから算出される ∗/
long fs_cpg;/∗ グループ当りのシリンダ数 ∗/
longfs_ipg;/∗ グループ当りの i ノード数 ∗/
longfs_fpg;/∗ グループ ∗ fs_frag 当りのブロック数 ∗/
/∗ このデータはクラッシュ後に再計算されなければならない ∗/
structcsum ∗fs_cstotal;/∗ シリンダ要約情報 ∗/
/∗ これらのフィールドはマウント時にクリアされる ∗/
charfs_fmod;/∗ スーパーブロックがフラグを修正した ∗/
charfs_clean;/∗ ファイルシステムのフラグは未定義の状態である ∗/
charfs_ronly;/∗ 読み取り専用フラグがマウントされた ∗/
charfs_flags;/∗ 現在未使用のフラグ ∗/
charfs_fsmnt[MAXMNTLEN];/∗ マウントされた名称 ∗/
/∗ これらのフィールドは現在のブロック割り当て情報を保持する ∗/
longfs_cgrotor;/∗ 最後に検索された cg(シリンダグループ) ∗/
structcsum ∗fs_csp[MAXCSBUFS];/∗ バッファに入れられる fs_cs のリスト ∗/
longfs_cpc;/∗ postbl(ポストブロック)内のサイクル当りの cyl(シリンダ数) ∗/
shortfs_postbl[MAXCPG][NRPOS];/∗ 各回転に関するブロックの先頭 ∗/
longfs_magic;/∗ マジック番号 ∗/
u_charfs_rotbl[1];/∗ 各回転に関するブロックのリスト ∗/
/∗ 実際にはもっと長くなる ∗/
};
それぞれのディスクドライブにはいくつかのファイルシステムが含まれています。 ファイルシステムは、いくつかのシリンダグループから構成されます。 それぞれのシリンダグループは複数の iノードおよびデータを備えています。 ファイルシステムは、そのスーパーブロックによって示され、 そのスーパーブロックはシリンダグループを示します。 スーパーブロックは重要なデータであるため、 復旧不能な障害に備えてそれぞれのシリンダグループ内で複製されています。 この複製作業はファイルシステムの作成時に行われ、 重要なスーパーブロックデータは変化しないため、 災害に見舞われない限り、複製ファイルの参照を行う必要はありません。 iノードに格納されるアドレスは、‘blocks’ のフラグメントの位置を アドレスで指定することができます。 せいぜい MAXBSIZE 以内のサイズであるファイルシステムブロックは、 個々にアドレス可能な 2 あるいは、4、8個の部分に分割することができます。 これらの部分は、DEV_BSIZE で示される値、 あるいは DEV_BSIZE で示される値をとります。 大きなファイルは、大きなデータブロックだけから構成されます。 ディスク空間を必要以上に消費することを避けるために、 小さなファイルの最後のデータブロックには、 大きなブロックのフラグメントが必要な分だけ割り当てられます。 ファイルシステムフォーマットは、 大きなブロックの分割された部分であるこうしたフラグメントに対して 1つのポインタだけしか保持しません。 こうしたフラグメントのサイズは、 “blksize(fs, ip, lbn)”マクロを使用してその i ノード内の情報から 判断することができます。 ファイルシステムは、フラグメントレベルでの space avalability (空間の利用可能度)を記録します。 block avalability(ブロックの利用可能度)を決定するために、 整列(align)されたフラグメントが調べられます。 ルート iノードはファイルシステムのルートです。 iノード 0 は、通常の目的に使用することはできず、 履歴的に不良なブロックはノード 1 にリンクされます。 従って、ルート iノードは 2 になります (iノード 1 はもはやこうした用途には使用されていませんが、 数多くのダンプテープがこうした仮定を行っているため、 この仮定は、守った方がよいです)。 lost+found ディレクトリが mkfs によって最初に作成される時に、このディレクトリには利用可能な 次の iノードが提供されます。 fs_minfree フィールドは、空き状態にすることができるファイルシステムブロックの最小 許容パーセンテージを与えます。 空きブロックのリストがこのレベルを下回った場合には、 スーパーユーザ以外はブロックの割り当てを続けることができません。 空きブロックの予約が必要とみなされる場合には、 このフィールドは 0 に設定されます。 ただし、ファイルシステムが 90% よりも高い状態で走行する場合には、 深刻な性能劣化が発生します。このため、 fs_minfree のデフォルト値は 10% です。 経験的に言って、90% のローディングにおいてブロック分割と 全体的なディスク利用率との間の最良の釣合がとれるのは、 ブロックを 4分割した場合です。 このため、デフォルト分割サイズはブロックサイズの 4分の1 になります。 fs_optim は、ファイルシステムがブロックの割り当てにかける時間を 最少限に抑えようとするか、 ディスク上の未使用の断片を最少限に抑えようとするかを指定します。 (上記の)fs_minfree の値が 10% 未満である場合には、ブロックサイズを すべて使い果たしてしまうことを防ぐために、 ファイルシステムは空間の最適化を行いません。 minfree の値が 10% 以上である場合には、 分割化によって問題が発生することが予想されるため、 ファイルシステムは時間の最適化を行いません。 シリンダグループに関連したリミット:それぞれのシリンダは、 異なる回転位置におけるブロックの利用可能な割合に対しての情報を常に 持っているため、 シーケンシャルブロックは最少の回転待ち時間で取り出すことができます。 NRPOS は、区別される回転位置の数です。 一般的な 3600 rpm ドライブについては、 NRPOS が 8である場合、要約情報の分解能は 2ms になります。 fs_rotdelay は、同じシリンダ上において別のディスク転送を開始できるまでの 最小時間(ミリセカンド単位)を与えます。 この情報は、ファイル内のディスクブロックに関する回転の最適な レイアウトを決定する際に使用されます。 fs_rotdelay のデフォルト値は 2ms です。 それぞれのファイルシステムは、静的に割り当てられた一定数の iノードを 備えています。ディスク空間のそれぞれの NBPI バイトごとに、 iノードが 1つずつ割り当てられます。 iノードの割り当て方法は、極めて普通のものです。 MAXIPG は、シリンダグループ当りの iノード数を制限するものであり、 これが必要とされるのは、変数サイズ要素を 1つだけ(フリービット マップ)にすることによって、たんに構造体を簡略化するためです。 注意 : MAXIPG は、INOPB(fs)の倍数でなければなりません。 MINBSIZE(最小ブロックサイズ)は、最小許容ブロックサイズです。 最小ブロックサイズを 4096 にした場合には、 2回の間接参照で 2の32乗の大きさのファイルを作成することができます。 最小ブロックサイズは、 1つのシリンダグループブロックを十分に収められる大きさでなければ なりません。従って、シリンダグループ構造体(struct cg)に対する 変更を行う場合には、 ブロックのサイズを最小ブロックサイズの範囲内にとどめる必要があります。 MAXCPG は、シリンダグループ構造体(struct cg)内の配列を必要な大きさにする 場合にだけ使用されます。 配列のサイズは、その構造体のサイズが最小ブロックサイズによって 示される範囲を超えない限りいくらでも大きくすることができます。 スーパーブロックのサイズは、SBSIZE を超えてはいけません。 マウントされているファイルシステムへのパス名は fs_fsmnt 内に収められます。MAXMNTLEN は、このパス名のためにスーパーブロック 内に割り当てられる空間の量を定義します。 ファイルシステム当りの要約情報の量に関する限度は、 MAXCSBUFS によって定義されています。 これは、現在、最大 2百万個のシリンダ数に対応するようにパラメータ化されています。
シリンダグループごとの情報は、最初のシリンダグループのデータブロックから、 割り当てブロック内に要約されます。 これらのブロックは、スーパーブロックの他に、 fs_csaddr (fs_cssizeサイズ)から読み込まれます。 注意 : “fs_cs”マクロを機能させるためには、sizeof(struct csum)は 2の累乗でなければなりません。 ファイルシステムのスーパーブロック:MAXBPC は、 回転レイアウトテーブルのサイズを制限するものであり、 これは、スーパーブロックのサイズが SBSIZE(スーパーブロックサイズ)で あるという事実によって制約を受けます。 これらのテーブルのサイズは、ファイルシステムのブロックサイズに反比例します。 セクタのサイズが 2の累乗でない場合には、 こうしたテーブルのサイズが増やされ、これによって、 1つの回転パターン(fs_cpc)内に含まれるシリンダ数が増加します。 回転レイアウトテーブルのサイズは、 ファイルシステム構造体(struct fs)内に残っているバイト数から算出されます。 MAXBPG は、シリンダグループ当りのブロック数を制限するものであり、 これは、シリンダグループが最大でも 1ブロックであるという事実に よって制約を受けます。 フリーブロックテーブルのサイズは、シリンダグループ構造体(struct cg)内の ブロックサイズおよび残りのバイト数から算出されます。 iノード:iノードは、UNIX ファイルシステム内のすべてのファイル動作 の中心です。 各アクティブファイル、各カレントディレクトリ、各マウントファイル、 テキストファイル、ルートには、ユニークな iノードが割り当てられます。 iノードは、そのデバイスと i番号のペアによって名前が付けられます。 詳細については、インクルードファイル <sys/inode.h> を参照してください。
NEWS-OSRelease 3.3