NFSサーバ及びNFSクライアントの設定方法



●サーバ側の設定(CentOS 8、Rocky 8)

 サーバ(export)側で設定します。
# dnf install nfs-utils
# mkdir -p /export/{test,test2}
# vi /etc/exports
/export/test	*.bigbang.dyndns.org(rw,no_root_squash,no_all_squash,sync)
/export/test2	192.168.1.0/24(rw,all_squash,sync) 192.168.10.0/24(rw,all_squash,sync)

 /export/test ⇒ 共有するディレクトリを指定
 *.bigbang.dyndns.org ⇒ アクセスを受け付けるドメインの範囲
 rw ⇒ 読み書き可
 ro ⇒ 読み取りのみ
 sync ⇒ 遅延書き込み有効
 async ⇒ 非同期書き込みを有効にする
 secure ⇒ 1024番ポートより小さいポートからのリクエストのみ受け付ける (デフォルト)
 insecure ⇒ 1024番ポート以降のポートからのリクエストも受け付ける
 wdelay ⇒ 別の書き込み要求が実行中/発生予定の場合、書き込みを遅らせる (デフォルト)
 no_wdelay ⇒ wdelayを無効にする。async と合わせて設定する
 subtree_check ⇒ サブツリーのチェックを行う。(デフォルト)
          一般的な指針として、多くは読み込みのみでファイル名の変更が
          あまり行われないようなディレクトリをエクスポートする場合は、
          サブツリーチェック有効の方がよいとされる。
 no_subtree_check ⇒ サブツリーのチェックを無効にする。
            一般的な指針として、ホームディレクトリのような細かなファイルが多く、
            変更も多いディレクトリをエクスポートする場合は、 
            サブツリーのチェックを無効にした方がよいとされる
 root_squash ⇒ rootユーザの場合、匿名ユーザにする
 no_root_squash ⇒ root特権有効
 all_squash ⇒ すべてのユーザを、匿名ユーザにする
 no_all_squash ⇒ そのままの権限でアクセスさせる
 anonuid=nn ⇒ nfsサーバのUIDにマッピングさせる(nnはID番号)
 anongid=nn ⇒ nfsサーバのGIDにマッピングさせる(nnはID番号)
 hard, soft, intr ⇒ 
   hard, intr無し - 落ちたサーバにアクセスしに行ったクライアントプログラムは固まります。
            SIGINTなどの割り込みで中断することもできません。
            多くの場合、これはかなり困った状態になります。
   hard, intr有り - 落ちたサーバにアクセスしに行ったクライアントプログラムは固まります。
            しかし、シグナルを送ればクライアントはファイルアクセスをエラーとして処理します。
   soft - 落ちたサーバにクライアントプログラムがアクセスするとエラーが返ります。

# systemctl enable --now rpcbind nfs-server
 FirewallでNFSサービスを許可します。
# firewall-cmd --add-service=nfs --permanent
# firewall-cmd --reload
 /etc/exportsを書き換えた場合は、下記方法によりエクスポートし直すことができます。
# exportfs -ra
# exportfs -v ← エクスポートの確認
 

●サーバ側の設定

 サーバ側で設定します。
# yum -y install nfs-utils
# vi /etc/idmapd.conf
Domain = bigbang.dyndns.org ← コメント解除して自ドメイン名に変更
# mkdir -p /export/{test,test2}
# vi /etc/exports
/export/test	*.bigbang.dyndns.org(rw,no_root_squash,no_all_squash,sync)
/export/test2	192.168.1.0/24(rw,all_squash,sync) 192.168.10.0/24(rw,all_squash,sync)

 /export/test ⇒ 共有するディレクトリを指定
 *.bigbang.dyndns.org ⇒ アクセスを受け付けるドメインの範囲
 rw ⇒ 読み書き可
 ro ⇒ 読み取りのみ
 sync ⇒ 遅延書き込み有効
 async ⇒ 非同期書き込みを有効にする
 secure ⇒ 1024番ポートより小さいポートからのリクエストのみ受け付ける (デフォルト)
 insecure ⇒ 1024番ポート以降のポートからのリクエストも受け付ける
 wdelay ⇒ 別の書き込み要求が実行中/発生予定の場合、書き込みを遅らせる (デフォルト)
 no_wdelay ⇒ wdelayを無効にする。async と合わせて設定する
 subtree_check ⇒ サブツリーのチェックを行う。(デフォルト)
          一般的な指針として、多くは読み込みのみでファイル名の変更が
          あまり行われないようなディレクトリをエクスポートする場合は、
          サブツリーチェック有効の方がよいとされる。
 no_subtree_check ⇒ サブツリーのチェックを無効にする。
            一般的な指針として、ホームディレクトリのような細かなファイルが多く、
            変更も多いディレクトリをエクスポートする場合は、 
            サブツリーのチェックを無効にした方がよいとされる
 root_squash ⇒ rootユーザの場合、匿名ユーザにする
 no_root_squash ⇒ root特権有効
 all_squash ⇒ すべてのユーザを、匿名ユーザにする
 no_all_squash ⇒ そのままの権限でアクセスさせる
 anonuid=nn ⇒ nfsサーバのUIDにマッピングさせる(nnはID番号)
 anongid=nn ⇒ nfsサーバのGIDにマッピングさせる(nnはID番号)
 hard, soft, intr ⇒ 
   hard, intr無し - 落ちたサーバにアクセスしに行ったクライアントプログラムは固まります。
            SIGINTなどの割り込みで中断することもできません。
            多くの場合、これはかなり困った状態になります。
   hard, intr有り - 落ちたサーバにアクセスしに行ったクライアントプログラムは固まります。
            しかし、シグナルを送ればクライアントはファイルアクセスをエラーとして処理します。
   soft - 落ちたサーバにクライアントプログラムがアクセスするとエラーが返ります。

# systemctl start rpcbind.service
# systemctl start nfs-server.service
# systemctl start nfs-lock.service
# systemctl start nfs-idmap.service
# systemctl enable rpcbind.service
# systemctl enable nfs-server.service
# systemctl enable nfs-lock.service
# systemctl enable nfs-idmap.service
CentOS 6の場合は下記の通り
# service rpcbind start
# service nfs start
# chkconfig rpcbind on
# chkconfig nfs on
 必要に応じて、rpcbind(ポート番号:111)、nfs(ポート番号:2049)の/etc/hosts.allow及びiptablesを設定します。
# /etc/hosts.allow

nfs : 127.0.0.1, 192.168.0.0/255.255.255.0
rpcbind : 127.0.0.1 192.168.0.0/255.255.255.0

エクスポートするフォルダの所有者及びグループに「nfsanonymous」を割り当てたとして、
「rw (読書き可)」にも拘わらずクライアントから書込できない場合は、
nfsサーバ側の「nfsanonymous」UID:GIDを指定します。
「nfsanonymous」のUIDの確認方法
# cat /etc/passwd | grep nfsanonymous
nfsanonymous:x:5963:5963:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
「nfsanonymous」のGIDの確認方法
# cat /etc/group | grep nfsanonymous
nfsanonymous:x:5963:
 /etc/exportsを書き換えた場合は、下記方法によりエクスポートし直すことができます。
# exportfs -ra
# exportfs -v ← エクスポートの確認

●クライアント側の設定

 クライアント側で設定します。
# yum -y install nfs-utils
# vi /etc/idmapd.conf
Domain = bigbang.dyndns.org ← コメント解除して自ドメイン名に変更
# systemctl start rpcbind.service ← 設定する必要はなかった
# systemctl start nfs-server.service ← 設定する必要はなかった
# systemctl start nfs-lock.service ← 設定する必要はなかった
# systemctl start nfs-idmap.service ← 設定する必要はなかった
# systemctl enable rpcbind.service ← 設定する必要はなかった
# systemctl enable nfs-server.service ← 設定する必要はなかった
# systemctl enable nfs-lock.service ← 設定する必要はなかった
# systemctl enable nfs-idmap.service ← 設定する必要はなかった
CentOS 6の場合は下記の通り
# service rpcbind start
# service nfs start
# chkconfig rpcbind on
# chkconfig nfs on
CentOS 7の場合は下記の通り
# systemctl start rpcbind
# systemctl start nfs-server
# systemctl enable rpcbind
# systemctl enable nfs-server
 必要に応じて、rpcbind(ポート番号:111)、nfs(ポート番号:2049)の/etc/hosts.allow及びiptablesを設定します。  マウントは下記のようにします。
# mkdir -p /mnt/test
必要に応じて上記ディレクトリの所有者、アクセス権等を変更する
# mount -t nfs nfsserver.bigbang.dyndns.org:/export/test /mnt/test
 クライアント側が再起動しても自動的にマウントするように設定します。
# vi /etc/fstab
/dev/mapper/fedora-root /                       ext4    defaults        1 1
UUID=8e6d1b62-699a-4581-98c9-13306676456c /boot         ext4    defaults        1 2
/dev/mapper/fedora-home /home                   ext4    defaults        1 2
/dev/mapper/fedora-swap swap                    swap    defaults        0 0
nfsserver.bigbang.dyndns.org:/export/test /mnt/test nfs defaults 0 0 ← 追記
 いちいちシステムを再起動してマウントされるかどうか確認するのは面倒なので、下記コマンドを実行します。
# mount -a
# df -ah
 マウントされていれば設定完了です。

●起動時に自動マウントできない

 CentOS 7で起動時に下記のようなエラーが記録され、自動マウントできない現象が発生しています。ログイン後、mount -aを実行すれば問題なくマウントできます。
Jan 28 10:46:56 server mount: mount.nfs: mount system call failed
Jan 28 10:46:56 server mount: mount.nfs: mount system call failed
Jan 28 10:46:56 server systemd: mnt-test_html.mount mount process exited, code=exited status=32
Jan 28 10:46:56 server systemd: Failed to mount /mnt/test_html.
Jan 28 10:46:56 server systemd: Dependency failed for Remote File Systems.
Jan 28 10:46:56 server systemd: Job remote-fs.target/start failed with result 'dependency'.
Jan 28 10:46:56 server systemd: Unit mnt-test_html.mount entered failed state.
Jan 28 10:46:56 server systemd: mnt-test_cgi\x2dbin.mount mount process exited, code=exited status=32
Jan 28 10:46:56 server systemd: Failed to mount /mnt/test_cgi-bin.
Jan 28 10:46:56 server systemd: Unit mnt-test_cgi\x2dbin.mount entered failed state.
 設定を下記のように変更したところ、起動時にマウントされるようになりました。
# vi /etc/fstab
nfsserver.bigbang.dyndns.org:/export/test /mnt/test nfs defaults 0 0 ← 追記
 ↓
192.168.0.1:/export/test /mnt/test nfs defaults 0 0
 CentOS 7とFedora 22とではマウントしようとする時点でのDNSによる名前解決ができる・できないの違いがあるようです。
 /var/log/messagesを確認したところ、CentOS 7とFedora 22ではresolv.confを読み込むタイミングが同様でした。
※CentOS 7の/var/log/messagesの抜粋
Jan 29 13:57:03 neko systemd: Mounted /mnt/nezumi_html.
Jan 29 13:57:03 neko systemd: Mounted /mnt/nezumi_cgi-bin.
Jan 29 13:57:06 neko dnsmasq[4196]: reading /etc/resolv.conf
※Fedora 22の/var/log/messagesの抜粋
Jan 28 10:00:29 mercury systemd: Mounted /mnt/nezumi_html.
Jan 28 10:00:29 mercury systemd: Mounted /mnt/nezumi_cgi-bin.
Jan 28 10:01:30 mercury dnsmasq[2320]: reading /etc/resolv.conf


●NFSのアクセス状況を調べる

 参考URL:nfsiostat で NFS の I/O レイテンシや IOPS を調べる

 上記ページを参考に確認してみました。
$ nfsiostat 1
※表示結果の各項目の幅は調整しています。
hoge.localdomain:/var/www/html mounted on /mnt/html:
   op/s		rpc bklog
   0.00		0.00
read:  	ops/s	kB/s	kB/op	retrans		avg RTT (ms)	avg exe (ms)
	0.000	0.000	0.000	0 (0.0%)	0.000		0.000
write:	ops/s	kB/s	kB/op	retrans		avg RTT (ms)	avg exe (ms)
	0.000	0.000	0.000	0 (0.0%)	0.000		0.000
 man nfsiostatによると結果の各項目の意味は下記の通りです。
The meaning of each column of nfsiostat's output is the following:
	- op/s
	        1秒あたりのオペレーション数。
	- rpc bklog
		バックログキューの長さ。
	- kB/s
		1秒あたりに読み書きされるキロバイト数。
	- kB/op
		各オペレーションで読み書きされるキロバイト数。
	- retrans
		再送信の数。
	- avg RTT (ms)
		クライアントのカーネルがRPC要求を送信してから、応答を受け取るまでの間隔。
	- avg exe (ms)
		NFSクライアントがそのカーネルにRPC要求を行い、RPC要求が完了するまでの間隔。
		これには、上述のRTT時間が含まれます。


●mount.nfs: access denied by server while mounting

 マウントすると下記のようなエラーが表示されマウントできないこと(ルーターのWAN側にNFSサーバがある場合)があります。
# mount -a
mount.nfs: access denied by server while mounting serverA.bigbang.mydns.jp:/var/www/html
 1024番ポートより上の通信を許可するために、insecureオプションをつけます。
# vi /etc/exports
/var/www/html 192.168.200.0/16(rw,insecure,no_root_squash,no_all_squash,sync)

# exportfs -rav