FreeBSD で NFS(Network File System) サーバ & クライアント

FreeBSD による,NFS の利用覚書き.
めんどいので,5.0-RELEASE 以降を対象としておく.

# が,その前のリリースでも確か上手くいった

どのディレクトリを共有するか - /etc/exports

まず,どのディレクトリを共有したいのかを洗い出す必要があります.
私のマシンのディスク構成は以下の様で,/home 及び /usr/ports を共有しようと思います.

df -h
Filesystem                      Size    Used   Avail Capacity  Mounted on
/dev/ar0s1a                     248M    128M    100M    56%    /
devfs                           1.0K    1.0K      0B   100%    /dev
/dev/ar0s1g                     131G    5.7G    115G     5%    /home
/dev/ar0s1d                     496M     10K    456M     0%    /tmp
/dev/ar0s1e                     7.7G    2.2G    5.0G    30%    /usr
/dev/ar0s1f                     7.7G    326M    6.8G     4%    /var


共有したいディレクトリが決まったら,/etc/exports というファイルを作成します.
このファイルは NFS サーバが利用し,ディスクの共有の際の設定とし動くために必要です.

/usr/ports    -network 127.0.0.1 -maproot=root
/usr/ports    -network 192.168.2 -mask 255.255.255.0 -maproot=root

/home         -network 127.0.0.1 -maproot=root
/home         -network 192.168.2 -mask 255.255.255.0 -maproot=root

この様に準備しますが,簡単に説明したいと思います.
/usr/ports 及び /home は,自分自身( 127.0.0.1 ) 及び,ネットワーク 192.168.2.0/24 に属するコンピュータに共有を許可します.
maproot=root ですが,共有先の root ユーザが NFS で共有されたファイルシステムに書き込む際に root として書き込む事を許可します.
セキュリティ上不安がある場合は,maproot=nobody 等とする事により,NFS サーバで共有している root が所有者のファイルを共有先の root ユーザは書き換える事が出来なくなります.

NFS サーバを起動する

NFS サーバを動作させるには複数のデーモンを起動する必要があります.

mountdリモートの NFS マウント要求に対するサービスを行うデーモン
rpcbindユニバーサルアドレスから RPC プログラム番号へのマッパ
nfsdリモートマシンに対して NFS サービスを行うデーモン


とこの3つのデーモンが必要です.さらに,5.0-RELEASE から実装された NFS ロックを動作させたいならば以下の2つのデーモンが必要です.

rpc.statdホストステータス監視デーモン
rpc.lockdNFS ファイルロックデーモン


これを起動することにより NFS ロックが行えるようになりますが,NFS ロックは期待しないでください.何故ならば複数の OS 間の NFS ロックは正常に動作する保証が無いからです.FreeBSD 同士でも過剰な期待はしない方が良いでしょう.
NFS は共有メールスプール ( /var/mail ) 等で利用すべきではありません.最悪の場合,メールがすべてロストしてしまうでしょう.

さて,上記のデーモンを起動するには,コマンドライン及び,/etc/rc.conf に記述しリブート等の複数の方法がありますが,今回は /etc/rc.conf に記述し,rcNG を利用して起動します.

/etc/rc.conf に以下の記述を行います.# 以降はコメントですので,無くても構いません.

mountd_enable="YES"             # Run mountd (or NO).
nfs_server_enable="YES"         # This host is an NFS server (or NO).
nfs_reserved_port_only="YES"    # Provide NFS only on secure port (or NO).
rpc_lockd_enable="YES"          # Run NFS rpc.lockd needed for client/server.
rpc_statd_enable="YES"          # Run NFS rpc.statd needed for client/server.
rpcbind_enable="YES"            # Run the portmapper service (YES/NO).


この記述により,/etc/rc.d 以下の NFS 関係のスクリプトが動作する様になりました.
早速起動してみましょう.

/etc/rc.d/nfsserver start
/etc/rc.d/rpcbind start
/etc/rc.d/mountd start
/etc/rc.d/nfsd start
/etc/rc.d/nfslocking start


最初の行の /etc/rc.d/nfsserver はカーネルに NFS 関係のオプションが組み込まれていない場合に動作します.デフォルトのカーネルには NFS 関係は含まれていますので実行する必要はありませんが,念のため載せておきました.

これらのスクリプトによって NFS サーバとして動作しているはずです.
デーモンが起動しているか,ps コマンドを使い確認してみましょう.

> ps -ax | grep rpc
 351  ??  Is     0:00.88 /usr/sbin/rpcbind
 438  ??  Ss     0:03.42 /usr/sbin/rpc.statd
 444  ??  Ss     0:08.20 /usr/sbin/rpc.lockd
 447  ??  I      0:08.05 /usr/sbin/rpc.lockd

> ps -ax | grep mountd 
 415  ??  Is     0:00.02 /usr/sbin/mountd -r

> ps -ax | grep nfsd
 424  ??  Is     0:00.03 nfsd: master (nfsd)
 426  ??  I      0:00.01 nfsd: server (nfsd)
 427  ??  S      3:23.22 nfsd: server (nfsd)
 428  ??  I      0:02.61 nfsd: server (nfsd)
 429  ??  I      0:00.65 nfsd: server (nfsd)


とこの様に ps コマンドで表示されれば起動しています.さて,共有ディレクトリとして /etc/exports で指定しましたが,指定した通りに共有出来る状態でしょうか?
これを確認する方法として showmount コマンドがあります.以下の様にタイプする事でどのディレクトリをどのネットワークに許可しているかを確認出来ます.

> showmount -e
Exports list on localhost:
/usr/ports                         127.0.0.1 192.168.2.0
/home                              127.0.0.1 192.168.2.0


上の場合は,/usr/ports,/home が 127.0.0.1 及び 192.168.2/24 に共有可能な状態である事がわかると思います.
また,showmount コマンドを実行しても,共有しようと思っているディレクトリが表示されない場合,/etc/exports ファイルの記述が間違っていると考えられますので,確認して下さい.# /var/log/messages にも,mountd からのメッセージが確認出来るでしょう.

これで簡単ですが,サーバの設定が終わりました.

NFS クライアントを設定する

NFS クライアントになる事は FreeBSD ではとても簡単です.1行 /etc/rc.conf におまじないをする事でサーバの共有ディレクトリをマウント出来る状態になります.
/etc/rc.conf に以下の行を追加して下さい.# 以降はコメントですので,記述は必須ではありません.

nfs_client_enable="YES"         # This host is an NFS client (or NO).


記述が済んだら,/etc/rc.d 以下にある nfsclient というスクリプトを実行します.

/etc/rc.d/nfsclient


nfsclient は,NFS のクライアントになれる様に準備してから nfsiod というプログラムを起動するスクリプトです.スクリプトを実行する事により,nfsiod というプログラムが起動しているはずですので,ps コマンドで確認してみましょう.

ps -ax | grep nfsiod
  56  ??  SL     0:25.12 [nfsiod 0]
  57  ??  IL     0:00.06 [nfsiod 1]
  58  ??  IL     0:00.01 [nfsiod 2]
  59  ??  IL     0:00.01 [nfsiod 3]


この様に nfsiod が起動していたら NFS クライアントになる準備は完了です.後はサーバの共有ディレクトリをマウントするだけです.
ディレクトリのマウントには,mount コマンドを利用します.mount コマンドに -t [option] とオプションを与える事でそのオプションに対応する mount_[option] コマンドへと処理が渡されます.
NFS の場合の -t オプションは nfs ですので mount_nfs が呼び出されます.
サーバの /home を /mnt 以下にマウントする場合は次のようになります.

mount -t nfs server:/home /mnt


または

mount_nfs server:/home /mnt


です.上の2つはどちらも同じ働きをします.
mount コマンドを実行したらサーバの共有ディレクトリがクライアントでマウント出来ている事でしょう.

上手くいかなかったら

もしマウントが上手く出来ない場合は,サーバ側のログ /var/log/messages を見てみましょう.または,tcpdump や ethereal 等でパケットをキャプチャしてみましょう.
たいていの場合,サーバ側の rpcbind が動いていなかったりと単純な問題であるはずです.
FreeBSD には,たくさんのドキュメントがあります.日本語のハンドブック にも NFS について書かれています.また,Q&A にも NFS の項目があります.

それでも上手くいかない場合は,FreeBSD-users-jp ML へ質問してみましょう.
質問する場合,サーバの環境や設定状態,クライアントの環境,設定状態等,客観的にみてわかる材料を提示しましょう.そうする事で問題がより早く解決します.
客観的材料とは,設定ファイル,/var/log/messages の該当部分などです.

トラブルシューティング

FreeBSD-users-jp ML87808: 5.4-Release:NFS の設定変更? より.

/etc/exports で NFS エクスポートを許可するディレクトリには,symlink は使えませんので注意して下さい.
また,同一パーティションにあるディレクトリを複数に渡ってエクスポートする際,以下の様な記述は出来ません.

/usr/src    -network 192.168.2 -mask 255.255.255.0 -maproot=root
/usr/obj    -network 192.168.2 -mask 255.255.255.0 -maproot=root
/usr/ports    -network 192.168.2 -mask 255.255.255.0 -maproot=root


このような共有を行う場合,以下の様に記述する必要があります.

/usr/src /usr/obj /usr/ports   -network 192.168.2 -mask 255.255.255.0 -maproot=root


/etc/exports の記述にミスがあれば,/var/log/messages に mountd[386]: bad exports list line /usr/obj の様なメッセージが出力されます.その際は,/etc/exports の記述を確認して下さい.



Hiroyuki Seino http://www.seichan.org/ http://www.seichan.org/blog/
Today:3 Yesterday:0 All:40056