自宅環境でKVM上で動作しているCentOS 6.4 x64なサーバがあるのですが、その上でUnboundとNSD4を動かし宅内DNSサーバとして稼働させています。
しかしながら以前から掲題のような問題が発生していました。
問題の出た環境:
# cat /etc/redhat-release
CentOS release 6.4 (Final)
# unbound-control status
version: 1.4.22
verbosity: 2
threads: 2
modules: 2 [ validator iterator ]
uptime: 2345 seconds
unbound (pid 1145) is running...
# nsd-control status
version: 4.0.0
verbosity: 1
ratelimit: 200
# cat /var/log/boot.log
FATAL: Module scsi_wait_scan not found.
Welcome to CentOS
Starting udev: [ OK ]
~中略~
Starting nsd4... [FAILED]
Starting unbound: Nov 27 22:45:15 unbound[1097:0] error: can't bind socket: Cannot assign requested address
Nov 27 22:45:15 unbound[1097:0] debug: failed address 2001:xxxx:xxxx:xxxx:xxxx::249 port 53
Nov 27 22:45:15 unbound[1097:0] fatal error: could not open ports
[FAILED]
# tail /var/log/nsd4/nsd4.log
[1385559915] nsd[1083]: error: can't bind udp socket: Cannot assign requested address
[1385559915] nsd[1083]: error: server initialization failed, nsd could not be started
どうやら、ネットワークインターフェースにIPv6アドレスが付与されるまでの間にサービスが起動しようとして、紐付けが出来なくて起動に失敗しているようです。ただし、bootが終わったあと普通にservice unbound start など実行すれば正常に起動してくるので、単純に起動時のヒモ付の問題だけのようです。
そのことをTwitterで呟いたところ、@wakadannacom さんからアドバイスが。
@kometchtech @qryuu start() { の行の下に sleepを仕込んでみてはどうでしょうか? 一応、unboundは起動後にrestartすると問題なく動くのですよね?
— だんな@C85-大晦日:西せ13a (@wakadannacom) 2013, 11月 27
@kometchtech 了解。今のところに書いておくとリスタートの度にsleepが走るので、rc.localに ”/bin/sleep xx ” “/sbin/service unbound restart” の方がいいかも
— だんな@C85-大晦日:西せ13a (@wakadannacom) 2013, 11月 27
@kometchtech 本当は、今sleep入っている箇所にIPv6が設定出来た事を判断チェックを入れればいいのかもしれませんね。もし設定出来てなかったらxx秒待ってから再チェック(3回くらいダメならエラーログを吐いて終了)など
— だんな@C85-大晦日:西せ13a (@wakadannacom) 2013, 11月 27
というありがたいアドバイスを頂いたので、拙い知識ではありますが、起動スクリプトを修正してみることにしました。
具体的には、起動スクリプトのstart句の部分に、ネットワークインターフェースがupしているかどうかの判定をいれ、起動していないようであればSleepさせて起動を待つ、というような感じにしています。
# starting wait
# Source networking configuration.
. /etc/sysconfig/network # check net-if up
if [ $NETWORKING = "no" ]; then
sleep 3
fi;
これで再起動を実施してみたところ、無事に起動してくることを確認しました。
# cat /var/log/boot.log
FATAL: Module scsi_wait_scan not found.
Welcome to CentOS
Starting udev: [ OK ]
Setting hostname dns1.kometch.local: [ OK ]
Remounting root filesystem in read-write mode: [ OK ]
Mounting local filesystems: [ OK ]
Enabling /etc/fstab swaps: [ OK ]
Entering non-interactive startup
Starting monitoring for VG VolGroup: 2 logical volume(s) in volume group "VolGroup" monitored
[ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface eth0: [ OK ]
Starting sshd: [ OK ]
Starting ntpd: [ OK ]
Starting nsd4... [ OK ]
Starting unbound: [ OK ]
Starting tuned: [ OK ]
Starting Zabbix agent: [ OK ]
Starting crond: [ OK ]
今回はunboundもNSDもソースからコンパイルし、その中に入っているinitファイルを使用してこの問題に直面しましたが、他の方でこの問題に遭遇している人はいないのか気になっています。
また、今回の問題の対処方法以外にも以下のような方法もあるようです。
@kometchtech IPv6もunboundも動きについて詳しくないので、これ以上お役にたてないのですが。起動スクリプトを変更するかchkconfig配下をやめてrc.localで起動時のみ制御するかは運用ポリシーによるかと思います。エレガントではないですが割と後者が多いw
— だんな@C85-大晦日:西せ13a (@wakadannacom) 2013, 11月 27
ただ、今回は起動スクリプト中にしっかりと「Required-Start: $network
」が指定されているにもかかわらず、それに準じた動きをしていないのが、非常に気になりました。この辺りの事情をご存じの方がいらっしゃいましたら、是非ともご教授ください。
今回の問題に付き合っていただいた@wakadannacom さん、本当にありがとうございました。
参考:
LSBInitScripts – Debian Wiki /
https://wiki.debian.org/LSBInitScripts
DVD付 CentOS徹底入門 第3版 (2012/03/09) 中島 能和、飛田 伸一郎 他
|
Linuxエンジニア養成読本 [仕事で使うための必須知識&ノウハウ満載!] (Software Design plus) (2011/04/08) SoftwareDesign編集部
|