FS(5) FreeBSD ファイルフォーマットマニュアル FS(5)
名称
fs, inode − ファイルシステムボリュームのフォーマット |
書式
#include <sys/param.h> #include <sys/types.h> |
解説
ファイル <fs.h> と <inode.h> は、ランダムアクセスデバイス (ディスク) 上の ファイルシステムオブジェクトの基本フォーマットを作成、管理する際に使われ るいくつかの構造体、定義済み変数、マクロを宣言します。 ファイルシステムはブロックサイズとブロック数から構成されており、これらは ファイルシステムのパラメータになります。 BBLOCK から始まり大きさ BBSIZE だけ続くセクタは、ディスクラベルといくつかの一次、二次ハードウェアブート ストラッププログラムのために使われます。 実際のファイルシステムは、 SBLOCK セクタから始まり、そこには大きさが SBLOCKSIZE である スーパブロックがあります。ファイル <ufs/ffs/fs.h> にあ る以下の構造体は、スーパブロックを記述しています。 /* * FFS ファイルシステムのスーパブロック */ struct fs { |
int32_t |
fs_firstfield; |
/* 内部スーパブロック用に使われる、歴史的 */ |
|||
int32_t |
fs_unused_1; /* FS リンクリスト */ |
||||
int32_t |
fs_sblkno; /* fs 内スーパブロックオフセット */ |
||||
int32_t |
fs_cblkno; /* fs 内シリンダブロックオフセット */ |
||||
int32_t |
fs_iblkno; /* fs 内 inode ブロックオフセット */ |
||||
int32_t |
fs_dblkno; /* cg 後の最初のデータのオフセット */ |
||||
int32_t |
fs_old_cgoffset; /* シリンダ内のシリンダグループオフセット */ |
||||
int32_t |
fs_old_cgmask; /* mod fs_ntrak の計算に使われる */ |
||||
int32_t fs_old_time; /* 最後に書き込まれた時刻 */ |
|||||
int32_t |
fs_old_size; /* fs 内のブロック数 */ |
||||
int32_t |
fs_old_dsize; /* fs 内のデータブロック数 */ |
||||
int32_t |
fs_ncg; /* シリンダグループの数 */ |
||||
int32_t |
fs_bsize; /* fs 内の基本ブロックサイズ */ |
||||
int32_t |
fs_fsize; /* fs 内のフラグメントブロックサイズ */ |
||||
int32_t |
fs_frag; /* fs の 1 ブロック中のフラグメント数 */ |
/* 以下はコンフィギュレーションパラメータ */ |
int32_t |
fs_minfree; /* フリーブロックの最小パーセンテージ */ |
||
int32_t |
fs_old_rotdelay; /* 最適な次ブロックのための ms 数 */ |
||
int32_t |
fs_old_rps; /* 1 秒あたりのディスク回転 */ |
/* これらのフィールドは他のフィールドから計算できる */ |
int32_t |
fs_bmask; /* ‘‘blkoff’’ ブロックオフセットの計算 */ |
||
int32_t |
fs_fmask; /* ‘‘fragoff’’ フラグメントオフセットの計算 */ |
||
int32_t |
fs_bshift; /* ‘‘lblkno’’ 論理ブロック番号の計算 */ |
||
int32_t |
fs_fshift; /* ‘‘numfrags’’ フラグメント数の計算 */ |
/* 以下はコンフィギュレーションパラメータ */ |
int32_t |
fs_maxcontig; /* 連続したブロックの最大数 */ |
||
int32_t |
fs_maxbpg; /* シリンダグループあたりの最大ブロック数 */ |
/* これらのフィールドは他のフィールドから計算できる */ |
int32_t |
fs_fragshift; /* フラグメントシフトするブロック */ |
||
int32_t |
fs_fsbtodb; /* fsbtodb と dbtofsb シフト定数 */ |
||
int32_t |
fs_sbsize; /* スーパブロックの実際の大きさ */ |
||
int32_t |
fs_spare1[2]; /* 古い fs_csmask */ |
||
/* 古い fs_csshift */ |
|||
int32_t |
fs_nindir; /* NINDIR の値 */ |
||
int32_t |
fs_inopb; /* INOPB の値 */ |
||
int32_t |
fs_old_nspf; /* NSPF の値*/ |
/* 別のコンフィギュレーションパラメータ */ |
int32_t |
fs_optim; /* 最適化の選択、以下を参照 */ |
||
int32_t |
fs_old_npsect; /* 予備を含む、トラックあたりセクタ数 */ |
||
int32_t |
fs_old_interleave; /* ハードウェアセクタインタリーブ */ |
||
int32_t |
fs_old_trackskew; /* トラックあたりのセクタ 0 スキュー */ |
||
int32_t |
fs_id[2]; /* ユニークなファイルシステム ID */ |
/* シリンダグループの数とサイズにより決められるサイズ */ |
int32_t |
fs_old_csaddr; |
/* シリンダグループ総括領域のブロックアドレス */ |
|||
int32_t |
fs_cssize; /* シリンダグループ総括領域のサイズ */ |
||||
int32_t |
fs_cgsize; /* シリンダグループサイズ */ |
||||
int32_t |
fs_spare2; /* 古い fs_ntrak */ |
||||
int32_t |
fs_old_nsect; /* トラックあたりのセクタ数 */ |
||||
int32_t fs_old_spc; /* シリンダあたりのセクタ数 */ |
|||||
int32_t |
fs_old_ncyl; /* ファイルシステムのシリンダ数 */ |
||||
int32_t |
fs_old_cpg; /* グループあたりのシリンダ数 */ |
||||
int32_t |
fs_ipg; /* グループあたりの inode 数 */ |
||||
int32_t |
fs_fpg; /* グループあたりのブロック数 * fs_frag */ |
/* このデータはクラッシュ後に再計算されなければならない */ |
struct |
csum fs_old_cstotal; /* シリンダ総括情報 */ |
/* 以下のフィールドはマウント時にクリアされる */ |
int8_t fs_fmod; /* スーパブロック変更フラグ */ |
||||
int8_t fs_clean; /* ファイルシステムがクリーンであるフラグ */ |
||||
int8_t |
fs_ronly; /* 読み込み専用でマウントされたフラグ */ |
|||
int8_t fs_old_flags; /* 古い FS_ フラグ */ |
||||
u_char |
fs_fsmnt[MAXMNTLEN]; /* マウント場所の名前 */ |
|||
u_char |
fs_volname[MAXVOLLEN]; /* ボリューム名 */ |
|||
u_int64_t fs_swuid; /* システムワイドの UID */ |
||||
int32_t fs_pad; /* fs_swuid のアラインメント用 */ |
/* これらのフィールドは現在のブロックの配置情報を保持する */ |
int32_t |
fs_cgrotor; /* 最後に検索された cg */ |
||
void |
*fs_ocsp[NOCSPTRS]; /* パッド。fs_cs バッファのリストだった */ |
||
u_int8_t *fs_contigdirs; /* 連続割り当てされた dir 数 */ |
|||
struct |
csum *fs_csp; /* fs_cs 情報バッファのリスト */ |
||
int32_t |
*fs_maxcluster; /* 各シリンダグループの最大クラスタ */ |
||
u_int |
*fs_active; /* fs トラック用に、スナップショットが使用 */ |
||
int32_t |
fs_old_cpc; /* postbl 内のサイクルあたりのシリンダ */ |
||
int32_t |
fs_maxbsize; /* 最大のブロック化係数 */ |
||
int64_t |
fs_sparecon64[17]; /* 古いローテーションブロックリストヘッド */ |
||
int64_t |
fs_sblockloc; /* 標準のスーパブロックのバイトオフセット */ |
||
struct |
csum_total fs_cstotal; /* シリンダ総括情報 */ |
||
ufs_time_t fs_time; /* 最後に書き込まれた時刻 */ |
|||
int64_t |
fs_size; /* fs 中のブロック数 */ |
||
int64_t |
fs_dsize; /* fs 中のデータブロック数 */ |
||
ufs2_daddr_t fs_csaddr; /* シリンダグループ総括情報領域のブロックアドレス */ |
|||
int64_t |
fs_pendingblocks; /* 現在開放途中のブロック数 */ |
||
int32_t |
fs_pendinginodes; /* 現在開放途中の inode 数 */ |
||
int32_t |
fs_snapinum[FSMAXSNAP]; /* スナップショット inode 数のリスト */ |
||
int32_t |
fs_avgfilesize; /* ファイルサイズの平均の期待値 */ |
||
int32_t |
fs_avgfpdir; /* ディレクトリあたりのファイル数の期待値 */ |
||
int32_t |
fs_save_cgsize; /* 実 cg サイズを保存し、fs_bsize を使用 */ |
||
int32_t |
fs_sparecon32[26]; /* 将来の定数のための予約 */ |
||
int32_t fs_flags; /* 後述の FS_ フラグ参照 */ |
|||
int32_t |
fs_contigsumsize; /* クラスタ総括配列の大きさ */ |
||
int32_t |
fs_maxsymlinklen; /* 内部シンボリックリンクの最大長 */ |
||
int32_t |
fs_old_inodefmt; /* ディスク上の inode のフォーマット */ |
||
u_int64_t fs_maxfilesize; /* 最大表示可能ファイルサイズ */ |
|||
int64_t |
fs_qbmask; /* ~fs_bmask - 64 ビットサイズで使う */ |
||
int64_t |
fs_qfmask; /* ~fs_fmask - 64 ビットサイズで使う */ |
||
int32_t |
fs_state; /* fs_clean フィールドが有効であることを示す */ |
||
int32_t |
fs_old_postblformat; /* 位置レイアウトテーブルのフォーマット */ |
||
int32_t |
fs_old_nrpos; /* 回転位置の数 */ |
||
int32_t |
fs_spare5[2]; /* 古い fs_postbloff */ |
||
/* 古い fs_rotbloff */ |
|||
int32_t |
fs_magic; /* マジックナンバ */ |
}; /* |
#define |
FS_UFS1_MAGIC |
0x011954 /* UFS1 ファストファイルシステムのマジックナンバ */ |
|||
#define |
FS_UFS2_MAGIC |
0x19540119 /* UFS2 ファストファイルシステムのマジックナンバ */ |
|||
#define |
FS_OKAY |
0x7c269d38 /* スーパブロックチェックサム */ |
|||
#define FS_42INODEFMT |
-1 /* 4.2BSD inode フォーマット */ |
||||
#define FS_44INODEFMT |
2 /* 4.4BSD inode フォーマット */ |
/* |
#define FS_OPTTIME |
0 |
/* 最小アロケーション時間 */ |
|||
#define FS_OPTSPACE |
1 |
/* 最小ディスクフラグメンテーション */ |
各ディスクドライブはいくつかのファイルシステムを含んでいます。 1 つのファ イルシステムは、いくつかのシリンダグループから成ります。各シリンダグルー プには inode とデータがあります。 ファイルシステムは、シリンダグループを順番に記述するスーパブロックによっ て記述されています。スーパブロックは重要なデータであり、壊滅的な損失から 守るために各シリンダグループに複製されています。これはファイルシステム作 成時に行なわれ、重要なスーパブロックデータは変更されないので、特に惨事が ふりかからなければ、複製が参照される必要はありません。 inode に保存されたアドレスによって、‘ブロック’ のフラグメントの位置を決め ることができます。ファイルシステムブロックのほとんどは MAXBSIZE です が、2, 4, 8 個に分けることが自由にでき、それぞれを位置指定できます。これ らの断片は DEV_BSIZE または DEV_BSIZE 単位の倍数であれば良いのです。 大きなファイルは、非常に大きなデータブロックからなります。ディスクスペー スの過度の浪費を避けるために、小さなファイルの最後のデータブロックは、大 きなブロックのフラグメントが必要な数だけ配置されます。ファイルシステム フォーマットは、そのようなフラグメント (大きなブロックを分割した一片) の 1 つへのポインタだけを保持します。そのようなフラグメントの大きさは、 inode にある情報から決定することができ、 blksize(fs, ip, lbn) マクロが 使っています。 ファイルシステムは、提供可能な空きをフラグメントレベルで記録します。つま り、ブロックの空きを決定するために、フラグメントを並べて調べます。 root inode は、ファイルシステムのおおもとです。 inode 0 は、通常の目的で は使われず、歴史的にバッドブロックは inode 1 にリンクされます。したがって root inode は、2 です (inode 1 は、もはやこの目的では使われませんが、多く のダンプテープがこの仮定をしているので、それについては変更できません)。 fs_minfree 要素は、空いているファイルシステムブロックの最低許容割合を与え ます。空きリストがこのレベル以下になった場合、スーパユーザだけがブロック の確保を続けることができます。 fs_minfree 要素は、空きブロックの予備が必 要ないと思われたら 0 にセットしてもかまいませんが、ファイルシステムが 90% 以上詰まった状態で動いているときには、かなり性能が低下するでしょう。その ためデフォルトの fs_minfree の値は 10% になっています。 経験上、ブロックフラグメンテーションと 90% 使用中のディスク全体の利用の兼 ね合いが最も良いのは、フラグメンテーション 8 のときです。そのためデフォル トのフラグメントサイズはブロックサイズの 8 倍になっています。 要素 fs_optim はファイルシステムがブロックを確保するのに要する時間を最小 にしようとするか、それともディスク上の領域のフラグメンテーションを最小に しようとするかを指定します。 fs_minfree (上記参照) の値が 10% より小さい 場合は、ファイルシステムは空間の最適化をデフォルトとし、完全な大きさのブ ロックがなくならないようにします。 minfree の値が 10% と等しいかそれ以上 の場合には、フラグメンテーションが問題とはなりにくく、ファイルシステムは 時間の最適化をデフォルトにします。 シリンダグループに関連した制限: 連続したブロックを最小の回転遅れで配置す ることができるよう、各シリンダは異なる回転位置での利用可能なブロック数を 保持し続けます。デフォルトでは回転位置を 8 分割で表し、このときの総括情報 の分解能は典型的な 3600 rpm のドライブで 2ms になります。 要素 fs_old_rotdelay は、同一シリンダ上で別のディスク転送を開始する最小ミ リ秒数を与えます。これは、あるファイル中のディスクブロックの周回の中での 最適な配置を決定するのに使われます。デフォルトの fs_old_rotdelay の値は 2ms です。 各ファイルシステムは、静的に割り当てられた数の inode を持っています。 inode は、ディスク空間あたり NBPI バイト確保されます。 inode を配置する戦 略は、極端に保守的です。 MINBSIZE が許される最小のブロックサイズです。 MINBSIZE が 4096 では、2 段 までの(ブロック)間接参照を使って 2^32 の大きさのファイルを作ることができ ます。 MINBSIZE は、シリンダグループブロックを保持するのに十分な大きさで なければなりません。したがって (構造体 cg) への変更は大きさを MINBSIZE 以 内にしておかなければなりません。スーパブロックは決して SBLOCKSIZE の大き さ以上ではないということに注意して下さい。 ファイルシステムがマウントされているパス名は、 fs_fsmnt に保持されます。 MAXMNTLEN は、この名前のためにスーパブロックに割り当てられた領域の量を定 義します。ファイルシステム毎の総括情報の量の上限は、 MAXCSBUFS により定義 されています。 4096 バイトブロックサイズの場合では、これは現在最大 200 万 シリンダ分用意されています。 それぞれのシリンダグループ情報は、先頭のシリンダグループデータブロックか ら確保されたブロックに要約されます。これらのブロックはスーパブロックに加 えて fs_csaddr ( fs_cssize の大きさ) から読み込まれます。 注意: sizeof(struct csum) は fs_cs() マクロを動かすために 2 のべき乗でな ければなりません。 ファイルシステムのスーパブロック: 周回レイアウトテーブルの大きさは、スー パブロックが SBLOCKSIZE の大きさを持つことにより制限されています。これら のテーブルの大きさは、ファイルシステムのブロックサイズに 逆比例します。セ クタサイズが 2 のべき乗でないときには、周回パターンを (fs_cpc) だけ繰り返 すまでに含まれるシリンダ数が増加するので、同様にテーブルの大きさも増加し ます。周回レイアウトテーブルの大きさは、 (struct fs) に残っているバイト数 から割り出されます。 シリンダグループあたりのデータブロック数は、シリンダグループがたかだか 1 ブロックであるので、制限されています。 inode と空きブロックテーブルは、単 一ブロックからシリンダグループ構造体 (struct cg) のための領域を除いた残り にぴったり合っていなければなりません。 Inode: inode は、 UNIX ファイルシステム内のすべてのファイルに関する動作の 中心です。各アクティブなファイル、カレントディレクトリ、マウントされた ファイル、テキストファイル、root には、それぞれユニークな inode が割り当 てられます。 inode はそのデバイス / i 番号によって ‘名前付け’ されていま す。詳しくはインクルードファイル <ufs/ufs/inode.h> を参照して下さい。 |
歴史
filsys と名付けられたスーパブロック構造は Version 6 AT&T UNIX から登場し ました。このマニュアルで記述されているファイルシステムは 4.2BSD から登場 しました。 FreeBSD 10.0 April 19, 1994 FreeBSD 10.0 |