RaspbianのDHCPクライアントにはまる

Confused by DHCP client configuration of Raspbian (Debian) very much…

Raspberry Pi(Raspbian 使用)で、ブート時の NFS マウントをしようとしてハマってしまいました。以前にもはまったことがあるのですが、そのときは Debian Jessie の systemd のせいだと思っていたのですが、今回は wheezy にも関わらず同様な問題を起こしてしまいました。備忘録を兼ねて、順を追って説明します。

現象としては、/etc/fstab の末行に

nfsserver:/mnt/home /mnt/home nfs defaults 0 0

みたいなことを書いてもブート時にマウントされない、というものです。(ただし、ブート後に sudo mount -a とかすると、ちゃんとマウントされます。)

/etc/init.d/mountnfs.sh から追いかけていって分かったことは、/etc/network/interfaces の設定で、ネットワークインターフェイス(eth0 とか)が DHCP で構成されていると、ブート時に NFS マウントをしてくれない、ということです。ま、世の中的には automount の時代でしょうから、そういうことをする人は少数派なのでしょうけど。

仕方ない(というか、確かに NFS マウントするクライアントが DHCP で動的にアドレスを取る、というのは稀かも知れない)ので、/etc/network/interfaces を以下のように修正しました。

iface eth0 inet static
address 10.0.0.100
netmask 255.255.255.0
network 10.0.0.0
broadcast 10.0.0.255
gateway 10.0.0.254

これでようやく、ブート時の NFS マウントができるようになりました。

問題はこれだけではなかった

ようやく安心して、DHCP を使わずに静的な IP アドレスを割り当てるようにし、NFS サーバーの設定も書き換えて 10.0.0.100 からでないとマウントできないようにしたのですが(これは、セキュリティ対策としては甘いです。IP アドレスは偽造できますから。ま、とりあえず)、なぜか NFS サーバーから mount をはねられてしまいます。

ifconfig で表示すると、ちゃんと 10.0.0.100 が割り当てられているのですが、NFS サーバーから arp -a コマンドで確認すると、なぜか Raspberry Pi に DHCP のアドレスが割り当てられています。誰かが代理 ARP で答えているのかと勘ぐったのですが、Wireshark で調べたところ、当の Raspberry Pi が DHCP のアドレスでも ARP で応答していることが分かりました。だめじゃん!

Raspberry Pi 上の hostname -I コマンドで調べてみたところ、静的なアドレスと DHCP のアドレスと、2つを持っていることが分かりました。NFS で失敗するのは、これが原因です。NFS サーバーにアクセスするとき、10.0.0.100 でないほうのアドレスを使っているのでしょう。

この辺を見ると、これは既知の問題のようで、皆さんがはまっていることが分かりました。

とりあえず私の解決策として、DHCP クライアント機能を根こそぎアンインストールすることにしました。以下、手順(備忘録)です。

1. dpchcd5 パッケージと openresolv パッケージをアンインストールします。

具体的には、

$ sudo apt-get purge dhcpcd5 openresolv

とします。(purge を使うと設定ファイルも消えてしまうので、気をつけてください。)

次に、/etc/resolv.conf を手動で設定します。(DHCP クライアントが設定してくれなくなったので)

domain hogehoge.fugafuga.net
search hedgehog.fugafuga.net
nameserver 10.0.0.254

のような感じです。

これでようやく問題は解決し、元の仕事に戻れるようになりました。