aboutsummaryrefslogtreecommitdiff
path: root/ja_JP.eucJP/man/man5/fs.5
blob: 67cffd3eba8add78827516cfdbfc55cf0484e666 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
.\" Copyright (c) 1983, 1991, 1993
.\"	The Regents of the University of California.  All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\"    must display the following acknowledgement:
.\"	This product includes software developed by the University of
.\"	California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\"    may be used to endorse or promote products derived from this software
.\"    without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\"     @(#)fs.5	8.2 (Berkeley) 4/19/94
.\" %FreeBSD: src/share/man/man5/fs.5,v 1.8.2.1 1999/08/29 16:46:46 peter Exp %
.\"
.\" jpman %Id: fs.5,v 1.3 1998/06/22 11:05:13 kumano Stab %
.\"
.Dd April 19, 1994
.Dt FS 5
.Os BSD 4.2
.Sh 名称
.Nm fs ,
.Nm inode
.Nd ファイルシステムボリュームのフォーマット
.Sh 書式
.Fd #include <sys/param.h>
.Fd #include <ufs/ffs/fs.h>
.Pp
.Fd #include <sys/types.h>
.Fd #include <sys/lock.h>
.Fd #include <ufs/ufs/quota.h>
.Fd #include <ufs/ufs/inode.h>
.Sh 解説
ファイル
.Aq Pa fs.h
と
.Aq Pa inode.h
は、ランダムアクセスデバイス (ディスク) 上のファイルシステムオブジェクト
の基本フォーマットを作成、管理する際に使われるいくつかの構造体、
定義済み変数、マクロを宣言します。
.Pp
ファイルシステムはブロックサイズとブロック数から構成されており、
これらはファイルシステムのパラメータになります。
.Dv BBLOCK
から始まり
大きさ
.Dv BBSIZE
だけ続くセクタは、
ディスクラベルといくつかの一次、二次ハードウェアブートストラッププログラム
のために使われます。
.Pp
実際のファイルシステムは、
.Dv SBLOCK
セクタから始まり、そこには
大きさが
.Dv SBSIZE
である
.Em スーパブロック
があります。
ファイル
.Aq Pa ufs/ffs/fs.h
にある以下の構造体は、スーパブロックを記述しています。
.Bd -literal
/*
 * FFS ファイルシステムのスーパブロック
 */
struct fs {
	int32_t	 fs_firstfield;	/* 内部スーパブロック用に使われる、歴史的な
	int32_t	 fs_unused_1;	/*     ファイルシステムのリンク済みリスト */
	ufs_daddr_t fs_sblkno;	/* ファイルシステム内のスーパブロックのアドレス */
	ufs_daddr_t fs_cblkno;	/* ファイルシステム内のシリンダブロックのオフセット */
	ufs_daddr_t fs_iblkno;	/* ファイルシステム内の inode ブロックのオフセット */
	ufs_daddr_t fs_dblkno;	/* cg 後の最初のデータのオフセット */
	int32_t	 fs_cgoffset;	/* シリンダ内のシリンダグループオフセット */
	int32_t	 fs_cgmask;	/* mod fs_ntrak の計算に使われる */
	time_t 	 fs_time;	/* 最後に書き込まれた時刻 */
	int32_t	 fs_size;	/* fs 内のブロック数 */
	int32_t	 fs_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_rotdelay;	/* 最適な次ブロックのための ms 数 */
	int32_t	 fs_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_csmask;	/* csum ブロックオフセット */
	int32_t	 fs_csshift;	/* csum ブロック数 */
	int32_t	 fs_nindir;	/* NINDIR の値 */
	int32_t	 fs_inopb;	/* INOPB の値 */
	int32_t	 fs_nspf;	/* NSPF の値 */
/* 別のコンフィギュレーションパラメータ */
	int32_t	 fs_optim;	/* 最適化の選択、以下を参照 */
/* これらのフィールドはハードウェアから引き出される */
	int32_t	 fs_npsect;	/* 予備を含むトラックあたりのセクタ数 */
	int32_t	 fs_interleave;	/* ハードウェアセクタインタリーブ */
	int32_t	 fs_trackskew;	/* トラックあたりのセクタ 0 ゆがみ */
/* fs_id は未使用の fs_headswitch と fs_trkseek のフィールドの空間を保持 */
	int32_t	 fs_id[2];	/* ユニークなファイルシステム ID */
/* シリンダグループの数とサイズにより決められるサイズ */
	ufs_daddr_t fs_csaddr;	/* シリンダグループ総括領域のブロックアドレス */
	int32_t	 fs_cssize;	/* シリンダグループ総括領域のサイズ */
	int32_t	 fs_cgsize;	/* シリンダグループサイズ */
/* これらのフィールドはハードウェアから引き出される */
	int32_t	 fs_ntrak;	/* シリンダあたりのトラック数 */
	int32_t	 fs_nsect;	/* トラックあたりのセクタ数 */
	int32_t	 fs_spc;   	/* シリンダあたりのセクタ数 */
/* これはディスクドライバパーティション作成時のもの */
	int32_t	 fs_ncyl;   	/* ファイルシステムのシリンダ数 */
/* これらのフィールドは他のフィールドから計算できる */
	int32_t	 fs_cpg;	/* グループあたりのシリンダ数 */
	int32_t	 fs_ipg;	/* グループあたりの inode 数 */
	int32_t	 fs_fpg;	/* グループあたりのブロック数 * fs_frag */
/* このデータはクラッシュ後に再計算されなければならない */
	struct	csum fs_cstotal;/* シリンダ総括情報 */
/* 以下のフィールドはマウント時にクリアされる */
	int8_t   fs_fmod;    	/* スーパブロック変更フラグ */
	int8_t   fs_clean;    	/* ファイルシステムがクリーンであるフラグ */
	int8_t   fs_ronly;   	/* 読み込み専用でマウントされたフラグ */
	int8_t   fs_flags;   	/* 現在未使用のフラグ */
	int8_t   fs_fsmnt[MAXMNTLEN];	/* マウントされている名前 */
/* これらのフィールドは現在のブロックの配置情報を保持する */
	int32_t	 fs_cgrotor;	/* 最後に検索された cg */
	struct	csum *fs_csp[MAXCSBUFS]; /* fs_cs 情報バッファのリスト */
	int32_t	 *fs_maxcluster;/* 各シリンダグループの最大クラスタ */
	int32_t	 fs_cpc;	/* postbl 内のサイクルあたりのシリンダ */
	int16_t	 fs_opostbl[16][8];	/* 旧回転ブロックリストヘッド */
	int32_t	 fs_sparecon[50];	/* 将来のために予約された定数 */
	int32_t	 fs_contigsumsize;	/* クラスタ総括配列の大きさ */
	int32_t	 fs_maxsymlinklen;	/* 内部シンボリックリンクの最大長 */
	int32_t	 fs_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_postblformat;/* 位置レイアウトテーブルのフォーマット */
	int32_t	 fs_nrpos;	/* 回転位置の数 */
	int32_t	 fs_postbloff;	/* (u_int16) 回転ブロックリストヘッド */
	int32_t	 fs_rotbloff;	/* (u_int8) 各回転毎のブロック */
	int32_t	 fs_magic;	/* マジックナンバ */
	u_int8_t fs_space[1];	/* 各回転毎のブロックのリスト */
/* 実際はもっと長い */
};

/*
 * ファイルシステム識別
 */
#define	FS_MAGIC	0x011954   /* fast ファイルシステムのマジックナンバ */
#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	/* 最小ディスクフラグメンテーション */

/*
 * 回転レイアウトテーブルフォーマットタイプ
 */
#define FS_42POSTBLFMT		-1  /* 4.2BSD 回転テーブルフォーマット */
#define FS_DYNAMICPOSTBLFMT	1   /* 動的回転テーブルフォーマット */
.Ed
.Pp
各ディスクドライブはいくつかのファイルシステムを含んでいます。
1 つのファイルシステムは、いくつかのシリンダグループから成ります。
各シリンダグループには inode とデータがあります。
.Pp
ファイルシステムは、シリンダグループを順番に記述するスーパブロックに
よって記述されています。
スーパブロックは重要なデータであり、壊滅的な損失から守るために
各シリンダグループに複製されています。
これはファイルシステム作成時に行なわれ、重要なスーパブロックデータは
変更されないので、特に惨事がふりかからなければ、複製が参照される
必要はありません。
.Pp
inode に保存されたアドレスによって、`ブロック' のフラグメントの
位置を決めることができます。
ファイルシステムブロックのほとんどは
.Dv MAXBSIZE
ですが、2, 4, 8 個に分けることが自由にでき、
それぞれを位置指定できます。
これらの断片は
.Dv DEV_BSIZE
または
.Dv DEV_BSIZE
単位の倍数であれば良いのです。
.Pp
大きなファイルは、非常に大きなデータブロックからなります。
ディスクスペースの過度の浪費を避けるために、小さなファイルの
最後のデータブロックは、
大きなブロックのフラグメントが必要な数だけ配置されます。
ファイルシステムフォーマットは、そのようなフラグメント (大きなブロックを
分割した一片) の 1 つへのポインタだけを保持します。
そのようなフラグメントの大きさは、
inode にある情報から決定することができ、
.Fn blksize fs ip lbn
マクロが使っています。
.Pp
ファイルシステムは、提供可能な空きをフラグメントレベルで記録します。
つまり、ブロックの空きを決定するために、フラグメントを並べて調べます。
.Pp
root inode は、ファイルシステムのおおもとです。
inode 0 は、通常の目的では使われず、歴史的に
バッドブロックは inode 1 にリンクされます。
したがって root inode は、2 です
(inode 1 は、もはやこの目的では使われませんが、
多くのダンプテープがこの仮定をしているので、それについては変更できません)。
.Pp
.Fa fs_minfree
要素は、空いているファイルシステムブロックの最低許容割合を与えます。
空きリストがこのレベル以下になった場合、スーパユーザ
だけがブロックの確保を続けることができます。
.Fa fs_minfree
要素は、空きブロックの予備が必要ないと思われたら 0 にセットしても
かまいませんが、ファイルシステムが 90% 以上詰まった状態で動いているときには、
かなり性能が低下するでしょう。
そのためデフォルトの
.Fa fs_minfree
の値は 10% になっています。
.Pp
経験上、ブロックフラグメンテーションと 90% 使用中のディスク全体の利用
の兼ね合いが最も良いのは、フラグメンテーション 8 のときです。
そのためデフォルトのフラグメントサイズはブロックサイズの 8 倍になっています。
.Pp
要素
.Fa fs_optim
はファイルシステムがブロックを確保するのに要する時間を最小に
しようとするか、それともディスク上の領域のフラグメンテーションを最小に
しようとするかを指定します。
fs_minfree (上記参照) の値が 10% より小さい場合は、ファイルシステム
は空間の最適化をデフォルトとし、
完全な大きさのブロックがなくならないようにします。
minfree の値が 10% と等しいかそれ以上の場合には、フラグメンテーション
が問題とはなりにくく、ファイルシステムは時間の最適化をデフォルトに
します。
.Pp
.Em シリンダグループに関連した制限 :
連続したブロックを最小の回転遅れで配置することができるよう、
各シリンダは異なる回転位置での利用可能なブロック数を保持し続けます。
デフォルトでは回転位置を 8 分割で表し、このときの総括情報の分解能は
典型的な 3600 rpm のドライブで 2ms になります。
.Pp
要素
.Fa fs_rotdelay
は、同一シリンダ上で別のディスク転送を開始する
最小ミリ秒数を与えます。
これは、あるファイル中のディスクブロックの周回の中での最適な配置を
決定するのに使われます。
デフォルトの
.Fa fs_rotdelay
の値は 2ms です。
.Pp
各ファイルシステムは、静的に割り当てられた数の inode を持っています。
inode は、ディスク空間あたり
.Dv NBPI
バイト確保されます。
inode を配置する戦略は、極端に保守的です。
.Pp
.Dv MINBSIZE
が許される最小のブロックサイズです。
.Dv MINBSIZE
が 4096 では、2 段までの(ブロック)間接参照を使って
2^32 の大きさのファイルを作ることができます。
.Dv MINBSIZE
は、シリンダグループブロックを保持するのに十分な大きさでなければ
なりません。
したがって
.Pq Fa 構造体 cg
への変更は大きさを
.Dv MINBSIZE
以内にしておかなければなりません。
スーパブロックは決して
.Dv SBSIZE
の大きさ以上ではないということに注意して下さい。
.Pp
ファイルシステムがマウントされているパス名は、
.Fa fs_fsmnt
に保持されます。
.Dv MAXMNTLEN
は、この名前のためにスーパブロックに割り当てられた領域の量を定義します。
ファイルシステム毎の総括情報の量の上限は、
.Dv MAXCSBUFS
により定義されています。
4096 バイトブロックサイズの場合では、これは現在最大 200 万シリンダ分
用意されています。
.Pp
それぞれのシリンダグループ情報は、先頭のシリンダグループ
データブロックから確保されたブロックに要約されます。
これらのブロックはスーパブロックに加えて
.Fa fs_csaddr
(
.Fa fs_cssize の大きさ)
から読み込まれます。
.Pp
.Sy 注意:
.Fn sizeof "struct csum"
は
.Fn fs_cs
マクロを動かすために 2 のべき乗でなければなりません。
.Pp
.Em "ファイルシステムのスーパブロック" :
周回レイアウトテーブルの大きさは、スーパブロックが
.Dv SBSIZE
の大きさを持つことにより制限されています。
これらのテーブルの大きさは、ファイルシステムのブロックサイズに
.Em 逆比例
します。
セクタサイズが 2 のべき乗でないときには、周回パターンを
.Pq Fa fs_cpc
だけ繰り返すまでに含まれるシリンダ数が増加するので、
同様にテーブルの大きさも増加します。
周回レイアウトテーブルの大きさは、
.Pq Fa struct fs
に残っているバイト数から割り出されます。
.Pp
シリンダグループあたりのデータブロック数は、シリンダグループが
たかだか 1 ブロックであるので、制限されています。
inode と空きブロックテーブルは、単一ブロックから
シリンダグループ構造体
.Pq Fa struct cg
のための領域を除いた残りにぴったり合っていなければなりません。
.Pp
.Em Inode :
inode は、
.Tn UNIX
ファイルシステム内のすべてのファイルに関する動作の中心です。
各アクティブなファイル、カレントディレクトリ、マウントされたファイル、
テキストファイル、root には、それぞれユニークな inode が割り当てられます。
inode はそのデバイス / i 番号によって `名前付け' されています。
詳しくはインクルードファイル
.Aq Pa ufs/ufs/inode.h
を参照して下さい。
.Sh 歴史
filsys と名付けられたスーパブロック構造は
.At v6
から登場しました。このマニュアルで記述されているファイルシステムは
.Bx 4.2
から登場しました。