inode(5) FreeBSD 一般コマンドマニュアル

inode

前のページ 上に戻る 次のページ

inode


     #include <ufs/ffs/fs.h>

     #include <sys/types.h>
     #include <sys/lock.h>
     #include <ufs/ufs/quota.h>
     #include <ufs/ufs/inode.h>


解説

     ファイル <fs.h> と <inode.h> は、ランダムアクセスデバイス (ディスク) 上の
     ファイルシステムオブジェクトの基本フォーマットを作成、管理する際に使われ
     るいくつかの構造体、定義済み変数、マクロを宣言します。

     ファイルシステムはブロックサイズとブロック数から構成されており、これらは
     ファイルシステムのパラメータになります。 BBLOCK から始まり大きさ BBSIZE
     だけ続くセクタは、ディスクラベルといくつかの一次、二次ハードウェアブート
     ストラッププログラムのために使われます。

     実際のファイルシステムは、 SBLOCK セクタから始まり、そこには大きさが
     SBSIZE である スーパブロックがあります。ファイル <ufs/ffs/fs.h> にある以
     下の構造体は、スーパブロックを記述しています。

     /*
      * 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_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_DYNAMICPOSTBLFMT     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% と等しいかそれ以上
     の場合には、フラグメンテーションが問題とはなりにくく、ファイルシステムは
     時間の最適化をデフォルトにします。

     MINBSIZE が許される最小のブロックサイズです。 MINBSIZE が 4096 では、2 段
     までの(ブロック)間接参照を使って 2^32 の大きさのファイルを作ることができ
     ます。 MINBSIZE は、シリンダグループブロックを保持するのに十分な大きさで
     なければなりません。したがって (構造体 cg) への変更は大きさを MINBSIZE 以
     内にしておかなければなりません。スーパブロックは決して SBSIZE の大きさ以
     上ではないということに注意して下さい。

     ファイルシステムがマウントされているパス名は、 fs_fsmnt に保持されます。
     MAXMNTLEN は、この名前のためにスーパブロックに割り当てられた領域の量を定
     義します。ファイルシステム毎の総括情報の量の上限は、 MAXCSBUFS により定義
     されています。 4096 バイトブロックサイズの場合では、これは現在最大 200 万
     シリンダ分用意されています。

     それぞれのシリンダグループ情報は、先頭のシリンダグループデータブロックか
     ら確保されたブロックに要約されます。これらのブロックはスーパブロックに加
     えて fs_csaddr ( fs_cssize の大きさ) から読み込まれます。

     B>注B>意: sizeof(struct csum) は fs_cs() マクロを動かすために 2 のべき乗でな
     ければなりません。

     ファイルシステムのスーパブロック: 周回レイアウトテーブルの大きさは、スー
     パブロックが SBSIZE の大きさを持つことにより制限されています。これらのテ
     ーブルの大きさは、ファイルシステムのブロックサイズに 逆比例します。セクタ
     サイズが 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 4.4                     April 19, 1994                     FreeBSD 4.4

ABELNET VPSサービス