Debian Lenny + ntp でうるう秒の監視メール

■うるう秒について総務省他、関連各所で発表がありました。

 参考:「うるう秒」挿入のお知らせ
 http://www.soumu.go.jp/menu_news/s-news/01tsushin03_02000031.html

■3 年半ぶりとのことなので、前回の記事がそのまま参考になります。

 参考:【Technical Notes】Linux システムクロックの『うるう秒』調整
 http://www-06.ibm.com/jp/domino01/mkt/cnpages7.nsf/page/default-0019DB89?OpenDocument&TableRow=1.2

■手動で設定するか、NTPサーバが自動で設定するかのいずれかです。
 ※上位の NTP サーバーがうるう秒の挿入情報を適切に設定している必要があります。

■日本国内からの推奨のタイムサーバを確認し、
 うるう秒挿入を明確にサポートしているNTPサーバを参照します。

 ntp.nict.jp

 参考:推奨公開サーバ
 http://wiki.nothing.sh/page/NTP/%BF%E4%BE%A9%B8%F8%B3%AB%A5%B5%A1%BC%A5%D0

 参考:「うるう秒」挿入のお知らせ
 http://www.nict.go.jp/press/2012/01/31-1.html

■念の為、NICTの運用情報もチェックしておきます。

 参考:運用情報
 http://www2.nict.go.jp/w/w114/tsp/PubNtp/index.html

 参考:NTP サーバ一覧
 http://www.venus.dti.ne.jp/~yoshi-o/NTP/NTP-Table.html

■閏秒は「ISO 8601」で規定されているので、確認さえ行えば問題ないはずです。

 参考:ISO 8601
 http://ja.wikipedia.org/wiki/ISO_8601

■システムログには以下のようなログが出力されるはずです。

 Clock: inserting leap second 23:59:60 UTC

■Debian Lennyにntpを導入
 ※debianサーバも参照していますので、「ntp.nict.jp」をその前に設定します。
  ・より正確さを求めるのであれば、debianのNTPサーバ3行をコメントアウトし、
   「server ntp.nict.jp」を3行書いてDNSラウンドロビンでNICTの別々のサーバを参照します。
  ・セカンダリのタイムサーバも書いた方が良いです。
  ・閏秒の挿入前の2月にはLennyのサポートが切れます。

$ sudo apt-get install ntp
$ sudo cp -pi /etc/ntp.conf /etc/ntp.conf.org
$ sudo vim /etc/ntp.conf
$ diff /etc/ntp.conf /etc/ntp.conf.org
21d20
< server ntp.nict.jp
$ sudo /etc/init.d/ntp restart
$ ps -ef | head -1;ps -ef | grep ntp | grep -v grep
UID        PID  PPID  C STIME TTY          TIME CMD
ntp      20206     1  0 Jan31 ?        00:00:00 /usr/sbin/ntpd -p /var/run/ntpd.pid -u 110:115 -g

■設定の反映の確認
 「nict」のDNSラウンドロビンで転送されたNTPサーバを参照していることが確認出来ます。
 「*」は同期したサーバ、「+」は次に同期するサーバ

$ sudo ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ntp-a3.nict.go. .INIT.          16 u    - 1024    0    0.000    0.000   0.000
 xtriangle.kansas 128.252.19.1    2 u  246  128  376  174.699  -487.34 152.429
*64.73.32.134    164.67.62.194    2 u  117  128  377  169.315  -14.031   3.368
 tick.e.mattnord .INIT.          16 u    - 1024    0    0.000    0.000   0.000
+mail.freerip.co 67.18.187.111    3 u   53  128  377  122.192   -1.223   2.426

■同期し始めると、最新のログが残ります。

$ grep drift /etc/ntp.conf
driftfile /var/lib/ntp/ntp.drift
$ sudo cat /var/lib/ntp/ntp.drift
-14.725

■システムログ(syslog)には以下のようにログが出ます。

$ sudo cat /var/log/syslog | grep -i ntpd | grep -v Listening | cut -c 44-
ntpd 4.2.4p4@1.1520-o Sun Nov 22 16:14:34 UTC 2009 (1)
precision = 1.000 usec
kernel time sync status 0040
0.799251] warning: `ntpd' uses 32-bit capabilities (legacy support in use)
synchronized to 216.129.110.22, stratum 2
time reset -161.188607 s
synchronized to 216.129.110.22, stratum 2
ntpd exiting on signal 15
ntpd 4.2.4p4@1.1520-o Sun Nov 22 16:14:34 UTC 2009 (1)
precision = 1.000 usec
kernel time sync status 0040
frequency initialized 0.000 PPM from /var/lib/ntp/ntp.drift
synchronized to 64.6.144.6, stratum 2
kernel time sync status change 0001
synchronized to 64.73.32.134, stratum 2
■閏秒(leap second)の情報は以下で確認します。
 Lenny(amd64)の場合は以下のようになります。

$ sudo ntpq -c rv | grep --color leap
assID=0 status=0654 leap_none, sync_ntp, 5 events, event_peer/strat_chg,
processor="x86_64", system="Linux/2.6.26-2-amd64", leap=00, stratum=3,

■7/1()85960秒に実施されるとのことですので、
 その前後の情報をシステムメールで通知する為のスクリプトを書きます。

$ whereis -b ntpq mail
ntpq: /usr/bin/ntpq
mail: /usr/bin/mail /etc/mail.rc

$ sudo vim leapcheckmail.sh
#!/bin/bash -x

MDATE=`date '+%Y/%m/%d %H:%M'`
MFQDN=`hostname -f`
MUSER=`whoami`
MLOG=/var/log/ntpq.log
if [ `id -u` -eq "0" ];then
  echo "#\"leap=\" check ${MDATE}" >> ${MLOG}
  ntpq -c rv >> ${MLOG}
  sed s/"\,"/"\n"/g ${MLOG} | grep "leap=" | mail -s "ntpq leap second report : ${MDATE}" ${MUSER}@${MFQDN}
  exit 0
else
  echo "You must be root to exec $0"
  exit 1
fi

■上記スクリプトでメールを送ると以下のようになります。
 ※「leap=01」が閏秒の挿入タイミングです。

$ sudo chmod +x leapcheckmail.sh
$ sudo ./leapcheckmail.sh
$ sudo ./leapcheckmail.sh
Subject: ntpq leap second report : 2012/02/01 00:36

#"leap=" check 2012/02/01 00:40
 leap=00
#"leap=" check 2012/02/01 00:45
 leap=00

■rootユーザのcronに登録します。
 ※「MAILTO=""」でmailが飛ばないようにしていなければ、
  debianではcronの実行結果がシステムメールで通知されます。
  「/etc/cron.d/leapcheck」内でログを取るだけのcronを書く方法もあります。

$ sudo mv leapcheckmail.sh /usr/local/bin/leapcheckmail.sh
$ sudo env EDITOR=vim crontab -e
$ sudo env EDITOR=vim crontab -l
# m h  dom mon dow   command
MAILTO=""
0 7,8,9 * * * /bin/bash /usr/local/bin/leapcheckmail.sh

■冗長ですが、上記で毎日、7時、8時、9時にメールが来ますので、
 「7/1」まで該当時間にチェックするクセも付くと思います。