NFS サーバ

NFS (Network File System) は,サーバのディレクトリをネットワーク経由でクライアントに共有する仕組みである. FreeBSD の NFS サーバは nfsd(NFS 要求の処理),mountd(マウント要求の処理), rpcbind(RPC サービスのポート解決)から構成される. なお,かつての portmap は FreeBSD 6 以降 rpcbind に置き換えられている.

NFS サーバ側の設定

/etc/rc.conf

rpcbind_enable="YES"
nfs_server_enable="YES"
mountd_enable="YES"
nfs_server_flags="-u -t -n 4"
nfs_reserved_port_only="YES"
rpc_statd_enable="YES"
rpc_lockd_enable="YES"

nfs_server_flags の「-u -t」は「UDP, TCP の両方で待ち受ける」という意味,「-n 4」は 「nfsd のサーバスレッドを 4 つ」という意味である. nfs_reserved_port_only を「YES」にすると,予約ポート(1024 番未満)からの要求のみを受け付ける. rpc_statd_enable は rpc.statd を,rpc_lockd_enable は rpc.lockd を起動時に実行する設定であり, ファイルロックを使用する場合に必要である.

詳しくは man rc.conf, man nfsd, man mountd を参照.

設定を書き込むには sysrc コマンドを使うこともできる. 管理者権限(root 権限)でコマンドを実行する.

sysrc rpcbind_enable="YES"
sysrc nfs_server_enable="YES"
sysrc mountd_enable="YES"

/etc/exports

共有するファイルシステム,共有先のホスト,オプションを 1 行に記述する. ネットワークアドレス,ネットマスクは環境に合わせて設定する必要がある. 詳しくは man exports を参照.

/export      -network 192.168.1.0 -mask 255.255.255.0

書き込みを許可せず読み取り専用にする場合は -ro を, サブディレクトリをマウント点として許可する場合は -alldirs を指定する.

/export      -alldirs -ro -network 192.168.1.0 -mask 255.255.255.0

NFSv4 を使用する場合は,/etc/rc.conf に nfsv4_server_enable="YES"nfsuserd_enable="YES" を追加し,/etc/exports の末尾に NFSv4 ツリーの起点を示す V4: 行を書く.

V4: /       -network 192.168.1.0 -mask 255.255.255.0

ZFS を使用している場合は,/etc/exports の代わりに ZFS の sharenfs プロパティでも共有を設定できる(man zfs-share).

NFS サーバの起動と設定の反映

管理者権限(root 権限)でコマンドを実行する. nfsd を起動すると mountd も起動する.

service nfsd start

mountd は起動時にのみ /etc/exports を読み込む. /etc/exports を編集した後は,管理者権限(root 権限)で次のコマンドを実行し,設定を読み直させる.

service mountd reload

共有されているファイルシステムの確認は,管理者権限(root 権限)は不要で,次のコマンドで行う.

showmount -e localhost

アクセス制御

NFS へのアクセス制限は,パケットフィルタ(pf, ipfw など)で rpcbind (111/tcp, 111/udp), nfsd (2049/tcp, 2049/udp), mountd への到達を制限する方法が確実である.

TCP Wrapper (/etc/hosts.allow) を併用する場合,FreeBSD の rpcbind は 起動オプション -W を与えたときにのみ libwrap による制御が有効になる. /etc/rc.conf に次を記述する.

rpcbind_flags="-W"

/etc/hosts.allow の記述例を次に示す. FreeBSD では hosts.deny は使用せず,許可・拒否の設定はすべて /etc/hosts.allow に記述する.

ALL : localhost 127.0.0.1 : allow
# Rpcbind is used for all RPC services: protect your NFS!
rpcbind : 192.168.1.0/255.255.255.0 : allow
rpcbind : ALL : deny
ALL : ALL : deny

詳しくは man hosts_access, man hosts_options を参照.

NFS クライアント側の設定

/etc/rc.conf

FreeBSD をクライアントとする場合は次のように設定する. rpcbind は,ファイルロック(rpc.statd, rpc.lockd)を使用する場合にクライアント側でも必要である.

rpcbind_enable="YES"
nfs_client_enable="YES"
rpc_statd_enable="YES"
rpc_lockd_enable="YES"

マウント

管理者権限(root 権限)でコマンドを実行する. 次は,サーバ server の /export を,クライアントの /mnt にマウントする例である.

service nfsclient start
mount server:/export /mnt

起動時に自動でマウントする場合は,/etc/fstab に次の行を追加する.

server:/export	/mnt	nfs	rw	0	0