EN JA
MOUNT_UNIONFS(8)
MOUNT_UNIONFS(8) FreeBSD System Manager's Manual MOUNT_UNIONFS(8)

名称

mount_unionfsユニオンファイルシステムをマウントする

書式

mount_unionfs [ -b][ -o options] directory uniondir

解説

mount_unionfs ユーティリティは、 directoryuniondir の上に接続し、そこから両方のディレクトリツリーの内容が見えるようにします。デフォルトでは、 directory上の 層に、 uniondir下の 層になります。

オプションは、次の通りです:

-b
推奨されません。代わりに -o below を使用してください。
-o
オプションは、1 つのオプションが続く -o フラグで指定されます。次のオプションが利用可能です:
below
directory が下の層となり、 uniondir が上の層となるように、デフォルト位置を逆にします。しかしながら、 uniondir は、マウントポイントのままとなります。
Sm copymode = traditional | transparent | masquerade Sm
必要であなら、上の層で自動的にファイルまたはディレクトリを作成する方法を指定します。 traditional (伝統的な) モードは、後方互換性のために古い unionfs として同じ方法を使用し、上の層でファイルを作成するために下の層でファイルとディレクトリのモードビットと所有権を transparent (透過的に) 複製します。 masquerade モードの振る舞いについては、下記の マスカレードモード を参照してください。
Sm whiteout = always | whenneeded Sm
ファイルまたはディレクトリを削除するとき、または、既に下の層に存在するときのみ、ホワイトアウトが上の層で常に行われるべきであるかどうかを指定します。
udir= mode
masquerade モードのために 8 進数でディレクトリモードビットを指定します。
ufile= mode
masquerade モードのために 8 進数でファイルモードビットを指定します。
gid= gid
masquerade モードのためのグループを指定します。
uid= uid
masquerade モードのためのユーザを指定します。

ファイルシステムのセキュリティを維持するため、ファイルシステムをマウントするユーザは、スーパユーザか、マウントポイントのディレクトリに書き込み許可を持つ者でなければなりません。さらに、普通のユーザがファイルシステムをマウントするを許可するには、 vfs.usermount sysctl(8) 変数を 1 に設定しなければなりません。しかしながら、スーパユーザだけがこの機能を使用することができるので、 transparentmasquerade モードは、 vfs.usermount が 0 に設定されることを必要とすることに注意してください。

ファイルの検索は、上の層、下の層の順におこなわれます。上の層には、エントリのないディレクトリが、下の層で見つかった場合には、上の層に シャドウ ディレクトリが作られます。所有権とモードビットは、 copymode オプションに応じて設定されます。 traditional モードでは、その時、事実上、umask によって変更された、モード 0777 (“ rwxrwxrwx”) で、元々ユニオン (union) マウントを行ったユーザによって所有されます。

あるファイルが上の層に存在している場合、下の層にある同じ名前のファイルをアクセスする方法はありません。どうしても必要なら、ループバックマウントとユニオンマウントを組み合せることで、別のパス名を使って下の層のファイルをアクセスできるようにしておくことができます。

オブジェクトへのアクセスは、それがディレクトリである場合を除き、通常のファイルシステムのアクセス権チェックのあとで実行されます。ディレクトリの場合には、アクセスをおこなうユーザは、上の層と下の層の両方のディレクトリのアクセス権を持っていなければなりません (両方のディレクトリが存在している必要があります)。

いくつかの特別な場合を除き、 uniondir 中のオブジェクトの作成や変更の要求は、上の層に渡されます。下の層に存在するファイルを書き込み用にオープンしようとすると、そのファイルの 完全な コピーが上の層に作成され、それから上の層のコピーがオープンされます。同様に、下の層のファイルを切り詰めてサイズを 0 にしようとすると、空のファイルが上の層に作成されることになります。これ以外の、本当に下の層の変更が必要となる操作は、失敗し、 EROFS が返されます。

ユニオンファイルシステムは、個々のファイルシステムを扱うというよりも名前空間を扱うものです。ユニオンマウントは、 uniondir 以下のディレクトリツリーに再帰的に影響します。このため uniondir 以下にマウントされたファイルシステムは、すべてユニオン効果を持つようになります。これが mount(8)union オプションとは、異なる点です。 union オプションでは、ユニオン効果は、マウントポイントだけに働き、ファイル名の検索のみに使われます。

マスカレードモード

ファイル (またはディレクトリ) が上の層で作成されるとき、 masquerade モードは、(ファイルのための) ufile または (ディレクトリのための) udir オプションと与えられた固定アクセスモードビットと、下の層のものの代わりに、 udirgid オプションで与えられている所有者をそれに設定します。 masquerade モードで、ファイルまたはディレクトリの所有者が uid オプションで指定されたものに適合するとき、所有者のためのモードビットだけが変更されることに注意してください。すなわち、上の層のファイルモードビットは、(下の層のモード) OR ufile AND 0700 で与えられたモード) となり、所有権は、下の層のものと同じになります。

ufile, udir, uidgid のためのデフォルト値は、次の通りです:

  • ufileudir のいずれも指定されなかったなら、マウントポイントのアクセスモードビットが、使用されます。
  • uidgid のいずれも指定されなかったなら、マウントポイントの所有権が、使用されます。
  • udir または ufile のいずれも指定されなかったなら、別のオプションの値が使用されます。
  • uid または gid のいずれも指定されなかったなら、別のオプションの値が使用されます。

使用例

コマンド

mount -t cd9660 -o ro /dev/cd0 /usr/src 
mount -t unionfs -o noatime /var/obj /usr/src

は、CD-ROM ドライブ /dev/cd0/usr/src にマウントし、その上に /var/obj を重ねます。ほとんどの場合、これは、ソースツリーが実際には、CD-ROM 上にあるにもかかわらず、書き込みが可能になるという効果を目的としています。 -o noatime オプションは、下の層から上の層までの不要なコピーを避けるために役に立ちます。

コマンド

mount -t cd9660 -o ro /dev/cd0 /usr/src 
chown 2020 /usr/src 
mount -t unionfs -o noatime -o copymode=masquerade -o uid=builder \ 
    -o udir=755 -o ufile=644 /var/obj /usr/src

は、また、 /usr/src に CD-ROM ドライブ /dev/cd0 をマウントし、次に、成功すれば /var/obj にアタッチします。その上、上の層から見られるとき、 /usr/src のすべてのファイルとディレクトリの所有者は、UID 2020 がある正規のユーザです。アクセスモードビットついて、下の層 (この例では、CDROM で) のものは、変更なしでまだ使用されていることに注意してください。したがって、下の層のアクセスモードビットと所有権とは無関係に上の層への書き込み特権を制御することができます。ユーザが下の層からの読み込み特権がないなら、上の層が masquerade モードを使用してマウントされるときさえ、まだ読み込むことができません。

コマンド

mount -t unionfs -o noatime -o below /sys $HOME/sys

は、ユーザのホームディレクトリの下の sys ディレクトリに、システムのソースツリーを下の層として重ね合わせます。これにより、個々のユーザがそのソースツリーに対して個人的な変更を加えて、新しいカーネルを構築することができるようになります。他のユーザは、その変更に関知しません。下の層のファイルは、そのまま /sys からアクセスできることに注意してください。

歴史

mount_unionfs ユーティリティは、 4.4BSD ではじめて登場しました。

これが mount_nullfs(8) を使用するのと同じであるので、下の層を完全に隠すための -r オプションは、 FreeBSD 7.0 で削除されました。

作者

FreeBSD 7.0 で、 Masanori OZAWA <ozawa@ongs.co.jp>は、ロック、ホワイトアウトとファイルモードビットの取り扱いを再実装し、 Hiroki Sato <hrs@FreeBSD.org>は、このマニュアルページの変更に関して書きました。

バグ

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

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

上の層を支えているファイルシステムで、ホワイトアウトがサポートされていないため、下の層のオブジェクトに対して削除や名前変更の操作をおこなう方法はありません。 chmod(1) のような、下の層への変更を行う他の操作とともに VOP_WHITEOUT() によって生成される、このような操作のために EOPNOTSUPP を返します。

ユニオンツリーの上で find(1) を実行すると、上の層にシャドウディレクトリのツリーが作成されてしまうという副作用があります。

現在の実装は、上の層のための acl(9), mac(9) または、その他のためのコピー拡張属性をサポートしません。これが安全問題となるかもしれないことに注意してください。

下の層に存在し、上の層に存在しないとき、上の層で自動的に作成されたものである、シャドウディレクトリは、常にスーパユーザの特権で作成されます。しかしながら、同様に下の層からコピーされたファイルは、それにアクセスしたユーザによって作成されます。そんな訳で、ユーザがスーパユーザでないなら、 transparent モードではさえ、上の層のコピーされたファイルのアクセスモードビットは、常に下の層のものと同じとなるわけではありません。

November 30, 2006 FreeBSD