NFS4 でスーパーブロックを読み込めない

SERVER


NFS4 マウント時にスーパーブロックのエラーになる

Linux には、NFS (Network File System) という、ネットワークでディレクトリを共有する仕組みがあります。

以前に EZ-NET: NFS4 を用いて共有ディレクトリを公開する で紹介したような方法で NFS をマウントして利用していたのですけど、サーバーを移設して IP アドレスが変更になったタイミングで、NFS4 パーティションをマウントしようとしたところ、次のようなエラーが発生してしまうようになりました。

mount: nfs.server.xx.jp:/: スーパーブロックを読めません.

英語で出力される場合は "can't read superblock" となるみたいです。

このエラーは、NFS サーバーの公開ディレクトリの設定が間違っているか、通信が途中で遮断されているか、別のサーバーへ繋いでしまったか、そういった何らかの理由で NFS パーティションをマウントできないときに表示されるエラーのようです。

状況の確認

最初は、IP アドレスが変わったために "/etc/exports" での提供先 IP アドレスの変更し忘れや、"/etc/sysconfig/iptables" での NFS4 (2049/TCP) パケットの制限、"/etc/exports" 修正後の "exportfs -r" を実行し忘れてないかなどが影響しているのかとも思ったのですが、どちらを確認してみてもエラーは解消されませんでした。

ちなみに iptables により経路が遮断されている場合には、"mount: mount to NFS server 'nfs.server.xx.jp' failed: System Error: ホストへの経路がありません." というエラーが表示されます。

 

他にも portmap サービスや rpcidmapd サービスが稼働していることも確認してみましたが、クライアントもサーバーも、問題なくこれらのサービスが動作している感じです。

念のため portmap (111/TCP, UDP) の通信許可を "/etc/sysconfig/iptables" や "hosts.allow" で実施してみたりもしましたけど、NFS4 でマウントする場合には、これらの通信許可はとくに必要はない様子でした。

原因は逆引き DNS

他におかしいところもないはずなのにと思いながらも調べていると、どうやら今回は逆引き DNS の設定が間違っていたことが原因だったようでした。

"/etc/exports" で接続可能なクライアントの IP アドレスを指定した時、"exportfs -r" を実行すると、どうやら指定した IP アドレスがホスト名に変換されて記憶されるみたいです。

"exportfs -v" を実行して出てきた設定内容には、IP アドレスで指定した部分が逆引きされたホスト名で表示されています。

 

ここまでは良かったのですけど、今回はここで DNS の設定ミスがあったため、例えば "192.168.0.1" を指定して、逆引きにより "host-a.localdomain" が取得できているのに、"host-a.localdomain" を正引きすると "192.168.0.3" というように、元とは別の IP アドレスが取得できてしまっていました。

そのため、"/etc/exports" では "192.168.0.1" を設定しているにも関わらず、それが "host-a.localdomain" として記憶され、実際のマウントの際には、そのドメインが示す IP "192.168.0.3" からの接続でなければ受け付けないという状況ができていたため、それをマウントしようとして "can't read superblock" というエラーになってしまっていました。

逆引き DNS を適切に設定し直して、正引きと逆引きとで矛盾が出ないようにすることで、問題なく NFS4 パーティションをマウントすることができるようになりました。