exports - (カーネルベースの NFS
で) エクスポート (export)
される NFS
ファイルシステム
/etc/exports
/etc/exports ファイルは、 NFS
のクライアントにどのファイルシステムをエクスポート
(export) してよいか、
というアクセスコントロールリストを与える。
これは
exportfs(8)
によって使用され、NFS
マウントデーモン
mountd(8)
と、カーネルベースの
NFS
ファイルサーバデーモン
nfsd(8)
とに情報を与える。
このファイルの書式は
SunOS の
exports
ファイルと似ている。
それぞれの行には、エクスポートポイントと、
そのポイントにあるファイルシステムをマウントできるクライアントを
スペースで区切って指定したリストが書かれている。
リストされたクライアントの直後には、
そのクライアント向けのエクスポートオプションをコンマで区切ってリスト指定し、
リスト全体を括弧で括って置くこともできる。
クライアント名とこのオプションリストとの間にはスペースを入れてはいけない。
空行は無視され、#
以降行末まではコメントとみなされる。
行末にバックスラッシュをおけば、エントリは次の行に継続できる。
エクスポート名に空白が含まれる場合は、ダブルクォートで括る。
エクスポートパス名には、
空白やその他通常は使われない文字を指定することもできる。
このような文字を使う場合は、バックスラッシュの後に
3 桁の 8
進数で文字コードを指定する。
NFS
クライアントはいろいろな方法で指定できる。
- single host
- これはもっとも普通のフォーマットである。ホストの指定には、
レゾルバが認識できる省略形、FQDN、IP
アドレスのどれを用いてもよい。
- netgroups
- NIS
のネットグループを
@group
のように与えることができる。ネットグループの各メンバーは、
ホストの部分だけが取り出され、メンバーに入れられる。
ホストの部分が空だったり、単一のダッシュ
(-)
だったものは無視される。
- ワイルドカード
- マシン名の指定には、ワイルドカード文字として
* と ? を
用いることができる。これらを使うと
exports
ファイルをコンパクトにできる。
例えば *.cs.foo.edu
はドメイン cs.foo.edu
にあるすべての
ホストにマッチする。
これらのワイルドカード文字はドメイン名のドット
(.)
にもマッチするので、
ここで指定されたパターンは
cs.foo.edu
の任意のサブドメイン内の
全てのホストにマッチする。
- IP networks
- ディレクトリを IP
の (サブ)
ネットワークに存在するすべてのホストに
同時にエクスポートすることもできる。
これには IP
アドレスとネットマスクのペアを
address/netmask
のように指定すればよい。
ここで netmask は 10
進数をドットで区切って指定することもできるし、
連続するマスクの長さで指定することもできる
(例えば、ネットワークベースアドレスに
`/255.255.252.0'
を追加した場合でも、
`/22'
を追加した場合でも、ホスト部が
10
ビットの同じサブネットワークになる)。
ワイルドカード文字は、通常
IP
アドレスに対しては動作しない。
ただし DNS
の逆引きが失敗すると、たまたま動作してしまうこともあり得る。
エクスポートへのアクセスを
rpcsec_gss
セキュリティを使って制限するには、
クライアントとして特別な文字列
"gss/krb5" を使うこと。
rpcsec_gss とクライアントの IP
アドレスによる資格を
同時に要求することはできない。
exportfs
は以下のエクスポートオプションを受け付ける。
- secure
- このオプションを指定すると、IPPORT_RESERVED
(1024) より小さな internet
ポートから発したリクエストしか受けつけない。
このオプションはデフォルトで有効になっている。
無効にするには insecure
と指定する。
- rw
- この NFS
ボリュームに対して、書き込みと読み出しリクエストの両方を許可する。
デフォルトではファイルシステムを変更する全ての書き込みを拒否する
(これは ro
オプションで明示した場合も同じ)。
- async
- このオプションは
NFS サーバを NFS
プロトコルに違反させ、
あるリクエストによってなされた変更が安定した保存場所
(例えばディスクドライブ)
に渡される前に、
そのリクエストに応えるようにする。
このオプションを用いると通常は性能が向上するが、
クリーンでないサーバの再起動
(つまりクラッシュ)
によってデータが失われたり破壊されうるという代償を伴う。
nfs-utils の 1.0.0
まででは、このオプションがデフォルトであった。
このリリース以降は
sync
がデフォルトとなり、
async
は必要な場合は明示的に指定しなければならない。
システム管理者にこの変更を知らせるため、
sync と async
のいずれも指定されていない場合、`exportfs'
は警告を発する。
- no_wdelay
- このオプションは同時に
async
が設定されていると効果を持たない。
NFS
サーバは、書き込み要求を受けたとき、
関連した別の書き込み要求が実行中である
(または近々到着する)
と予想した場合、
その要求のディスクへの反映を少し遅らせる。
これにより一度の操作で複数の書き込み要求が
ディスクに反映されるので、性能が向上する。
NFS
サーバが受け取るデータの書き込み要求が、
主として関連性のない小さなものの場合には、
この動作は実際には性能を低下させてしまうので、
no_wdelay
を指定して無効にできる。
デフォルトの動作を
wdelay
オプションで明示的に指定することもできる。
- nohide
- このオプションは
IRIX NFS
で提供される同名のオプションを元にしている。
サーバが 2
つのファイルシステムをエクスポートし、
そのうちの 1
つが他方にマウントされている場合、
クライアントが両者にアクセスを行うには、
両方のファイルシステムを明示的にマウントしなければならない。
親の方をマウントしただけでは、
もう一方のファイルシステムがマウントされているディレクトリは空に見える。
このようなファイルシステムは
"hidden" といわれる。
hidden
にしたくないファイルシステムに
nohide
オプションを設定すれば、
適切な権限のあるクライアントは変更を知らされることなく、
親から子のファイルシステムに移動できる。
しかし NFS
クライアントのなかには、
このような状況
(例えば、見かけ上 1
つのファイルシステムで
2 つのファイルが同じ
inode
番号を持つような状況)
ではうまく動作しないものもある。
nohide
オプションは現在のところ
single host
エクスポートでしか効果がない。
このオプションの動作は、
netgroup, subnet, wildcard
などによるエクスポートでは信頼性がない。
このオプションは状況によってはとても便利であるが、よく注意して、
かつクライアントシステムがその状況下で効果的に動作することを確認した後で
使うべきである。
このオプションは hide
で明示的に無効にできる。
- no_subtree_check
- このオプションのサブツリーのチェックを無効にする。
これには簡単なセキュリティの意味もあるが、
環境によっては信頼性を向上させることもできる。
ファイルシステムのサブディレクトリがエクスポートされているが、
ファイルシステム全体がエクスポートされていない場合、
NFS
リクエストがくると、サーバは対応するファイルシステムに
アクセスされたファイルがあるかをチェックするだけでなく
(これは簡単)、
エクスポートされたツリーのなかにあるかもチェックしなければならない
(これは難しい)。
このチェックは
subtree_check とよばれる。
このチェックを行うには、サーバはクライアントに渡す
「ファイルハンドル」に、ファイルの場所に関する情報を入れなければならない。
こうすると、クライアントがファイルをオープンしている間に、
アクセスしているファイルの名前が変更されると問題が起こる
(ただし多くの簡単なケースでは動作する)。
サブツリーのチェックは、
ファイルシステムが
no_root_squash (下記参照)
でエクスポートされていて、
ファイル自身にはより一般的なアクセス権がある場合に、
root
しかアクセスできないディレクトリ内のファイルが
root
によってのみアクセスされているかを確認するのにも使える。
一般的な指針として、ホームディレクトリは
サブツリーのチェックを無効にしてエクスポートすべきである
(通常各ユーザの親ディレクトリのレベルでエクスポートされ、
かつファイル名の変更が多いため)。
大抵は読み込みのみで、ほとんどファイル名の変更が行われない
ファイルシステム
(たとえば /usr や /var) で、
それらのサブディレクトリがエクスポートされるような場合には、
サブツリーのチェックを有効にしてエクスポートした方がよいかもしれない。
サブツリーのチェックを行うデフォルトの動作は、
subtree_check
で明示的に指定することもできる。
- insecure_locks
- no_auth_nlm
- このオプション (2
つのオプション名は同じ意味)
を指定すると、 NFS
はロック要求 (NLM
プロトコルを使った要求)
の際に認証を必要としなくなる。
通常 NFS
サーバは、ファイルの読み取りアクセス権限を持つユーザに対し、
信用証明 (credential)
を保持するために、ロック要求を必要とする。
このフラグを指定すると、アクセスチェックが行われない。
初期の NFS
クライアントの実装ではロック要求の際に信用証明を送らなかったが、
現在でもこのような昔の実装を元にした多くの
NFS
クライアントが存在する。
全ての人が読み込み可能なファイルのみをロックしたい場合は、
このフラグを使うこと。
NLM
要求の際に認証を求めるデフォルトの動作は、
同じ意味をもつ auth_nlm
または secure_locks
のどちらか
(意味は全く同じ)
で明示的に指定できる。
-
mountpoint=path
- mp
- このオプションを使うと、マウントに成功した場合にのみ、
そのディレクトリをエクスポートできる。
パスが指定されない場合
(たとえば mountpoint
または mp
の場合)、エクスポートポイントはマウントポイントでなければならない。
そうでなければ、エクスポートポイントはエクスポートされない。
これにより、マウントポイント以下のディレクトリが、
事故によってエクスポートされてしまわないようにすることができる。
ここでいう事故とは、例えばディスクエラーによって
ファイルシステムがマウントに失敗するような場合である。
パスが指定される場合
(たとえば mountpoint=/path
または mp=/path
の場合)、マウントされるパスは、
エクスポートされるエクスポートポイントに対応する
マウントポイントでなければならない。
-
fsid=num
- このオプションは、通信で使用されるファイルハンドルとファイル属性の
ファイルシステム識別部として、
ファイルシステムがマウントされているブロックデバイスの
メジャー番号とマイナー番号から導き出された数ではなく、
num を使う。 任意の 32
ビットの数値が使えるが、
エクスポートされるファイルシステム間で一意
(unique)
でなければならない。
これは NFS
のフェイルオーバー
(failover, 代替引き継ぎ)
で役立つ。
フェイルオーバーのペアとなる両方のサーバーが、
共有されるファイルシステムに対して
同じ NFS
ファイルハンドルを使うことが保証されるので、
フェイルオーバー後にファイルハンドルが失効するのを避けることができる。
Linux
のファイルシステムの中には、
ブロックデバイスにマウントされていないものもある。
これらのファイルシステムを
NFS
でエクスポートするには、
fsid
オプションを使う必要がある
(ただし、このオプションはまだ充分ではない)。
値 0 は NFSv4
で使う場合には特別な意味を持つ。
NFSv4
にはエクスポートされるファイルシステム全体のルートという概念がある。
fsid=0
でエクスポートされたエクスポートポイントは、
このルートとして使用される。
サーバマシン上のファイルに対する
nfsd
によるアクセスコントロールは、
それぞれの NFS RPC request
の際に与えられる uid と
gid に基づいている。
ユーザは通常、
サーバ上にある自分のファイルには、それが普通のファイルシステム上に
あるのと同様にアクセス可能であることを期待している。
これにはクライアントとサーバ上で用いられる
uid と gid がそれぞれ
同じである必要があるが、
これは常に真であるとは限らず、望ましいとも限らない。
クライアントマシンの
root が NFS
サーバのファイルにアクセスするとき、
サーバの root
として扱われてしまうのは、ほとんどの場合は望ましくない。
このため uid 0
は普通は別の id (anonymous や
nobody uid)
にマッピングされる。
この動作は `root squashing'
と呼ばれるが、これがデフォルトである。
no_root_squash
を使えばオフにすることができる。
デフォルトでは、
exportfs
は squash アクセスに -2
(つまり 65534) という uid と gid
を用いる。
これらの数値は
anonuid
と
anongid
オプションによって変更できる。
最後に、
all_squash
オプションを指定すれば、
全ての user request を anonymous uid
に割り当てることもできる。
以下にマッピングオプションの完全なリストをあげる:
- root_squash
- uid/gid が 0
のリクエストを annonymous
uid/gid
にマッピングする。
このオプションは、
root 以外の uid
には適用されない。他にも
注意すべき uid
は存在する (例えば
bin など)
ので、注意する必要がある。
- no_root_squash
- root squashing
を無効にする。
このオプションは主にディスクレスクライアントにとって便利である。
- all_squash
- 全ての uid とgid を anonymous
にマッピングする。
これは NFS
エクスポートされた公開
FTP ディレクトリや、 news
のスプールディレクトリ等に便利である。
これと逆のオプションは
no_all_squash
であり、こちらがデフォルトになっている。
-
anonuid および anongid
- これらのオプションは
anonymous アカウントの uid と
gid を明示的にセット
する。これは、全てのリクエストが一人のユーザからになるような
PC/NFS clients
にとって主に有効である。
例えば、
以下の「例」のセクションでの
/home/joe
なるエクスポートエントリを見てほしい。
この例では、(joe
からのものであると思われる)
全てのリクエストが
uid 150 に
マッピングされる。
# sample /etc/exports file
/ master(rw) trusty(rw,no_root_squash)
/projects proj*.local.domain(rw)
/usr *.local.domain(ro) @trusted(rw)
/home/joe pc001(rw,all_squash,anonuid=150,anongid=100)
/pub (ro,insecure,all_squash)
1 行目は、 master と trusty
に対してすべてのファイルシステムの
マウント許可を出している。
書き込みの許可に加え、さらに
trusty
に対しては、すべての
uid squashing
も無効にしている。 2
行目と 3
行目は、ホスト名へのワイルドカードの利用と、ネットグループ
(@trusted のエントリ)
の例である。 4
行目は、上で述べた
PC/NFS
クライアント用エントリの例である。
5 行目は、公開 FTP
ディレクトリを世界中の全てのホストにエクスポートしている。
すべてのリクエストは
nobody
アカウントで実行される。
またこのエントリ中の
insecure
オプションによって、
NFS 用 port
を使わないように実装された
NFS
クライアントからのアクセスも許可している。
/etc/exports