うるう秒の検証に使えそう ntptime

■「ntp」に付属のntptimeコマンドが便利。
 「/usr/bin/ntpdc」でクライアントやサーバが一覧出来るのも良い。
 パッケージ付属のコマンドはちゃんと見ておくべきですね。。。

$ /usr/sbin/ntptime
ntp_gettime() returns code 0 (OK)
  time d2ff5943.5b6de000  Tue, Mar  6 2012  0:24:51.357, (.357145),
  maximum error 531016 us, estimated error 16 us
ntp_adjtime() returns code 0 (OK)
  modes 0x0 (),
  offset 0.000 us, frequency 0.000 ppm, interval 1 s,
  maximum error 531016 us, estimated error 16 us,
  status 0x1 (PLL),
  time constant 7, precision 1.000 us, tolerance 500 ppm,

■ntp_gettimeについて

 参考:マニュアルページ  ― NTP_GETTIME
 http://www.nxmnpg.com/ja/2/ntp_gettime

■「ntptime」コマンドのリターンコードを見るのが最も近道のようだ。

$ for num in `seq 0 300`;do /usr/sbin/ntptime | grep return;sleep 1;done
ntp_gettime() returns code 5 (ERROR)
ntp_adjtime() returns code 5 (ERROR)

0 TIME_OK	 全てが OK で、閏秒の警告もありません。
1 TIME_INS	 正の閏秒の警告です。 この日の最後の 23:59:59 の後に追加の 1 秒が挿入されます。
2 TIME_DEL	 負の閏秒の警告です。 この日の最後の 23:59:59 はスキップされます。
3 TIME_OOP	 閏秒の経過中です。
4 TIME_WAIT	 閏秒が発生しました。
5 TIME_ERROR	 クロックが同期していません。

■例えば以下のように強制手動同期

$ sudo /etc/init.d/ntp stop; \
  sudo /usr/sbin/ntpdate ntp.nict.jp; \
  sudo /etc/init.d/ntp start

■tcpdumpで監視中に2回程パケットが流れた時点でステータスが変わった。

$ sudo tcpdump -X -nvvv -i eth0 udp port 123  | grep Timestamp
          Reference Timestamp:  3539947147.824472069 (2012/03/05 23:39:07)
          Originator Timestamp: 3539948692.818381011 (2012/03/06 00:04:52)
          Receive Timestamp:    3539948649.433728277 (2012/03/06 00:04:09)
          Transmit Timestamp:   3539948718.415692448 (2012/03/06 00:05:18)
            Originator - Receive Timestamp:  -43.384652704
            Originator - Transmit Timestamp: +25.597311496
          Reference Timestamp:  3539948761.000000000 (2012/03/06 00:06:01)
          Originator Timestamp: 3539948718.415692448 (2012/03/06 00:05:18)
          Receive Timestamp:    3539948761.819168806 (2012/03/06 00:06:01)
          Transmit Timestamp:   3539948761.819169580 (2012/03/06 00:06:01)
            Originator - Receive Timestamp:  +43.403476327
            Originator - Transmit Timestamp: +43.403477132

■ちなみに。。。STEPモードはパケットログに載る。

$ grep -B 5 "STEP" 123.log | grep "STEP\|Timestamp"
          Reference Timestamp:  3539943710.283126950 (2012/03/05 22:41:50)
          Originator Timestamp: 0.000000000 [|ntp]
        0x0030:  e300 06ec 0000 0000 0000 0015 5354 4550  ............STEP
          Transmit Timestamp:   3539945922.102021895 (2012/03/05 23:18:42)
            Originator - Receive Timestamp:  0.000000000
            Originator - Transmit Timestamp: 3539945922.102021895 (2012/03/05 23:18:42)
        0x0020:  0000 0000 0000 0018 5354 4550 d2ff 411e  ........STEP..A.
          Transmit Timestamp:   3539945924.102016717 (2012/03/05 23:18:44)
            Originator - Receive Timestamp:  +0.095962613
            Originator - Transmit Timestamp: +1.889134585
        0x0020:  0000 0000 0000 001a 5354 4550 d2ff 411e  ........STEP..A.

■STEPモードで1秒の誤差なら5分程度で修正出来るようだが、
 詳しい検証は、また後日としよう。

$ for num in `seq 0 300`;do /usr/sbin/ntptime | grep return;sleep 1;done
ntp_gettime() returns code 0 (OK)
ntp_adjtime() returns code 0 (OK)

■dateコマンドで1秒進める

$ echo `date '+%H:%M:%S'` | \
  awk -F\: '{printf "%02d:%02d:%02d" ,$1 ,$2 ,($3+61)%60}' | \
  sudo date '+%H:%M:%S' --set "`xargs`"

■dateコマンドで1秒戻す

$ echo `date '+%H:%M:%S'` | \
  awk -F\: '{printf "%02d:%02d:%02d" ,$1 ,$2 ,($3+59)%60}' | \
  sudo date '+%H:%M:%S' --set "`xargs`"

さて、もうこんな時間か。。。