現象
Ubuntu 16.04でntp.serviceはntpインストール時にenableになっているのに、OS起動時にntp.serviceが停止しているという現象が発生した。
$ ntpq -p
ntpq: read: Connection refused
$ systemctl status ntp.service
● ntp.service - LSB: Start NTP daemon
Loaded: loaded (/etc/init.d/ntp; bad; vendor preset: enabled)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)
Apr 24 22:04:05 ubuntu1604 systemd[1]: Stopped LSB: Start NTP daemon.
このメッセージだと、一旦正常に起動してから停止したようだ。
OS起動後に手動でsudo systemctl start ntp.service
を実行すると問題なく起動する。
$ sudo systemctl start ntp.service
$ systemctl status ntp.service
● ntp.service - LSB: Start NTP daemon
Loaded: loaded (/etc/init.d/ntp; bad; vendor preset: enabled)
Active: active (running) since Sun 2016-04-24 22:08:20 JST; 18s ago
Docs: man:systemd-sysv-generator(8)
Process: 1421 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS)
Tasks: 2 (limit: 512)
Memory: 1.4M
CPU: 40ms
CGroup: /system.slice/ntp.service
└─1433 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 111:117
Apr 24 22:08:23 ubuntu1604 ntpd[1433]: Soliciting pool server 157.7.152.213
Apr 24 22:08:23 ubuntu1604 ntpd[1433]: Soliciting pool server 104.41.167.60
Apr 24 22:08:24 ubuntu1604 ntpd[1433]: Soliciting pool server 106.185.48.114
Apr 24 22:08:24 ubuntu1604 ntpd[1433]: Soliciting pool server 106.187.50.84
Apr 24 22:08:24 ubuntu1604 ntpd[1433]: Soliciting pool server 157.7.203.102
Apr 24 22:08:24 ubuntu1604 ntpd[1433]: Soliciting pool server 116.58.172.182
Apr 24 22:08:25 ubuntu1604 ntpd[1433]: Soliciting pool server 157.7.154.29
Apr 24 22:08:25 ubuntu1604 ntpd[1433]: Soliciting pool server 157.7.64.173
Apr 24 22:08:25 ubuntu1604 ntpd[1433]: Soliciting pool server 36.55.235.15
Apr 24 22:08:25 ubuntu1604 ntpd[1433]: Soliciting pool server 91.189.89.199
誰が殺したntp.service。
この前CentOS 7でchronyとntpdateが両方インストールされているとofflineの参照先がOS起動時にonlineにならないという問題にぶつかったため、今回もntpdateのせいではないかと適当にアンインストールしてみるとやっぱり当たり。
ntpdateが犯人
何が悪いのか。
もう一度ntpdateパッケージをインストールし、とりあえずntpdateパッケージに含まれるファイルを確認。
$ dpkg -L ntpdate
/.
/etc
/etc/network
/etc/network/if-up.d
/etc/network/if-up.d/ntpdate
/etc/dhcp
/etc/dhcp/dhclient-exit-hooks.d
/etc/dhcp/dhclient-exit-hooks.d/ntpdate
/etc/logcheck
/etc/logcheck/ignore.d.server
/etc/logcheck/ignore.d.server/ntpdate
/etc/default
/etc/default/ntpdate
/var
/var/lib
/var/lib/ntpdate
/usr
/usr/sbin
/usr/sbin/ntpdate-debian
/usr/sbin/ntpdate
/usr/share
/usr/share/doc
/usr/share/doc/ntpdate
/usr/share/doc/ntpdate/copyright
/usr/share/doc/ntpdate/changelog.Debian.gz
/usr/share/doc/ntpdate/README.Debian
/usr/share/doc/ntpdate/NEWS.Debian.gz
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/ntpdate.8.gz
/usr/share/man/man8/ntpdate-debian.8.gz
/etc/network/if-up.d/ntpdate はネットワークに接続された時に実行されるものだ。怪しいのでこれを見てみる。
$ cat /etc/network/if-up.d/ntpdate
#!/bin/sh
set -e
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# This is a heuristic: The idea is that if a static interface is brought
# up, that is a major event, and we can put in some extra effort to fix
# the system time. Feel free to change this, especially if you regularly
# bring up new network interfaces.
if [ "$METHOD" = static ]; then
OPTS="-b"
fi
if [ "$METHOD" = loopback ]; then
exit 0
fi
# Check whether ntpdate was removed but not purged; it's useless to wait for
# it in that case.
if [ ! -x /usr/sbin/ntpdate-debian ] && [ -d /usr/sbin ]; then
exit 0
fi
(
# This is for the case that /usr will be mounted later.
if [ -r /lib/udev/hotplug.functions ]; then
. /lib/udev/hotplug.functions
wait_for_file /usr/sbin/ntpdate-debian
fi
if [ -e /usr/sbin/openntpd ]; then
service='openntpd'
else
service='ntp'
fi
invoke-rc.d --quiet $service stop >/dev/null 2>&1 || true
# Avoid running more than one at a time
flock -n /run/lock/ntpdate /usr/sbin/ntpdate-debian -s $OPTS 2>/dev/null || :
invoke-rc.d --quiet $service start >/dev/null 2>&1 || true
) &
invoke-rc.d --quiet $service stop >/dev/null 2>&1 || true
はntp.serviceを停止するものだ。その後にinvoke-rc.d --quiet $service start >/dev/null 2>&1 || true
でntp.serviceが起動されるが、多分そこに辿り着けていないのだろうと当たりを付けると、その間にあるflock -n /run/lock/ntpdate /usr/sbin/ntpdate-debian -s $OPTS 2>/dev/null || :
が問題だろう。
というわけで今度は/usr/sbin/ntpdate-debian
を見る。
$ cat /usr/sbin/ntpdate-debian
#!/bin/sh
set -e
if [ -r /etc/default/ntpdate ]; then
. /etc/default/ntpdate
fi
if [ "$NTPDATE_USE_NTP_CONF" = yes ]; then
for f in /var/lib/ntp/ntp.conf.dhcp /etc/ntp.conf /etc/openntpd/ntpd.conf; do
if [ -r "$f" ]; then
file=$f
break
fi
done
if [ -n "$file" ]; then
NTPSERVERS=$(sed -rne 's/^(servers?|peer)[[:space:]]+(-[46][[:space:]]+)?([-_.:[:alnum:]]+).*$/3/p' "$file" | grep -v '^127.127.') || [ $? -le 1 ]
fi
elif [ -r /var/lib/ntpdate/default.dhcp ]; then
. /var/lib/ntpdate/default.dhcp
fi
exec /usr/sbin/ntpdate $NTPOPTIONS "$@" $NTPSERVERS
つまり、/etc/default/ntpdate のNTPDATE_USE_NTP_CONFがyesの場合、/etc/ntp.confからserver, servers, peerディレクティブから問い合わせ先を取得してntpdateで問い合わせるという処理のようだ。
そして/etc/ntp.confはデフォルトでserverもpeerもなくpoolで指定されている(serversはOpenNTPD用)。
$ cat /etc/ntp.conf
(略)
# Specify one or more NTP servers.
# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
# more information.
pool 0.ubuntu.pool.ntp.org iburst
pool 1.ubuntu.pool.ntp.org iburst
pool 2.ubuntu.pool.ntp.org iburst
pool 3.ubuntu.pool.ntp.org iburst
# Use Ubuntu's ntp server as a fallback.
pool ntp.ubuntu.com
(略)
これが原因か。
解決
それでは/usr/sbin/ntpdate-debianを書き換えてpoolからも問い合わせ先を取得できるようにしてからOS再起動。
$ sudo sed -i 's/servers?|peer/servers?|pool|peer/' /usr/sbin/ntpdate-debian
$ sudo reboot
問題ないね。
$ ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
0.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.000
1.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.000
2.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.000
3.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.000
ntp.ubuntu.com .POOL. 16 p - 64 0 0.000 0.000 0.000
-wktk-sub.tk 210.173.160.87 3 u 42 64 3 20.318 4.537 5.074
*sv01.azsx.net 103.1.106.69 2 u 39 64 3 6.241 1.019 3.372
+extendwings.com 133.243.238.164 2 u 41 64 3 4.961 1.002 3.494
+balthasar.gimas 181.170.187.161 3 u 42 64 3 6.345 2.090 3.292
+gw1.kohaaloha.c 133.243.238.244 2 u 43 64 3 5.550 0.794 2.574
-x.ns.gin.ntt.ne 249.224.99.213 2 u 38 64 3 3.688 -1.114 2.492
-sv2.localdomain 133.243.238.243 2 u 39 64 3 7.291 1.075 2.855
-ec2-54-64-6-78. 133.243.238.164 2 u 43 64 3 6.745 0.293 2.680
+jp.linode.oxoox 103.1.106.69 2 u 41 64 3 7.543 0.731 2.318
#y.ns.gin.ntt.ne 249.224.99.213 2 u 39 64 3 6.635 -4.997 2.338
122x215x240x51. 223.255.185.2 2 u 39 64 3 4.166 0.412 2.646
#next.kkyy.me 133.243.238.244 2 u 40 64 3 5.200 0.705 3.188
-golem.canonical 192.150.70.56 2 u 40 64 3 238.342 8.668 10.597
$ systemctl status ntp.service
● ntp.service - LSB: Start NTP daemon
Loaded: loaded (/etc/init.d/ntp; bad; vendor preset: enabled)
Active: active (running) since Sun 2016-04-24 22:31:25 JST; 2min 15s ago
Docs: man:systemd-sysv-generator(8)
Process: 1162 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS)
Tasks: 2 (limit: 512)
Memory: 1.7M
CPU: 57ms
CGroup: /system.slice/ntp.service
└─1174 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 111:117
Apr 24 22:31:28 ubuntu1604 ntpd[1174]: Soliciting pool server 106.187.50.84
Apr 24 22:31:29 ubuntu1604 ntpd[1174]: Soliciting pool server 129.250.35.250
Apr 24 22:31:29 ubuntu1604 ntpd[1174]: Soliciting pool server 106.187.100.179
Apr 24 22:31:29 ubuntu1604 ntpd[1174]: Soliciting pool server 157.7.236.66
Apr 24 22:31:29 ubuntu1604 ntpd[1174]: Soliciting pool server 54.64.6.78
Apr 24 22:31:30 ubuntu1604 ntpd[1174]: Soliciting pool server 129.250.35.251
Apr 24 22:31:30 ubuntu1604 ntpd[1174]: Soliciting pool server 60.56.214.78
Apr 24 22:31:30 ubuntu1604 ntpd[1174]: Soliciting pool server 122.215.240.51
Apr 24 22:31:30 ubuntu1604 ntpd[1174]: Soliciting pool server 133.130.120.204
Apr 24 22:31:31 ubuntu1604 ntpd[1174]: Soliciting pool server 91.189.89.199
なお、/etc/network/if-up.d/ntpdateの中のflock -n /run/lock/ntpdate /usr/sbin/ntpdate-debian -s $OPTS 2>/dev/null || :
行がUbuntu 15.10の時点では/usr/sbin/ntpdate-debian -s $OPTS 2>/dev/null || :
になっていた。
ここが変わったのが問題発生の契機のようだ。
まあそのうち直りそうなものだ。