在使用树莓派时,使用到了NTP相关的功能,由于树莓派没有RTC,每次开机后时间都会变为2016年,此时需要NTP进行校时。
本来是不想写这篇文章的,因为各大新版本的linux发行版,都已经使用timedatectl取代了ntpd、ntpdate等工具,现在还在跟他较劲其实是不合适的。但环境不能变,或许还有同伴跟我遇到一样的问题,那就把我遇到的问题整理一下。
现象
在联网环境下,树莓派可以获得正确时间,但在内网环境中使用内网NTP服务器时,却无法获得正确时间。
使用ntpq -p
命令查看时,配置好的ntp已经展现出来了,但是前面并没有 * 星号,表示没有使用该服务器。
remote refid st t when poll reach delay offset jitter
==============================================================================
120.25.115.20 10.137.53.7 2 u 43 64 377 49.203 -0.294 0.224
大概就像这个样子。
测试NTP Server是否正常命令
如果测试不过的话,那先把对方的Ntp server搞定才往下鼓捣吧^_^
Windows下:
w32tm /stripchart /computer:<NTP服务器的IP地址>
Linux下:
ntpdate -d <NTP服务器的IP地址>
Linux配置调试命令
参考链接1:关于ntpq更具体的说明,可以参见 ntp详解
参考链接2:其他可用文档可以参见How to debug ntp issues
使用ntpq
命令进入到交互模式,然后输入as
命令,既可以查看服务器的状态
ntpq> as
ind assid status conf reach auth condition last_event cnt
===========================================================
1 57887 963a yes yes none sys.peer sys_peer 3
其中condition
一列为当前状态。我之前出现了reject的字样,表示ntp拒绝使用该地址。
assid
可以利用它具体查看当前id的状态。
使用rv <assid>
命令即可获取更详细的信息。
ntpq> rv 57887
associd=57887 status=963a conf, reach, sel_sys.peer, 3 events, sys_peer,
srcadr=120.25.115.20, srcport=123, dstadr=192.168.0.223, dstport=123,
leap=00, stratum=2, precision=-25, rootdelay=0.107, rootdisp=1.007,
refid=10.137.53.7,
reftime=e43ceba8.670ac35b Wed, May 5 2021 18:02:16.402,
rec=e43cebaf.35f3e35f Wed, May 5 2021 18:02:23.210, reach=377,
unreach=0, hmode=3, pmode=4, hpoll=6, ppoll=6, headway=17, flash=00 ok,
keyid=0, offset=-0.363, delay=49.355, dispersion=4.420, jitter=0.310,
xleave=0.096,
filtdelay= 49.57 49.37 49.40 49.94 49.36 49.78 49.35 49.50,
filtoffset= 0.04 -0.08 -0.08 0.12 -0.19 -0.06 -0.36 -0.42,
filtdisp= 0.00 0.99 1.97 2.93 3.90 4.88 5.87 6.86
其中flash=00
为状态码,可以根据参考链接2文章中的内容进行排错。
原因总结
1、NTP拥有一个panic
参数,默认为1000,含义为当服务器时间与本地时间超过1000s秒是,ntp会拒绝修改。这是引起内网中无法进行校正的一个原因。在ntp.conf文件中,添加tinker panic 0
即可
2、NTP还拥有一个tos maxdist
参数,Linux的NTP不会信任偏差超过1.5s的的时钟源,Windows的W32Time作为NTP时钟服务是不被认可的,会出现被拒绝的情况。
解决方案参考链接:链接
总结
目前发现了这两个参数会影响ntp同步,坑太多了,还好已经被新的timedatectl取代了,可喜可贺