FreeBSD で NFS – (NFSサーバ設定と /etc/exports 詳解①)

NFS

FreeBSD の NFS について以前 Pukiwiki の「FreeBSD で NFS(Network File System) サーバ & クライアント」に纏めていましたが,当時 5.0 RELEASE の頃に纏めてましたのでだいぶ状況が変わってしまいました.
ですので今のバージョン 9.2-RELEASE をターゲットに改めて解説します.

今回は NFS サーバーまわりの設定について解説します.

NFS サーバ側設定

NFS サーバ側では,NFSサービスを提供するデーモンや共有領域の設定を行います.

デーモン

NFS サーバ側で必要なデーモンは「FreeBSD で NFS – (NFSの概要 / NFS とは)」で説明した nfsd,mountd,rpcbind,rpc.lockd,rpc.statd です.
これらがシステム再起動後も自動的に起動するように,次のように /etc/rc.conf に記述します.

nfs_server_enable="YES"
mountd_enable="YES"
rpc_lockd_enable="YES"
rpc_statd_enable="YES"
rpcbind_enable="YES"

一度 NFS サービスを起動できるか確認するために,mountd が要求するファイルである「/etc/exports」を touch コマンドで空ファイルとして作成しておきます.

# touch /etc/exports

NFS サーバデーモンの起動

/etc/rc.conf ファイル記載後,サーバを再起動せずに NFS サービスを起動するにはコマンドを実行します.
デーモン起動の順番は rpcbind,mountd,nfsd,rpc.lockd,rpc.statd の順番となります.
これは /etc/rc.d 以下の各制御スクリプトの REQUIRE 行を見ればわかります.それぞれのファイルを見て理解するのが一番良いと思いますが,FreeBSD 8.0 より service コマンドが利用可能で,このコマンドを使って実行順序を確認する事ができます.

service コマンドで実行順序の確認を行うと次のようにスクリプトのパスが表示されます.

# service -e
/etc/rc.d/hostid
/etc/rc.d/hostid_save
/etc/rc.d/cleanvar
/etc/rc.d/ip6addrctl
/etc/rc.d/devd
/etc/rc.d/newsyslog
/etc/rc.d/syslogd
/etc/rc.d/rpcbind
/etc/rc.d/virecover
/etc/rc.d/dmesg
/etc/rc.d/mountd
/etc/rc.d/nfsd
/etc/rc.d/statd
/etc/rc.d/lockd
/etc/rc.d/motd
/etc/rc.d/sshd
/etc/rc.d/sendmail
/etc/rc.d/cron
/etc/rc.d/mixer
/etc/rc.d/gptboot
/etc/rc.d/bgfsck

デーモンの起動順序が確認できたところで実際に実行してみます.

# /etc/rc.d/rpcbind start
Starting rpcbind.
# /etc/rc.d/mountd start
Starting mountd.
# /etc/rc.d/nfsd start
NFSv4 is disabled
Starting nfsd.
# /etc/rc.d/statd start
Starting statd.
# /etc/rc.d/lockd start
Starting lockd.

デーモンが起動したら,NFS サーバーの起動は完了です.ただし,まだ共有を提供していないため,共有するディレクトリとNFSクライアントを設定する必要があります.

NFS サーバの共有設定

NFS サーバーのほとんどの設定は共有設定に関係します.書式とルールを理解しないと,不必要なネットワークに共有される可能性があるため,セキュリティ上のリスクがあります.注意して設定しましょう.

基本の共有

一旦共有を設定し,クライアントがマウントできるかどうかを確認しましょう.任意のディレクトリを共有できますが,この例では /usr を共有します.これは、FreeBSDで各種サーバを構築する際に、/usr/src や /usr/obj、/usr/ports をNFSで共有することで環境の統一が容易になるためです.
もちろん,共有したい領域があれば適宜読み替えてください.

/etc/exports ファイルに次のような行を追加します.ネットワークとサブネットマスクは環境に合わせて適切に読み替えてください.

/usr    -network 192.168.241.0 -mask 255.255.255.0

/etc/exports を作成した後,mountd を再読み込みすることで /etc/exports の内容を適用させます.これにより,mountd が正しく動作します.正常に読み直されているかは showmount コマンドで確認できます.
showmount コマンドで正常に表示されない場合,記述ミスが考えられますので /var/log/messages を確認してください.

# /etc/rc.d/mountd reload

# showmount -e
Exports list on localhost:
/usr                               192.168.241.0

NFS クライアントからマウント

NFS クライアントから共有をマウントしてみましょう.NFS サーバの /usr をそのまま NFS クライアントの /usr にマウントすることはできないので,代わりに /mnt にマウントします.mount コマンドを実行し,エラーが出ていなければマウントは成功しています.
その後,mount コマンドや df コマンドを使用して確認してみましょう.

# mount -t nfs nfsserver:/usr /mnt
# mount
/dev/da0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
nfsserver:/usr on /mnt (nfs)

ここまでの基本動作確認が出来たら umount で一度マウントを解除してください.

# umount /mnt

/etc/exports 詳解

NFS サーバーの設定は重要です.この段階でのミスはトラブルのもとです.
以下では,シチュエーションごとに具体的な設定方法を説明します.

複数のネットワークに対する共有

複数のネットワークに対して共有を行う場合は,次のようにします.それぞれの宛先に対して行を分けることがポイントです.
例えば,192.168.241/24 と 10.192.168/24 の両方に対して /usr を公開する場合はこのようになります.

/usr    -network 192.168.241.0 -mask 255.255.255.0
/usr    -network 10.192.168.0 -mask 255.255.255.0

CIDR 形式で記載することも可能です.ただし,混在させると混乱の原因になりますので,統一した形式で記述することをお勧めします.

/usr    -network 192.168.241.0 -mask 255.255.255.0
/usr    -network 10.192.168/24

特定のホストに対する共有

ネットワーク単位ではなく,特定のホストに対してのみ共有したい場合は次のように記述します.
上の行は特定のIPアドレスに対して,下の行は特定のホスト名に対しての共有です.

/usr    192.168.241.100
/usr    client1.seichan.org

ホスト名での指定は,最終的には逆引きされた IP アドレスになりますのでこの点は注意してください.
DNS もしくは /etc/hosts に正しくエントリーがある場合にのみ作用します.名前とIPアドレスの解決ができない状態で「mountd reload」を行うと,/var/log/messages には次のようにエラーが表示されます.

mountd[1934]: bad exports list line /usr  client1.seichan.org

複数のディレクトリの共有

複数のディレクトリーを共有する場合は次のようになります.共有するディレクトリーと,共有したい相手のリストを必要分記載します.
この場合,192.168.241.0/24 にいる NFS クライアントは /usr と /pub を,10.192.168.0/24 にいるクライアントは /usr のみマウントできます.

/usr    -network 192.168.241.0 -mask 255.255.255.0
/usr    -network 10.192.168.0 -mask 255.255.255.0
/pub    -network 192.168.241.0 -mask 255.255.255.0

ファイルシステム内の細かい共有

複数のディレクトリの共有を行う際にハマりやすいポイントとして,ファイルシステムが同じ場所のディレクトリの共有を設定する際には,ディレクトリを一行にまとめて記述する必要があります.
たとえば,先ほどの例では /usr という大きなディレクトリを共有していますが,/usr/src,/usr/obj,/usr/ports のみを共有したいとします.そのような場合次のような記述ではエラーが発生します.

/usr/src  -network 192.168.241.0 -mask 255.255.255.0
/usr/obj  -network 192.168.241.0 -mask 255.255.255.0

次のように「bad exports list」というエラーが記録され,showmount の結果では先に記載した設定のみが反映されています.

# tail /var/log/messages
mountd[1934]: can't change attributes for /usr/obj: Invalid radix node head, rn: 0 0xfffffe0002ec4800
mountd[1934]: bad exports list line /usr/obj    -ro -network 192.168.241.0 -mask 255.255.255.0

# showmount -e
Exports list on localhost:
/usr/src                           192.168.241.0

これを正しい状態にするには,次のように一行に記載します.

/usr/src /usr/obj  -network 192.168.241.0 -mask 255.255.255.0

長くなってしまいましたので,exports 詳解は次回に引き続きます.

コメント

タイトルとURLをコピーしました