うるう秒の検証について(Squeeze/Lenny)

■うるう秒の「leap time」の監視メールについては以下で紹介した。
 これはSqueezeでも変わらない。

 Debian Lenny + ntp でうるう秒の監視メール
 http://d.hatena.ne.jp/labunix/20120201

 以下、Lennyでも同様。

■Squeezeのデフォルトインストールでのリアルタイム監視

$ sudo watch -d -n 1 'ntpq -p -c rv'
Every 1.0s: ntpq -p -c rv                               Sat Mar  3 18:09:28 2012

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+ntp3.junkemailf 209.81.9.7       2 u   55   64    1  117.461    0.578   0.415
*ponderosa.piney 209.51.161.238   2 u   54   64    1  207.005   -6.733   0.881
-vega.jeffkaplan 128.4.40.12      3 u   20   64    1  228.139    2.232   0.967
+ntp1.Rescomp.Be 128.32.206.55    3 u   25   64    3  123.474   -3.612   0.683
associd=0 status=c618 leap_alarm, sync_ntp, 1 event, no_sys_peer,
version="ntpd 4.2.6p2@1.2194-o Sun Oct 17 13:35:13 UTC 2010 (1)",
processor="x86_64", system="Linux/2.6.32-5-amd64", leap=11, stratum=3,
precision=-21, rootdelay=208.470, rootdisp=231.925, refid=66.228.35.252,
reftime=d2fc5e12.9bf73f0d  Sat, Mar  3 2012 18:08:34.609,
clock=d2fc5e48.74e60d00  Sat, Mar  3 2012 18:09:28.456, peer=16369, tc=6,
mintc=3, offset=0.000, frequency=0.000, sys_jitter=3.965,
clk_jitter=1.887, clk_wander=0.000

■「leap=01」が閏秒の挿入タイミング

 NTP サーバーと同期がとれるまで「leap=11」
 通常は「leap=00」

■「stratum=16」は最下位の為同期できない。
 上位ntpサーバを参照しない、仮想マシン内で相互参照するような隔離環境で
 テストを行う場合は要注意。

 参考:Network Time Protocol
 http://ja.wikipedia.org/wiki/Network_Time_Protocol

■うるう秒対応のNICTにntpサーバ参照を変更した場合

$ sudo watch -d -n 1 'ntpq -p -c rv'
Every 1.0s: ntpq -p -c rv                               Sat Mar  3 18:11:08 2012

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp-a2.nict.go. .NICT.           1 u    1   64    1    8.130    3.203   0.394
associd=0 status=0614 leap_none, sync_ntp, 1 event, freq_mode,
version="ntpd 4.2.6p2@1.2194-o Sun Oct 17 13:35:13 UTC 2010 (1)",
processor="x86_64", system="Linux/2.6.32-5-amd64", leap=00, stratum=2,
precision=-21, rootdelay=8.130, rootdisp=941.134, refid=133.243.238.243,
reftime=d2fc5eab.c888be89  Sat, Mar  3 2012 18:11:07.783,
clock=d2fc5eac.fb910cf7  Sat, Mar  3 2012 18:11:08.982, peer=62597, tc=6,
mintc=3, offset=3.203, frequency=0.021, sys_jitter=0.394,
clk_jitter=1.133, clk_wander=0.008

■うるう秒対応のシステムかどうかの確認
 ntpd 4.2.6p2(ntpd version 4以上)なので、「うるう秒考慮なし」が正しい。

 参考:NTP うるう秒(閏秒)
 http://www.bsddiary.net/doc/ntpd-leapseconds.html

$ UNIXTIME=`perl -e 'use POSIX; printf("%d\n", mktime(0, 0, 9, 1, 0, 106));'`; \
  if [ ${UNIXTIME} == "1136073600" ];then \
    echo "うるう秒考慮なし" ; \
  elif [ ${UNIXTIME} == "1136073623" ];then \
    echo "うるう秒考慮あり"; \
  fi
うるう秒考慮なし

■基本は「123/UDP」
 「ICMP TYPE13、14」は使われないはず。

 参照:Appendix C. ICMPタイプ
 http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/output/icmptypes.html

■以下のiptablesの設定を行い、今のところ通信は無い。

$ iptables -A INPUT -p icmp --icmp-type 13 -j LOG  \
    --log-prefix "Timestamp request " --log-level=info
$  iptables -A OUTINPUT -p icmp --icmp-type 13 -j LOG \
    --log-prefix "Timestamp request " --log-level=info

■tcpdumpでの確認

$ sudo tcpdump -X -nvvv icmp
$ sudo tcpdump -X -nvvv udp port 123 | grep Timestamp
          Reference Timestamp:  3539757033.003584424 (2012/03/03 18:50:33)
          Originator Timestamp: 3539757642.054388366 (2012/03/03 19:00:42)
          Receive Timestamp:    3539757642.146760582 (2012/03/03 19:00:42)
          Transmit Timestamp:   3539757772.995018243 (2012/03/03 19:02:52)
            Originator - Receive Timestamp:  +0.092372216
            Originator - Transmit Timestamp: +130.940629839

■ntpのコマンド一覧
 ※ntpdateはクライアント用の別プログラム

$ dpkg -L ntp | grep bin | grep -v bin\$ | column
/usr/sbin/ntp-wait      /usr/sbin/ntp-keygen    /usr/bin/ntpq
/usr/sbin/ntpd          /usr/bin/ntptrace       /usr/bin/tickadj
/usr/sbin/ntptime       /usr/bin/ntpdc          /usr/bin/ntpsweep

■うるう秒の考慮なしのシステムなので、以下は失敗する。
 また、「08:59:60」と「09:00:00」は同じUNIXTIMEを持つ。

$ date '+%s' --date "2012-07-01 08:59:60"
date: invalid date `2012-07-01 08:59:60'

$ date --date "@1341100800"
2012年  7月  1日 日曜日 09:00:00 JST
■以下は逆変換もOK。

$ date '+%s' --date "2012-07-01 08:59:59"
1341100799

$ date --date "@1341100799"
201271日 日曜日 08:59:59 JST

■よって、ntp同期を行ってUNIXTIMEを一秒戻す必要がある。

$ sudo apt-get install -y ntpdate

■ntpdが起動中に行うと以下のようになる。

$ date;sudo ntpdate ntp.nict.jp ;date
201233日 土曜日 19:43:25 JST
 3 Mar 19:43:34 ntpdate[8956]: adjust time server 133.243.238.243 offset -0.003219 sec
201233日 土曜日 19:43:34 JST

 調整幅が0.5秒未満:adjust time server
 調整幅が0.5秒以上:step time server

 参考:ntpdateでのメッセージ (2009/09/15)
 http://www.limitation-m.com/genecialist/index.php?itemid=41

■ntpdateのデバッグモードで手動同期する
 ※確実な作業の為、ntpdが同期するタイミングと被らないようにする。

$ sudo /etc/init.d/ntp stop; \
   date;sudo ntpdate -d ntp.nict.jp ;date; \
   sudo /etc/init.d/ntp start
Stopping NTP server: ntpd.
201233日 土曜日 19:46:04 JST
 3 Mar 19:46:04 ntpdate[9421]: ntpdate 4.2.6p2@1.2194-o Sun Oct 17 13:35:14 UTC 2010 (1)
transmit(133.243.238.163)
receive(133.243.238.163)
〜省略〜
transmit(133.243.238.243)
transmit(133.243.238.244)
server 133.243.238.163, port 123
stratum 1, precision -20, leap 00, trust 000
refid [NICT], delay 0.03528, dispersion 0.00018
transmitted 4, in filter 4
reference time:    d2fc74f2.00000000  Sat, Mar  3 2012 19:46:10.000
originate timestamp: d2fc74f2.48276b05  Sat, Mar  3 2012 19:46:10.281
transmit timestamp:  d2fc74f2.46e7ea9b  Sat, Mar  3 2012 19:46:10.276
filter delay:  0.03773  0.03563  0.03561  0.03528
         0.00000  0.00000  0.00000  0.00000
filter offset: 0.000163 0.000250 0.000304 0.000044
         0.000000 0.000000 0.000000 0.000000
delay 0.03528, dispersion 0.00018
offset 0.000044

server 133.243.238.164, port 123
stratum 1, precision -20, leap 00, trust 000
refid [NICT], delay 0.03555, dispersion 0.00020
transmitted 4, in filter 4
reference time:    d2fc74f2.00000000  Sat, Mar  3 2012 19:46:10.000
originate timestamp: d2fc74f2.7b7d7b29  Sat, Mar  3 2012 19:46:10.482
transmit timestamp:  d2fc74f2.7a17ab35  Sat, Mar  3 2012 19:46:10.476
filter delay:  0.03780  0.03586  0.03586  0.03555
         0.00000  0.00000  0.00000  0.00000
filter offset: 0.000223 0.000200 0.000262 0.000490
         0.000000 0.000000 0.000000 0.000000
delay 0.03555, dispersion 0.00020
offset 0.000490

server 133.243.238.243, port 123
stratum 1, precision -20, leap 00, trust 000
refid [NICT], delay 0.03407, dispersion 0.00027
transmitted 4, in filter 4
reference time:    d2fc74f2.00000000  Sat, Mar  3 2012 19:46:10.000
originate timestamp: d2fc74f2.ae55ad40  Sat, Mar  3 2012 19:46:10.680
transmit timestamp:  d2fc74f2.ad48a65d  Sat, Mar  3 2012 19:46:10.676
filter delay:  0.03737  0.03407  0.03435  0.03458
         0.00000  0.00000  0.00000  0.00000
filter offset: -0.00035 0.000182 0.000025 -0.00038
         0.000000 0.000000 0.000000 0.000000
delay 0.03407, dispersion 0.00027
offset 0.000182

server 133.243.238.244, port 123
stratum 1, precision -20, leap 00, trust 000
refid [NICT], delay 0.03413, dispersion 0.00006
transmitted 4, in filter 4
reference time:    d2fc74f2.00000000  Sat, Mar  3 2012 19:46:10.000
originate timestamp: d2fc74f2.e1a470ad  Sat, Mar  3 2012 19:46:10.881
transmit timestamp:  d2fc74f2.e07cafbe  Sat, Mar  3 2012 19:46:10.876
filter delay:  0.03664  0.03430  0.03413  0.03416
         0.00000  0.00000  0.00000  0.00000
filter offset: 0.000155 0.000215 0.000317 0.000236
         0.000000 0.000000 0.000000 0.000000
delay 0.03413, dispersion 0.00006
offset 0.000317

 3 Mar 19:46:12 ntpdate[9421]: adjust time server 133.243.238.243 offset 0.000182 sec
201233日 土曜日 19:46:12 JST
Starting NTP server: ntpd.

■後は以下を注意すれば良いのではないかと思う。

 ・ntpで時計を合わせていないシステムが無いか確認する。
 ・9時前に定期作業は終わらせておく事(その時間にバックアップを走らせたらどうなるのかな。。。w)
 ・過去をさかのぼる処理で、「1秒」が問題にならない事を確認する。(これはうるう秒に関わらない)
 ・ログイン/ログアウトを含み、その時間にわざわざ作業しない。(時間をずらせば済むこと)

■Windowsの「インターネット時刻」で更新出来ることを確認。
 DNSがある場合は名前で、DNSが無ければIP指定で。