2017年1月12日木曜日

FreeBSDでの/etc/exportsを書くときの注意

FreeBSD11でNFSサーバーの設定をしているときです。以下のような手順で設定をしました。
  1. NFSクライアントに公開するファイルを/etc/exportsに記述
  2. sudo /etc/rc.d/mountd restart
  3. showmount -eで確認
しかしshowmount -eでみると、ファイルシステムが公開されておらず、NFSクライアントからマウントできません。/var/log/messagesファイルでエラーを確認してみると、
mountd[3984]: bad exports list line /proj /home
などが記録されています。/etc/exportsは次のように書いていました。
/proj       -network 192.168.0/24 -maproot=root
/home       -network 192.168.0/24 -maproot=root
なにがだめなのかさっぱりわかりません。検索エンジンで探してみると、以下のWWWページを見つけました。
FreeBSD で NFS (2) 【NFSサーバ設定と /etc/exports 詳解】 
http://www.seichan.org/blog/2014/01/post-320.html
該当する部分を引用します。
複数のディレクトリの共有を行う際にハマりやすいポイントとして,ファイルシステムが同じ所のディレクトリの共有をかける場合,ディレクトリは一行に纏めて記載する必要がある.ということです.
たとえば,今までの例では /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
たしかに、私が公開しようとしていた/projと/homeは同じファイルシステムにありました。そこで、以下のように書き換えるとうまくいきました。
/home /proj       -network 192.168.0/24 -maproot=root