M.C.P.C. (Mamesibori Creation Plus Communication)

印刷屋から五反田のWeb屋に転職したCLのブログです。

CentOS 5のNFSv4ファイル共有設定でハマる

いろんな事情があって、CentOS 5(具体的には5.8Final)でNFSでどっかのディレクトリをマウントせないかん、という案件があるとして。

しかし、こういう場合ってたいていiptablesによるファイアウォール稼働下だとうまくいかない、となるみたい。

なんでか、というと、旧来のNFS(NFSv3とか)は、使用するポートがえらい多くて、しかもポート番号がふよふよ動きよる。なので、ファイアウォール通すのも一苦労、大学の研究室でSolarisNFSで共有していた牧歌的な時代のプロトコルだと言えましょう。

そんで、そのNFSでなんとかしてつながなくてはいけないとなるとどうするか。

  • 方法1:とにかくNFS共有を目的として、iptablesを劇甘設定にする
  • 方法2:iptablesによる運用を優先して、NFS共有で悩む

ここでさっそうと現れるのがNFSv4によるiptables共存できるファイル共有ってわけなんですけれども。なんでiptables共存できるか、ていうと、ポートを1個(TCP/2049)だけ使うからんですけども。

実際Google検索してみると、CentOS 5のNFSv4でのNFS共有の構築例って結構少ないんですよね……

ご家庭CentOSだったら、確かにiptables甘い設定にするでしょうからわからなくもないですけれども……

ちなみに、NFSv4構築でなんでハマるかっていうと、エラーメッセージが全般的にくそってことです。原因そのものがエラーメッセージを出していないので、原因の発生場所がつかみにくいんですね。

ポイントは、

  1. portmapとrpc.idmapd をサーバとクライアントでしっかり動かしておく。/etc/idmapd.confの設定はドメインの設定ぐらいでよし。
  2. /usr/bin/system-config-securitylevel-tui で設定できるNFS4のポートの穴開けは TCP 2049番のみであります。NFSv4でつなぐ限り高次ポートは使いませんので、信じて設定を続けましょう。気を抜くと、「どうしてもつながらない。」→「NFSv3でいっか。」→「ポート固定して数か所穴開けるか。」などとダークサイドに引き込まれます。
  3. サーバの方の /etc/exports に書き込む共有ディレクトリの設定オプションどれか最低一つに、fsid=0が付いていないと、クライアント側からマウントしたときに、理不尽なエラーメッセージに悩まされます。NFSv3までとは違うのでマジ注意です……
  4. mountする時に、ファイルシステムタイプに -t nfs4 としておきましょう。私はこれで、ネットの情報がNFSv4前提のエントリかどうか見分けました……

CentOS5の場合、NFSサーバだったら

# /usr/sbin/system-config-securitylevel-tui (CustomizeでFirewallにてNFS4にチェックつけよう)
# /sbin/service portmap restart
# /sbin/service rpcidmapd restart
# /sbin/service nfs start

てな感じで動かす。NFSサーバをmountするほう、つまりクライアントはnfsは起動させなくてよいよ。

あとCentOS 5限定だと思うんですけれども、どうやらディストリビューションのパッケージのどれかがミスっていて、普通にマウントしようとすると、

# mount -t nfs4 nfs4server.example.com:/ /mnt/hoge
Warning: rpc.idmapd appears not to be running.
         All uids will be mapped to the nobody uid.

とか出ます。これ何かっていうと、rpc.imapdが動くと、/var/lock/subsys/rpc.idmapdができるのですが、rpc.imapdが動いているかどうかを調べるために見るのが、/var/lock/subsys/rpcidmapdとなっているという悲劇。

起こっていることは10年前のLinuxかよって思うわけですけれども、こういうのはrpc.idmapdの起動スクリプトをしこしこ書き換えるでなくバッドノウハウで乗り越えましょう。

# ln -s /var/lock/subsys/rpc.idmapd /var/lock/subsys/rpcidmapd

これで、Warningが出なくなります。めでたし、めでたし。


●急に始まるエラーメッセージ集

mount.nfs4: Permission denied
NFSサーバから拒否られている:/etc/exportsに書いたマウント許可アドレス範囲を確認しよう
mount.nfs4: Operation not permitted
NFSサーバから拒否られている:/etc/exportsの共有ディレクトリのオプションにfsid=0つけ忘れていないか確認しよう
ssh -L 2049:example.com:2049などsshなどでトンネリングした接続にNFSを通しているのなら、接続ポート制限に引っ掛かっている可能性も。/etc/exports にて、オプションにinsecureをつけよう

●他のサービス群について

外部との通信にTCP/2049を使うNFSv4なんだけれども、他のサービスをたくさん使う癖は直っていません。特に、以下の2つのサービスは、低位のWell-knownポートをエフェメラルポートとして勝手に(動的に)使うので困りものです。この前なんか、DovecotのIMAPSポートを先に取得してしまい、メールサーバの機能が果たせなくなりました。動的にポートが選ばれるので、起動のたびに問題が出たり出なかったりするというのが困りもの。だから、しっかり対策をとっておきましょう。

  • rpc.mountd:ポート開けなくてもmountできるが、CentOS 5の場合、こいつがいないとNFSv4のマウントができないので、ポート固定しよう。
  • rpc.rquotad:いなくてもマウントできるので、起動しないようにしよう。

設定は/etc/sysconfig/nfsから。


これぐらい注意すれば、NFSv3ができていた人ならばNFSv4でサービスできるかなと思いますです……

enjoy!