Seichan です.こんばんわ.あけましておめでとうございます.
前回「FreeBSD で NFS (1)」で書いたとおり,NFSサーバまわりの設定について.
以前 FreeBSD 5.0-RELEASE あたりで Pukiwiki の「FreeBSD で NFS(Network File System) サーバ & クライアント」に纏めていましたが,時代も変わってきてますので再まとめしています.よろしければ Pukiwiki 側もご覧ください.
NFS サーバ側設定
NFS サーバ側では,NFS サービスを提供するデーモンや,共有領域の設定を行います.
デーモン
NFS サーバ側で動作させることが必要なデーモンは「FreeBSD で NFS (1)」にて説明したとおり,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/mountd を次のとおり,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 -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 を再読み込み(reload) する事で,exports の内容を読み直して mountd が動作します.正常に読み直されているかは showmount コマンドで確認することが出来ます.
showmount コマンドで確認しても正常に表示されない場合,記載ミスが考えられますので /var/log/messaeges にどう出ているのかを確認しましょう.
# /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 クライアントからマウントするところまで確認が出来たら,実際に 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 を行うと 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 詳解は次回に引き続きます.
コメント