スポンサーリンク

MOUNT_NULLFS(8) FreeBSD システム管理者マニュアル MOUNT_NULLFS(8)

名称

mount_nullfs − ループバックファイルシステムサブツリーをマウントする; 何も しない (null) ファイルシステム層の利用のデモ

書式

mount_nullfs [−o options] target mount_point

解説

mount_nullfs ユーティリティは、null 層を作ります。これは、ファイルシステ ムの名前空間の部分木を、グローバルなファイルシステムの名前空間の別の場所 にエイリアスします。これにより、既存のファイルとディレクトリが別のパス名 にてアクセス可能となります。

ファイルシステムの仮想的コピーとシンボリックリンクとの第 1 の違いは、 getcwd(3) 関数が仮想コピーでは正しく動作する点と、別のファイルシステムを 仮想コピー上にマウントしてもオリジナルには影響がない点です。 stat(2) は、 仮想コピーに対して別のデバイス番号を返しますが、別の側面においてはオリジ ナルとの区別はつきません。

mount_nullfs ファイルシステムが歴史的なループバックファイルシステムと異な るのは、次の 2 つの点です: 1 つは、ファイルシステムのスタック化可能層 (stackable layers) という技術を使って実装されている点、もう 1 つはディレ クトリの vnode だけでなく、すべての下位層の vnode の上に ‘‘null-node’’ が 積み重なっているという点です。

オプションは以下のものがあります:

       −o

−o のあとに、オプション文字列をコンマで区切って指定することができ ます。指定可能なオプションとその意味は mount(8) を参照してくださ い。

この null 層は 2 つの目的を持っています。1 つは、何もしない層を提供するこ とでファイルシステムの層の構築のデモを示すことです (実際には何も行わない というわけではなく、ループバックファイルシステムが提供することはすべて行 います)。もう 1 つはプロトタイプ層を提供することです。層のフレームワーク として必要なことはすべて提供しているので、ここから新しいファイルシステム 層を簡単に作り出すことができます。

このマニュアルの以下の部分では、新しいファイルシステム層を構築するための 基礎として null 層を調べます。

新しい null 層の例示

新しい null 層は mount_nullfs で作られます。 mount_nullfs ユーティリティ は 2 つの引数をとります。 1 つは下位層の vfs のパス名 (target-pn) で、も う 1 つは null 層が現れる名前空間内のパス名 (mount-point-pn) です。 null 層が適切な場所に置かれた後、目的のディレクトリ階層 (target-pn) の中身がマ ウント先 (mount-point-pn) にエイリアスされます。

null 層の操作

null 層は最小のファイルシステム層であり、すべての操作を下位層に処理させる ためにバイパスするだけです。その動作のほとんどはバイパスルーチンに集中 し、 vnode に対する操作はほとんどすべてバイパスルーチンを通ります。

バイパスルーチンは下位層における任意の vnode に対する操作を受け付けます。 まず、vnode に対する操作の引数を検査し、 null-node を下位層において等価と なるものに置き換えることから始めます。次に、下位層の操作を起動します。最 後に、引数中の null-node を置き換えます。もしその操作によって vnode が 返ってきたら、その返ってきた vnode の上に null-node を積みます。

ほとんどの操作をバイパスしますが、 vop_getattr, vop_inactive, vop_reclaim, vop_print はバイパスしません。 vop_getattr は戻り値の fsid を替えなければなりません。 vop_inactivevop_reclaim は、null 層特有の データを解放するためにバイパスしません。 vop_print は過度のデバッグ情報を 避けるためにバイパスしません。

vnode スタックの概説

マウントは null 層を下位層に関連づけます。その結果 2 つの VFS が積み重な ります。 vnode スタックはファイルがアクセスされるたびに必要に応じて作成さ れます。

最初のマウントでは新しい null 層の根として単一の vnode スタックを作りま す。他のすべての vnode スタックは根の vnode スタックや他の null vnode ス タックの操作の結果として作られます。

vnode を返す操作の結果として新しい vnode スタックが生まれます。バイパス ルーチンは、呼出し側に vnode を返す前に新しい vnode の上に null-node を積 みます。

例えば、null 層を以下のようにマウントする例を想像します。

      mount_nullfs /usr/include /dev/layer/null

/dev/layer/null にチェンジディレクトリすると、根の null-node (null 層をマ ウントした時に作られたもの) が割り当てられます。ここで sys をオープンする ことを考えてみます。 vop_lookup は根の null-node で行なわれます。この操作 は下位層にバイパスされ、下位層が UFS の sys を表す vnode を返します。それ から null_bypass は UFS sys にエイリアスする null-node を構築し、呼出元に これを返します。 null-node sys に対する以降の操作で他の vnode スタックを 構築する時にはこの処理が繰り返されます。

他のファイルシステム層の作成

新しいファイルシステム層を構築する一番簡単な方法は、 null 層のコピーを作 り、すべてのファイル、変数の名前を付け直し、そしてそのコピーを変更するこ とです。すべての変数の名前を変えるのには sed(1) ユーティリティが良く使わ れます。

umap 層は null 層の子孫の一例です。

下位層の操作の起動

操作が完全にはバイパスできない時に下位層にある操作を起動するための方法が 2 つあります。それぞれの方法は違った状況に対して適切に使われます。両方の 場合とも、その操作の引数を下位層のために正しく作るのはエイリアスする層の 責任であり、 vnode 引数を下位層にマッピングします。

最初の方法はエイリアスする層のバイパスルーチンを呼ぶことです。この方法 は、下位層で現在扱われている操作を起動したい時に最も適しています。これは バイパスルーチンがすでにマッピングされているという利点があります。この例 として、 null_getattrs が null 層にあります。

2 つ目の方法は、 VOP_OPERATIONNAME インタフェースを用いて下位層の vnode の操作を直接起動することです。この方法の利点は、下位層の任意の操作を起動 するのが簡単ということにあります。欠点は、vnode 引数は手動でマッピングさ れなければならないことです。

関連項目

mount(8)

UCLA Technical Report CSD-910056, Stackable Layers: an Architecture for File System Development.

バグ

本ファイルシステムタイプは、まだ完全にはサポートされていません (注: 機能 しないということです) し、実際のところ使用するとシステム上のデータを破壊 するかもしれません。自己責任において使用してください。猛犬注意。濡れてい て滑ります。

危険性を減らすためには、このコードもまた所有者を必要としています - 真面目 なハッカーの方はメールを ⟨hackers@FreeBSD.org⟩ に送って引き継ぎの意思を宣 言してください。

歴史

mount_nullfs は、 4.4BSD から登場しました。

FreeBSD 10.0 May 1, 1995 FreeBSD 10.0

スポンサーリンク