exports - ファイルのフォーマットと規約の説明 - Linux コマンド集 一覧表
名前
exports - エクスポート (export) される NFS ファイルシステム
書式
/etc/exports
説明
/etc/exports ファイルはファイルシステムのアクセスコントロールリストで、 どのファイルシステムを NFS クライアントにエクスポート (export) してよいか、 という情報を与える。 これは NFS mount デーモン mountd (8) ならびに NFS file server デーモン nfsd (8) の双方で用いられる。
このファイルの書式は SunOS の exports ファイルとほぼ同じである。ただし指定できるオプションが いくつか追加されている。 それぞれの行には、マウントポイントと、 そのポイントのファイルシステムをマウントできる マシンやネットグループのリストが書かれている。 マウントパラメータのリストを括弧でくくったものを、 それぞれのマシンの名前の後に置くこともできる。 空行は無視され、# 以降行末まではコメントとみなされる。 行末にバックスラッシュをおけば、エントリは次の行に継続できる。
マシン名のフォーマット
NFS クライアントはいろいろな方法で指定できる。
これはもっとも普通のフォーマットである。ホストの指定には、
レゾルバが認識できる省略形、FQDN、IP アドレスのどれを用いてもよい。
NIS のネットグループを
@group
のように与えることができる。ネットグループのすべてのメンバーのうち、
ホストの部分だけが取り出され、アクセスリストに追加される。
ホストの部分が空だったり、単一のダッシュ (-) だったものは無視される。
マシン名の指定には、ワイルドカード文字として
*
と ?
を用いることができる。
これらを使うと exports
ファイルをコンパクトにできる。
例えば *.cs.foo.edu
はドメイン cs.foo.edu
にある
すべてのホストにマッチする。
ただし、これらのワイルドカード文字はドメイン名のドット (.) にはマッチしない。
したがって上記のパターンは、ドメイン内の
a.b.cs.foo.edu
のようなホストにはマッチしない。
ディレクトリを IP の (サブ) ネットワークに存在するすべてのホストに
同時にエクスポートすることもできる。
これには IP アドレスとネットマスクのペアを
address/netmask
のように指定すればよい。
- =public
-
これは特殊な意味を持つ「ホスト名」で、その前に与えられたディレクトリ
が public root ディレクトリであることを示す
(WebNFS と public root ハンドルの詳細に関しては
nfsd
(8) の WebNFS のセクションを参照のこと)。
この書式を用いる際には、
=public
がその行での唯一のホスト名エントリでなければならない。
またエクスポートオプションを指定してはならない。
この指定によって、
ディレクトリが実際にエクスポートされるわけではない
ことに注意すること。
エクスポートオプションは、これとは別のエントリで指定する必要がある。
public root パスは nfsd を --public-root オプションを指定して起動することによっても指定できる。 public root の複数指定は無視される。
一般的なオプション
mountd と nfsd は以下のエクスポートオプションを受け付ける。
- secure d このオプションを指定すると、IPPORT_RESERVED (1024) より小さな internet ポートから発したリクエストしか受けつけない。 このオプションはデフォルトで有効になっている。 無効にするには .IR insecure と指定する。 .TP .IR rw クライアントによるファイルとディレクトリの変更を許可する。 デフォルトでは、クライアントは読み込みのリクエストだけに制限されている。 (これは .I ro オプションで明示した場合も同じ)。 .TP .I noaccess このオプションを付けたクライアントは、 そのディレクトリ以下のすべてのファイルに対してアクセスできなくなる。 あるディレクトリ階層をクライアントにエクスポートするとき、 特定のサブディレクトリを除きたい場合などに便利である。 noaccess フラグが付いたディレクトリのクライアントからの見え方は、 非常に制限されたものとなる。 ディレクトリ属性と、`.' および `..' の閲覧だけが許される。 readdir に対して返されるエントリもこの 2 つだけになる。 .TP .IR link_relative 絶対パス形式のシンボリックリンクを相対パス形式のリンクに変換する (絶対パス形式とは、リンクの内容が /" で始まるものである)。
- 変換は次のように行われる。 まずリンクが置かれているディレクトリの、サーバのルートからの 深さを取得する。そしてその数だけ '../' を絶対リンクの前に付加する。 マウントポイントのルートからの位置が異なる場合、 この変換には微妙な (おそらく障害の原因となる) あいまいさが含まれる可能性がある。
- link_absolute
- 全てのシンボリックリンクをそのままにする。これがデフォルトである。
ユーザ ID のマッピング
サーバマシン上のファイルに対する nfsd によるアクセスコントロールは、 それぞれの NFS RPC request の際に与えられる uid と gid に基づいている。 ユーザは通常、サーバ上にある自分のファイルには、 それが普通のファイルシステム上にあるのと同様に アクセス可能であることを期待している。 これにはクライアントとサーバ上で用いられる uid と gid がそれぞれ同じである必要があるが、 これは常に真であるとは限らず、望ましいとも限らない。
クライアントマシンの root が NFS サーバのファイルにアクセスするとき、 サーバの root として扱われてしまうのは、ほとんどの場合は望ましくない。 このため uid 0 は普通は別の id (anonymous や nobody uid) にマッピングされる。 この動作は `root squashing' と呼ばれるが、これがデフォルトである。 no_root_squash を使えばオフにできる。
デフォルトでは、 nfsd は起動時に password ファイル中の nobody ユーザを参照して、 anonymous の uid と gid を得ようとする。 もしそれが見つからない場合には、 uid と gid として -2 (つまり 65534) を用いる。 これらの数値は anonuid と anongid オプションによって変更できる。
これに加え、 nfsd によって nobody に割り当てるべき適当な uid と gid とを指定することもできる。 最後に、 all_squash オプションを指定すれば、 全ての user request を anonymous uid に割り当てることもできる。
マシンごとに uid が異なるような場合への導入を容易にするため、 nfsd ではサーバの uid をクライアントの uid に (あるいはその逆に) 動的にマッピングする手法をいくつか提供している。 静的なマッピングファイル、NIS ベースのマッピング、 ugidd ベースのマッピング、である。
ugidd ベースのマッピングは map_daemon オプションを指定して UGID RPC プロトコルを使えば可能となる。 このプロトコルを動かすにはクライアントで ugidd (8)mapping デーモンを動作させる必要がある。 これは 3 つある方法の中で、セキュリティ的には最悪である。 なぜなら ugidd を動作させると、誰でもクライアントに問い合わせて、 有効なユーザ名のリストを入手できてしまうからである。 ugidd へのアクセスを特定のホストのみに制限して、身を守ることもできる。 これには許可するホストのリストを hosts.allow または hosts.deny ファイルに記述すればよい。サービス名は ugidd である。これらのファイルの文法については、 hosts_access (5)を参照してほしい。
静的なマッピングは map_static オプションによって動作させることができる。 このオプションは、マッピングを記述したファイルの名前を引数にとる。 NIS ベースのマッピングは、クライアントの NIS サーバに問い合わせて、 サーバーホストでのユーザ名およびグループ名から クライアントでのユーザ名およびグループ名への、 マッピング情報を入手する。
以下にマッピングオプションの完全なリストをあげる:
- root_squash
- uid/gid が 0 のリクエストを annonymous uid/gid にマッピングする。 このオプションは、root 以外の uid には適用されない。 他にも注意すべき uid は存在する (例えば bin など) ので、注意する必要がある。
- no_root_squash
- root squashing を無効にする。 このオプションは主にディスクレスクライアントにとって便利である。
- squash_uids and squash_gids
-
このオプションは、annonymous にマッピングされる
uid や gid のリストを明示するためのものである。
id のリストとしては以下のような指定が有効である:
squash_uids=0-15,20,25-50
通常の squash リストはもっとずっと簡単なものになるだろうが。 - all_squash
- 全ての uid とgid を anonymous にマッピングする。 これは NFS エクスポートされた公開 FTP ディレクトリや、 news のスプールディレクトリ等に便利である。 これと逆のオプションは no_all_squash であり、こちらがデフォルトになっている。
- map_daemon
- このオプションは 動的な uid/gid のマッピングを有効にする。 NFS request 中のそれぞれの uid はサーバ上の対応する uid に変換され、 NFS reply 中の uid はそれぞれ逆に変換される。 このオプションを用いるには、クライアントホストで rpc.ugidd (8) が動作していることが必要である。 デフォルトでは、全ての uid を変えない map_identity となっている。 普通の squash オプションは、 動的なマッピングか否かを気にすることなく適用できる。
- map_static
-
このオプションを指定すると静的なマッピングが可能となる。
uid/gid マッピングが記述されたファイル名を以下のように指定する。
map_static=/etc/nfs/foobar.map
ファイルのフォーマットは以下のようなものである。# Mapping for client foobar: # remote local uid 0-99 - # squash these uid 100-500 1000 # map 100-500 to 1000-1400 gid 0-49 - # squash these gid 50-100 700 # map 50-100 to 700-750
- map_nis
-
このオプションを指定すると NIS ベースの uid/gid マッピングが可能となる。
例えば、サーバが uid 123 の指定を受けると、
サーバはまずその uid に対応するローカルのログイン名を調べる。
次に NFS クライアントの NIS サーバに接続して、
そのログイン名に対応する uid を取得する。
これを行うには、NFS サーバがクライアントの NIS ドメインを 知っていなければならない。 このドメインは map_nis オプションの引数として以下のように指定する。
map_nis=foo.com
ただここに NIS ドメインを記述するだけでは、通常は充分ではない。 nfsd が NIS サーバにコンタクトできるようにするには、 他の作業が必要となるだろう。 利用しているディストリビューションが NYS ライブラリを使っている場合は、 クライアントのドメインのサーバを /etc/yp.conf に一つ以上指定する必要があるだろう。 他の NIS ライブラリを用いている場合には、 yp.conf によって設定できるような、特殊な ypbind (8)を入手する必要があるかもしれない。 - 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) /pub/private (noaccess)
1 行目は、master と trusty に対して、 すべてのファイルシステムのマウント許可を出している。 書き込みの許可に加え、さらに trusty に対しては、 すべての uid squashing も無効にしている。 2 行目と 3 行目は、ホスト名へのワイルドカードの利用と、 ネットグループ (@trusted' のエントリ) の例である。 4 行目は、上で述べた PC/NFS クライアント用エントリの例である。 5 行目は、公開 FTP ディレクトリを世界中の全てのホストにエクスポートしている。 すべてのリクエストは nobody アカウントで実行される。 またこのエントリ中の insecure オプションによって、NFS 用 port を使わないように実装された NFS クライアントからのアクセスも許可している。 最後の行では、private ディレクトリへのアクセスをすべての クライアントに対して拒否するようにしている。
警告
他の NFS Server の実装と違い、 この nfsd では、例えば /usr と /usr/X11R6 のように、あるディレクトリとそのサブディレクトリとの両方を 同じホストにエクスポートすることができる。 この場合、特定の度合がもっとも高いエントリのマウントオプションが適用される。 例えばクライアントホスト上のユーザが /usr/X11R6 のファイルにアクセスする場合は、 /usr/X11R6 のエントリであたえられた マウントオプションが適用される。 このルールは、エントリのホスト指定が ワイルドカードやネットグループのときにも適用される。
ファイル
/etc/exports
返り値
nfsd (8) か mountd (8) が起動していれば、 ファイルの解釈中のエラーは常に syslogd (8) を用いて報告される。 DAEMON からの NOTICE レベルとなる。 そのとき、未知のホスト全てが報告される。 しかし起動時には named (8) が全てのホストを知らない場合もありうる。 したがってホストが見つかるたびに、それらは syslogd (8) に、同じパラメータで報告される。
関連項目
mountd(8), nfsd(8)