我正在尝试模拟即将到来的闰秒,以便可以测试我的应用程序在那个时间的行为,但我不确定我是否正确设置了测试。
在 Oracle VirtualBox 虚拟机中的 CentOS 7.2.1511 上,如何设置 NTP并开始测试:
yum install ntp
echo "server 127.127.1.0" > /etc/ntp.conf
echo "fudge 127.127.1.0 stratum 10" >> /etc/ntp.conf
echo "leapfile \"/var/ntp/leap-seconds.list\"" >> /etc/ntp.conf
mkdir /var/ntp
wget -P /var/ntp https://www.ietf.org/timezones/data/leap-seconds.list
setenforce 0 # avoids having to configure SELinux access to the .list
date -s "2016-12-31 23:55"
service ntpd restart
但是,运行以下命令会显示没有任何类型的时间步骤:
$ i=0; while true; do echo -n "$i: "; date -u; ((i++)); sleep 1; done
(..)
45: Sat 31 Dec 23:59:56 UTC 2016
46: Sat 31 Dec 23:59:57 UTC 2016
47: Sat 31 Dec 23:59:58 UTC 2016
48: Sat 31 Dec 23:59:59 UTC 2016
49: Sun 1 Jan 00:00:00 UTC 2017
50: Sun 1 Jan 00:00:01 UTC 2017
51: Sun 1 Jan 00:00:02 UTC 2017
52: Sun 1 Jan 00:00:03 UTC 2017
53: Sun 1 Jan 00:00:04 UTC 2017
(..)
我正在观察输出的结果,每一行都是一秒接一秒地打印出来的。
并且(虽然这很难证明)我在我的应用程序生成的数据文件中看不到任何时钟偏移的证据;我的 NTP 配置无论如何都应该是步进而不是旋转:
$ cat /etc/sysconfig/ntpd
OPTIONS="-g"
我的本地 refclock NTP 服务器似乎在某种程度上正在执行这项工作,因为系统日志显示:
Dec 31 23:59:59 localhost ntpd[1871]: 0.0.0.0 051b 0b leap_event
我在这里遗漏了什么?
答案1
我想将此作为对 grawity 答案的评论添加,但我没有足够的回复。虽然他/她是正确的,非正确时区没有考虑到名为“60”的秒的存在(即您不会看到时间戳 23:59:60),但 Linux 内核仍应通过重复 59 秒两次来插入闰秒(请参阅这里了解更多信息)。因此,您应该会看到时间戳 23:59:59 的重复。我已经重现了您所看到的内容,因此您并没有疯,但我仍在努力找出原因。
需要检查的一件事是,您的本地 ntp 守护程序确实插入了闰秒待定标志(可以使用 Wireshark 或类似程序检查数据包中的 LI=1,或者使用此 ntpq 命令:
ntpq -c 'lassoc' -c "mrv &1 &999 leap,srcadr,stratum"
寻找 leap=01。我的也是,所以调查仍在继续……