この章の内容は次のとおりです。
UFS ファイルシステムを作成すると、ディスクスライスがシリンダグループに分割されます。「シリンダグループ」は、1 つ以上の連続したディスクシリンダで構成されます。シリンダグループはさらにアドレス指定可能なブロックに分割され、このブロックによって、シリンダグループ内のファイルの構造が編成され、制御されます。各種のブロックは、ファイルシステム内で特定の機能を持っています。UFS ファイルシステムには、次の 4 種類のブロックがあります。
ブロックの種類 |
格納されている情報の種類 |
---|---|
ブートブロック |
システムブート時に使用される情報 |
スーパーブロック |
ファイルシステムに関する大部分の情報 |
i ノード |
ファイルに関する名前以外のすべての情報 |
記憶域またはデータブロック |
各ファイルのデータ |
次の節では、これらのブロックの編成と機能について説明します。
ブートブロックには、システムのブート時に使用されるオブジェクトが格納されます。ファイルシステムがブートに使用されなければ、ブートブロックは空白のままです。ブートブロックは最初のシリンダグループ (シリンダグループ 0) にのみ置かれ、スライス内の最初の 8K バイトです。
スーパーブロックには、次のようなファイルシステムに関する大部分の情報が格納されます。
ファイルシステムのサイズと状態
ラベル (ファイルシステム名とボリューム名を含む)
ファイルシステムの論理ブロックのサイズ
最終更新日時
シリンダグループのサイズ
シリンダグループ内のデータブロック数
集計データブロック
ファイルシステムの状態
最後のマウントポイントのパス名
スーパーブロックには重要なデータが入っているので、ファイルシステムの作成時には複数のスーパーブロックが作成されます。
集計情報ブロックは、スーパーブロック内に保管されます。集計情報ブロックは複製されませんが、通常はシリンダグループ 0 内の主スーパーブロックと一緒のグループに分類されます。集計ブロックには、ファイルシステムが使用されるときに発生する変更が記録されます。さらに、ファイルシステム内の i ノード数、ディレクトリ数、フラグメント数、および記憶ブロック数が表示されます。
i ノードには、ファイルに関して名前以外のすべての情報が入っており、ディレクトリ内に保管されます。i ノードは 128 バイトです。i ノード情報はシリンダ情報ブロック内に保管され、次の情報が入っています。
ファイルのタイプ
通常ファイル
ディレクトリ
ブロック型特殊ファイル
キャラクタ型特殊ファイル
FIFO (名前付きパイプとも呼ぶ)
シンボリックリンク
ソケット
その他の i ノード – 属性ディレクトリとシャドウファイル (ACL 用)
ファイルのモード (読み取り権 - 書き込み権 - 実行権のセット)
ファイルへのハードリンク数
ファイルの所有者のユーザー ID
ファイルが属するグループ ID
ファイル内のバイト数
15 個のディスクブロックアドレスの配列
ファイルの最終アクセス日時
ファイルの最終変更日時
i ノードの変更日時
15 個のディスクブロックアドレスの配列 (0 - 14) は、ファイルの内容が格納されているデータブロックを指します。最初の 12 個は直接アドレスです。つまり、ファイルの内容のうち最初の 12 個の論理記憶ブロックを直接指します。ファイルが論理ブロック 12 個分より大きい場合は、13 番目のアドレスは間接ブロックを指します。間接ブロックには、ファイルの内容ではなく直接ブロックのアドレスが入っています。14 番目のアドレスは、二重間接ブロックを指します。二重間接ブロックには、間接ブロックのアドレスが入っています。15 番目のアドレスは三重間接アドレス用です。次の図に、i ノードから始まるこのアドレスブロックチェーンを示します。
ファイルシステムに割り当てられた残りの領域には、データブロック (記憶ブロックともいう) が入っています。これらのデータブロックのサイズは、ファイルシステムの作成時に決定されます。デフォルトでは、データブロックは、2 つのサイズに割り当てられます。 8K バイトの論理ブロックサイズと 1K バイトのフラグメントサイズです。
通常ファイルの場合、データブロックにはファイルの内容が入っています。ディレクトリの場合、データブロックにはディレクトリ内のファイルの i ノード番号とファイル名を示すエントリが入っています。
現在、i ノード、間接アドレスブロック、または記憶ブロックとして使用されていないブロックには、シリンダグループマップ内で空きを示すマークが付けられます。また、このマップはフラグメントを追跡し、断片化によるディスクパフォーマンスの低下を防止します。
UFS ファイルシステムの内容の構造を理解しやすいように、次の図に、一般的な UFS システム内の一連のシリンダグループを示します。
newfs コマンドによって割り当てられるデフォルトのファイルシステムパラメータを変更しようとする前に、各パラメータについて理解しておく必要があります。この節では、次の各パラメータについて説明します。
これらのパラメータをカスタマイズするコマンドオプションについては、newfs(1M) と mkfs_ufs(1M) のマニュアルページを参照してください。
論理ブロックサイズは、UNIX カーネルがファイルの読み書きに使用するブロックのサイズです。一般に、論理ブロックサイズは物理ブロックサイズとは異なります。物理ブロックサイズは、通常は 512K バイトで、ディスクコントローラが読み書きできる最小ブロックのサイズです。
論理ブロックサイズは、デフォルトでシステムのページサイズに設定されます。UFS ファイルシステムの場合、このデフォルト論理ブロックサイズは 8192 バイト (8K バイト) です。UFS ファイルシステムでは、ブロックサイズとして 4096 バイトまたは 8192 バイト (4K または 8K バイト) がサポートされます。論理ブロックの推奨サイズは 8K バイトです。
sun-4u プラットフォームでは、8192 バイトのブロックサイズしか指定できません。
システムに最善の論理ブロックサイズを選択するには、必要なパフォーマンスと使用可能容量を検討してください。ほとんどの UFS システムでは、8K バイトのファイルシステムが最高のパフォーマンスを発揮し、ディスクパフォーマンスと一次メモリーやディスク上の領域の使用量が適切なバランスに保たれます。
原則として、効率を高めるには、ほとんどのファイルがきわめて大きいファイルシステムには大きめの論理ブロックサイズを使用します。ほとんどのファイルがきわめて小さいファイルシステムには、小さめの論理ブロックサイズを使用します。ファイルシステム上で quot -c filesystem コマンドを使用すると、ファイルの分散に関する詳細なレポートをブロックサイズ別に表示できます。
ただし、通常は、ファイルシステムの作成時に設定されたページサイズが最適です。
ファイルが作成または拡張されると、論理ブロック全体または「フラグメント」と呼ばれる部分のディスク容量が割り当てられます。ファイルのためにディスク容量が必要になると、まずブロック全体が割り当てられ、次に残りの部分にブロックのうち 1 つまたは複数のフラグメントが割り当てられます。小型ファイルの場合、割り当てはフラグメントから始まります。
ブロック全体ではなく、そのフラグメントを割り当てることができるので、ブロック内の未使用のホールによって生じるディスク容量の「断片化」が減少し、容量の節約になります。
UFS ファイルシステムを作成するときに、「フラグメントサイズ」を定義します。デフォルトのフラグメントサイズは 1K バイトです。各ブロックは、1 個、2 個、4 個、または 8 個のフラグメントに分割できます。この場合、フラグメントサイズは 8192 バイトから 512 バイト (4K バイトのファイルシステムのみ) までです。実際には、下限はディスクのセクターサイズ、通常は 512 バイトに連動します。
マルチテラバイトのファイルシステムの場合、フラグメントサイズはファイルシステムのブロックサイズに等しくなります。
フラグメントサイズの上限は論理ブロックサイズに等しくなります。この場合、フラグメントは存在しないことになります。容量よりも速度を重視する場合、きわめて大型のファイルがあるファイルシステムには、この構成が最適なことがあります。
フラグメントサイズを選択するときには、処理時間と容量の兼ね合いを考慮してください。 フラグメントサイズが小さければ容量の節約になりますが、割り当てには時間がかかります。原則として、格納効率を高めるには、ほとんどのファイルが大型のファイルシステムには、大きめのフラグメントサイズを使用します。ほとんどのファイルが小型のファイルシステムには、小さめのフラグメントサイズを使用します。
「最小空き容量」とは、ファイルシステムの作成時に予約分として保持されるディスク容量の割合です。デフォルトの予約分は、((64M バイト/パーティションサイズ) * 100) で算出し、その値はもっとも近い整数に切り捨てられ、ディスク容量の 1% から 10% の範囲に制限されます。
ファイルシステム内の空き容量が少なくなるほど、アクセス速度が低下するので、空き容量は重要です。十分な空き容量があれば、UFS ファイルシステムは効率よく動作します。ファイルシステムがいっぱいになって、使用可能なユーザー領域を使い果たすと、スーパーユーザー以外は予約済みの空き容量にアクセスできなくなります。
df などのコマンドは、最小空き容量として割り当て済みの分を差し引いて、ユーザーに使用可能な容量をパーセントで表示します。コマンドでファイルシステム内のディスク容量の 100 パーセント以上が使用中であると表示される場合は、予約分の一部がスーパーユーザーによって使用されています。
ユーザーに割り当てを適用する場合に、各ユーザーが使用可能な容量には予約分の空き容量は含まれません。tunefs コマンドを使用すると、既存のファイルシステムの最小空き容量の値を変更できます。
このパラメータはもう使用しません。指定した値に関わらず、値は常に 0 に設定されます。
「最適化のタイプ」パラメータの設定には、「space」と「time」があります。
space – 最適化のタイプに space を選択すると、断片化を最小限度に抑え、ディスクの使用状況が最適化されるようにディスクブロックが割り当てられます。
time – 最適化のタイプに time を選択すると、配置はあまり重視されず、できるだけ高速になるようにディスクブロックが割り当てられます。空き容量が十分ある場合、それほど細かく断片化しなくても、比較的簡単にディスクブロックを割り当てることができます。デフォルトは time です。
既存のファイルシステムの場合は、tunefs コマンドを使用して最適化タイプのパラメータ値を変更できます。
詳細は、tunefs(1M) のマニュアルページを参照してください。
i ノード 1 個あたりのバイト数によって、ファイルシステム内における i ノードの密度が決まります。ファイルシステムの合計サイズをこの値で割ると、作成すべき i ノードの個数が得られます。i ノードが割り当てられたら、ファイルシステムを作成し直さないかぎり、その数は変更できません。
1G バイト未満ファイルシステムが 1G バイト以下の場合、i ノード 1 個あたりのデフォルトのバイト数は 2048 バイト (2K バイト) です。ファイルシステムが 1G バイトを超える場合、次の公式が使用されます。
ファイルシステムのサイズ |
i ノードごとのバイト数 |
---|---|
1G バイト以下 |
2048 |
2G バイト未満 |
4096 |
3G バイト未満 |
6144 |
3G バイト以上、1T バイト以下 |
8192 |
1T バイト超または -T オプションを指定して作成した場合 |
1048576 |
多数のシンボリックリンクを持つファイルシステムでは、平均ファイルサイズが小さくなることがあります。ファイルシステムに多数の小型ファイルが格納される場合は、このパラメータに小さい値を与えてもかまいません。i ノード数が少ないために i ノードが不足するよりも、多すぎる方が好ましいことを留意してください。i ノード数が少なすぎると、実際には空のディスクスライス上でも最大ファイル数に達してしまうことがあります。
UFS ファイルシステムの最大サイズは、およそ 16T バイトで、使用できる領域は、そこから約 1 パーセントのオーバーヘッドを引いたサイズです。「空白」ファイルの論理サイズは 1T バイトです。ただし、ファイルに格納できる実際のデータ容量は、1T バイトから約 1 パーセントのファイルシステムオーバーヘッドを引いたサイズです。
UFS ファイルシステム内のディレクトリあたりのサブディレクトリの最大数は、32,767 です。この制限はあらかじめ定義されたものなので、変更できません。