Raspberry Pi4 NFSが繋がらない時の確認ポイント

## 前文
毎回トラブルが発生する度に、どのコマンドで何を確認するんだっけ？ と右往左往するので備忘録として手順を残す。

## 動作確認環境
- NFSサーバ
Raspberry Pi2B
```shell
pi@raspberrypi2:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.13 (stretch)
Release:        9.13
Codename:       stretch
pi@raspberrypi2:~ $ uname -a
Linux raspberrypi2 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l GNU/Linux
pi@raspberrypi2:~ $
```
NFS共有ディレクトリ（USB-HDD）。
```shell
pi@raspberrypi2:~ $ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
                  （中略）
/dev/sdc2        7.3T  5.5T  1.9T   75% /media/pi/****03
/dev/sdb2        7.3T  3.3T  4.1T   45% /media/pi/****02
/dev/sda2        7.3T  2.1T  5.3T   29% /media/pi/****01
/dev/sdd2        7.3T  2.9T  4.5T   39% /media/pi/****04
pi@raspberrypi2:~ $
```

- NFSクライアント
Raspberry Pi4B
```shell
pi@raspberrypi4:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye
pi@raspberrypi4:~ $ uname -a
Linux raspberrypi4 5.10.92-v8+ #1514 SMP PREEMPT Mon Jan 17 17:39:38 GMT 2022 aarch64 GNU/Linux
pi@raspberrypi4:~ $
```
マウントポイント。
```shell
pi@raspberrypi4:~ $ df -h
ファイルシス                    サイズ  使用  残り 使用% マウント位置
                  （中略）
192.168.11.101:/media/pi/****01   7.3T  2.1T  5.3T   29% /mnt/nfs/****01
192.168.11.101:/media/pi/****02   7.3T  3.3T  4.1T   45% /mnt/nfs/****02
192.168.11.101:/media/pi/****03   7.3T  5.5T  1.9T   75% /mnt/nfs/****03
192.168.11.101:/media/pi/****04   7.3T  2.9T  4.5T   39% /mnt/nfs/****04
pi@raspberrypi4:~ $
```
Raspberry Pi2b に USB-HDD を接続し NFS で共有、NAS化。それを他の Pi から NFS接続している。

## サーバ側確認ポイント

### 1. サービス確認
`sudo systemctl status nfs-kernel-server`でサービスの状態を確認。正常なら以下。
```shell
pi@raspberrypi2:~ $ sudo systemctl status nfs-kernel-server
● nfs-server.service - NFS server and services
   Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; vendor preset: enabled)
   Active: active (exited) since Sun 2022-02-27 09:19:13 JST; 36min ago
  Process: 10097 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
  Process: 10094 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
  Process: 10091 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
  Process: 10115 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 10112 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 10115 (code=exited, status=0/SUCCESS)

 2月 27 09:19:13 raspberrypi2 systemd[1]: Starting NFS server and services...
 2月 27 09:19:13 raspberrypi2 systemd[1]: Started NFS server and services.
pi@raspberrypi2:~ $
```
停止している場合は、`sudo systemctl start nfs-kernel-server`で開始、エラーが発生している場合は`sudo systemctl restart nfs-kernel-server`でサービス再起動。
再度状態確認。改善されない場合は Pi を再起動。それでも改善されない場合は以下の設定確認。

### 2. エクスポート確認
`sudo exportfs`または`showmount -e`でエクスポートの確認。正常なら以下。
```shell
pi@raspberrypi2:~ $ sudo exportfs
/media/pi/****01
                192.168.11.0/24
/media/pi/****02
                192.168.11.0/24
/media/pi/****03
                192.168.11.0/24
/media/pi/****04
                192.168.11.0/24
pi@raspberrypi2:~ $
```
```shell
pi@raspberrypi2:~ $ showmount -e
Export list for raspberrypi2:
/media/pi/****04 192.168.11.0/24
/media/pi/****03 192.168.11.0/24
/media/pi/****02 192.168.11.0/24
/media/pi/****01 192.168.11.0/24
pi@raspberrypi2:~ $
```
`showmount -a`なら接続しているクライアントも表示。
```shell
pi@raspberrypi2:~ $ showmount -a
All mount points on raspberrypi2:
192.168.11.110:/media/pi/****05
192.168.11.110:/media/pi/****03
192.168.11.110:/media/pi/****04
192.168.11.113:/media/pi/****05
192.168.11.113:/media/pi/****01
192.168.11.113:/media/pi/****02
192.168.11.113:/media/pi/****03
192.168.11.113:/media/pi/****04
192.168.11.116:/media/pi/****05
192.168.11.116:/media/pi/****01
192.168.11.116:/media/pi/****03
192.168.11.116:/media/pi/****04
192.168.11.9:/media/pi/****05
192.168.11.9:/media/pi/****03
pi@raspberrypi2:~ $
```
あれれ？ 過去に接続したクライアントや過去に共有していたディレクトリの情報まで表示されている。
ゴミが残ることがあるらしい。気持ち悪い。これってどこかに情報が記録されているってことだよね。どこだろう。ぐぐっても中々情報が見つからなかったが、やっと以下に辿り着いた。

[showmountで過去にマウントされた情報が残る](https://kaworu.jpn.org/kaworu/2007-11-24-1.php "showmountで過去にマウントされた情報が残る")

ふむふむ。`/var/lib/nfs/rmtab`を確認。確かにこれだね。
```shell
pi@raspberrypi2:~ $ cat /var/lib/nfs/rmtab
192.168.11.116:/media/pi/****01:0x0000000d
192.168.11.116:/media/pi/****05:0x00000015
192.168.11.9:/media/pi/****05:0x00000001
192.168.11.9:/media/pi/****03:0x00000029
192.168.11.110:/media/pi/****03:0x00000003
192.168.11.110:/media/pi/****05:0x00000001
192.168.11.113:/media/pi/****05:0x00000001
192.168.11.113:/media/pi/****03:0x00000007
192.168.11.113:/media/pi/****01:0x00000007
192.168.11.116:/media/pi/****03:0x00000009
192.168.11.116:/media/pi/****04:0x0000001c
192.168.11.110:/media/pi/****04:0x00000032
192.168.11.113:/media/pi/****02:0x00000006
192.168.11.113:/media/pi/****04:0x0000000f
pi@raspberrypi2:~ $
```
上記サイトにあるように、クライアント側を全てシャットダウン後、以下実行。クリアされた模様。
```shell
pi@raspberrypi2:~ $ showmount -a
All mount points on raspberrypi2:
192.168.11.110:/media/pi/****05
192.168.11.110:/media/pi/****03
192.168.11.110:/media/pi/****04
192.168.11.113:/media/pi/****05
192.168.11.113:/media/pi/****01
192.168.11.113:/media/pi/****02
192.168.11.113:/media/pi/****03
192.168.11.113:/media/pi/****04
192.168.11.116:/media/pi/****05
192.168.11.116:/media/pi/****01
192.168.11.116:/media/pi/****03
192.168.11.116:/media/pi/****04
192.168.11.9:/media/pi/****05
192.168.11.9:/media/pi/****03
pi@raspberrypi2:~ $ sudo cp /dev/null /var/lib/nfs/rmtab     <-- クライアント側を全てシャットダウン後に実行
pi@raspberrypi2:~ $ showmount -a
All mount points on raspberrypi2:
pi@raspberrypi2:~ $
```
クライアント側起動後に再度確認。スッキリ。
```shell
pi@raspberrypi2:~ $ showmount -a
All mount points on raspberrypi2:
192.168.11.110:/media/pi/****03
192.168.11.110:/media/pi/****04
192.168.11.113:/media/pi/****01
192.168.11.113:/media/pi/****02
192.168.11.113:/media/pi/****03
192.168.11.113:/media/pi/****04
192.168.11.116:/media/pi/****01
192.168.11.116:/media/pi/****03
192.168.11.116:/media/pi/****04
pi@raspberrypi2:~ $
```
横道に逸れたが、話を戻す。
エクスポート状態が不正な場合は、設定ファイル`/etc/exports`を見直す。
```shell
pi@raspberrypi2:~ $ cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
/media/pi/****01   192.168.11.0/24(rw,no_subtree_check)
/media/pi/****02   192.168.11.0/24(rw,no_subtree_check)
/media/pi/****03   192.168.11.0/24(rw,no_subtree_check)
/media/pi/****04   192.168.11.0/24(rw,no_subtree_check)
pi@raspberrypi2:~ $
```
変更した場合は再起動。または以下コマンドでサービスを再起動。
```shell
pi@raspberrypi2:~ $ sudo exportfs -ra
pi@raspberrypi2:~ $ sudo systemctl restart nfs-kernel-server
pi@raspberrypi2:~ $
```

## クライアント側確認ポイント

### 1. 接続確認

`ping`で NFSサーバに到達することを確認。
```shell
pi@raspberrypi4:~ $ ping 192.168.11.101
PING 192.168.11.101 (192.168.11.101) 56(84) bytes of data.
64 bytes from 192.168.11.101: icmp_seq=1 ttl=64 time=2.43 ms
64 bytes from 192.168.11.101: icmp_seq=2 ttl=64 time=2.35 ms
64 bytes from 192.168.11.101: icmp_seq=3 ttl=64 time=9.30 ms
^C
--- 192.168.11.101 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 2.350/4.692/9.301/3.258 ms
pi@raspberrypi4:~ $
```

### 2. エクスポート確認
`showmount -e <hostname>`でエクスポートの確認。正常なら以下。クライアント側から NFSサーバの共有が見えること。
```shell
pi@raspberrypi4:~ $ showmount -e 192.168.11.101
Export list for 192.168.11.101:
/media/pi/****04 192.168.11.0/24
/media/pi/****03 192.168.11.0/24
/media/pi/****02 192.168.11.0/24
/media/pi/****01 192.168.11.0/24
pi@raspberrypi4:~ $
```
ここでエラーが発生するかエクスポートが確認できない場合はサーバ側の問題なので、そちらの設定を再確認。

### 3. マウント状態確認
マウントディレクトリ確認。以下は`/mnt/nfs`配下にマウント。
```shell
pi@raspberrypi4:~ $ ls -la /mnt/nfs
合計 24
drwxr-xr-x 6 root root 4096  2月 24 23:43 .
drwxr-xr-x 3 root root 4096 11月 30 21:47 ..
drwxrwxrwx 1 pi   pi   4096  8月 11  2021 ****01
drwxrwxrwx 1 pi   pi   4096  3月 19  2021 ****02
drwxrwxrwx 1 pi   pi   4096 12月  1 19:35 ****03
drwxrwxrwx 1 pi   pi   4096  2月 11 18:01 ****04
pi@raspberrypi4:~ $
```
というか冒頭の例のように`df -h`で確認した方が確実か。
`/etc/fstab`でマウント設定を行っている場合で且つマウントされていない場合は`/etc/fstab`を見直す。
```shell
pi@raspberrypi4:~ $ cat /etc/fstab
                （中略）
192.168.11.101:/media/pi/****01  /mnt/nfs/****01  nfs  _netdev,nofail,rw,defaults,nfsvers=3  0   0
192.168.11.101:/media/pi/****02  /mnt/nfs/****02  nfs  _netdev,nofail,rw,defaults,nfsvers=3  0   0
192.168.11.101:/media/pi/****03  /mnt/nfs/****03  nfs  _netdev,nofail,rw,defaults,nfsvers=3  0   0
192.168.11.101:/media/pi/****04  /mnt/nfs/****04  nfs  _netdev,nofail,rw,defaults,nfsvers=3  0   0
pi@raspberrypi4:~ $
```
設定を変更した場合は`sudo mount -a`で再マウント。因みに`/etc/fstab`でマウントする場合、マウントポイント（マウント用ディレクトリ、上記の`/mnt/nfs/****01`等）は明示的に作成しなくてもシステムが用意しマウントしてれくる。
`sudo mount -a`でエラーが発生する場合は手動マウントも試してみる。その場合はマウント用ディレクトリを作成してからマウントする。
```shell
mkdir /mnt/nfs/****04
sudo mount -t nfs -o nfsvers=3 192.168.11.101:/media/pi/****04 /mnt/nfs/****04
```
そしてエラーメッセージでぐぐる。
（具体例は今後追記予定）

## その他
全ての設定を見直したが全て正常。しかし何故かマウントできる共有ディレクトリとできないものがある場合。
複数HDD を NFS共有している場合、NFSサーバ起動時に全ての HDD のマウントが完了する前に NFSサービスが開始し、不整合が発生する場合があるっぽい。
その場合はサーバ側で以下コマンドを実行しサービスを再起動する。
```shell
sudo exportfs -ra
sudo systemctl restart nfs-kernel-server
```

## 参考URL
[showmount(8)](https://manpages.debian.org/buster/manpages-ja/showmount.8.ja.html "showmount(8) — manpages-ja — Debian buster — Debian Manpages")
[exportfs(8)](https://manpages.debian.org/buster/manpages-ja/exportfs.8.ja.html "exportfs(8) — manpages-ja — Debian buster — Debian Manpages")