如果网络连接稍晚,ntpd 将不会同步时钟

如果网络连接稍晚,ntpd 将不会同步时钟

在我们的生产设备中,我遇到了 ntpd 问题。我为生产设备启用了 NTP 功能,发现一个问题。

我们在盒子的初始化过程中启动 ntpd 守护进程。在此期间没有互联网连接。下面是我的小ntp.conf文件

driftfile  /etc/ntp.drift
logconfig =syncstatus
server pool.ntp.org iburst

一旦界面出现,我们的盒子就会晚一点才能连接到互联网。那时我看到 ntpd 没有同步时钟。当我这样做时ntpq -c as,我得到了no association id's found。我确实等了将近 30 分钟,但仍然得到了no association id's found

我必须重新启动 ntpd。重新启动后,ntpd 会同步时钟,一切正常。但如果我重新启动我的盒子,则会出现同样的问题。一旦盒子启动并且可以访问互联网,我必须再次重新启动 ntpd。

有谁遇到过类似的问题吗?

我是否应该延迟启动 ntpd 直到时间接口出现?

更新

我做了一些实验,并用 替换了 ,server pool.ntp.org iburst这样pool pool.ntp.org iburstntpd 就可以自动同步时钟。我不必重新启动 ntpd。因此,我又产生了一个问题。

当我server用替换时发生了什么pool

我应该总是使用pool关键字而不是吗server

我什么时候该用pool,什么时候该用server

我做了一些研究,发现 pool is the same as server, except it resolves one name into several addresses and uses them all 如果他们做同样的事情那为什么server pool.ntp.org iburst对我不起作用却又pool pool.ntp.org iburst起作用了。

更新

按照建议,我使用了pool而不是 ,server但我的时钟仍然无法在启动时同步。之前no association id's found是可以同步的,但使用pool后,它显示了列表。

GW:/admin# ntpq -c lpeer
     remote           refid      st t when poll reach   delay    offset  jitter
===================================================================== =========
 time.google.com .POOL.          16 p    -   64    0    0.000   +0.000   0.002

GW:/admin# ntpq -np
      remote           refid      st t when poll reach   delay   offset  jitter

 time.google.com .POOL.          16 p    -   64    0    0.000   +0.000   0.002

GW:/admin# ntpq -c as
ind assid status  conf reach auth condition  last_event cnt
===========================================================
  1 34173  8811   yes  none  none    reject    mobilize  1

GW:/admin# ntpq -c "rv 34173"
associd=34173 status=8811 conf, bcast, sel_reject, 1 event, mobilize,
srcadr=0.0.0.0, srcport=0, srchost="time.google.com", dstadr=0.0.0.0,
dstport=0, leap=11, stratum=16, precision=-19, rootdelay=0.000,
rootdisp=0.000, refid=POOL, reftime=(no time), rec=(no time), reach=000,
unreach=0, hmode=3, pmode=0, hpoll=6, ppoll=10, headway=0,
flash=1400 peer_dist, peer_unreach, keyid=0, offset=+0.000, delay=0.000,
dispersion=16000.000, jitter=0.002,
filtdelay=     0.00    0.00    0.00    0.00    0.00    0.00      0.00    0.00,
filtoffset=   +0.00   +0.00   +0.00   +0.00   +0.00   +0.00   +0.00   +0.00,
filtdisp=   16000.0 16000.0 16000.0 16000.0 16000.0 16000.0 16000.0 16000.0

我看到闪存状态为。我在 ntp 文档中找不到闪存状态1400是什么意思。14001400

更新

它开始工作了。我替换iburstminpoll 3 maxpoll 4,之后它在重启时就可以工作了。我像这样使用了池 pool pool.ntp.org minpoll 3 maxpoll 4。我不确定这个变化有什么不同。

我还读到我们应该避免使用 minpoll 和 maxpoll。 Too frequent for a sustained period and public NTP services may block you. ntpd is already good at dynamically selecting the pool interval.

无论如何,谢谢大家的帮助。

答案1

当您向 ntpd 提供服务器时,它在启动时将主机名解析为 IP 地址,并尝试使用该 IP 地址同步时间。如果该主机名无法解析,它会将其删除。即使它确实解析了它,它也不会记住主机名,只会记住 IP 地址。

如果您线路中的服务器server是具有固定 IP 地址(而不是动态池)的本地主机,则可以用真实 IP 地址替换主机名,并且即使在启动时网络未启动,也不会删除它。

如果您为 ntpd 提供一个池,它会保留主机名(并用 标记.POOL.)。它会定期(包括启动时)在 DNS 中解析该主机名,并将其获取的任何 IP 添加为单独的条目,并删除一些最不利的 IP。

ntpq -np 你可以使用以下命令或等效命令查看其中的一些内容ntpq -n -c peers

请注意,所有这些问题还存在时间问题和 ntpd 版本问题。此确切问题被归类为 ntpd 中的错误,并且有几种修复方法。如果主机名解析失败,某些版本的 ntpd 会推迟解析,但最终还是会放弃;因此,如果您通过短暂断开网络并重新连接进行测试,则可能不会出现此问题。此外,ntp 使用轮询算法,该算法会成倍增加可访问和不可访问主机的主机轮询时间(取决于您的时钟稳定性和主机作为时间同步的实用性),上限为 1024 秒(32 分钟),因此如果网络可达性发生变化,它可能需要这么长时间才能注意到。(轮询时间和间隔列于ntpq -np

此外,一些启动脚本使用 ntpdate 或类似工具将系统时钟设置为 ntp.conf 中的服务器,以便在 ntpd 启动之前部分同步时钟。这是一次一次性尝试,如果失败,ntpd 可能会以大错特错的时钟启动。如果只是轻微错误,ntp 会修复它,但如果错误严重,ntpd 可能会拒绝同步时钟,在某些情况下和版本的 ntpd 可能会崩溃或退出。某些版本的 ntpd 有自己的一次性时钟大步选项。

相关内容