我有一台 NTP 服务器,它的时间设置错误,比当前时间晚了 7 个小时(机器发货后时区发生了变化,但时间没有变化)。服务器本身不同步,只有本地时钟。在这台服务器上,超过 10 个客户端同步了它们的时钟,这导致整组服务器的时间都错误。
我如何更改 NTP 服务器上的时间,以便更正发生,并且所有客户端也都会得到更正?我首先通过“date MMDDhhmm”进行了修复测试,这使得客户端与服务器断开连接(ntpq 中服务器名称前面的星号消失了)。
我不知道当我手动更改所有服务器的时间(将时钟调回 7 小时,导致系统拥有未来的文件)时,所有同步服务会如何表现。可能会发生崩溃,系统会为工厂生产提供服务。
答案1
当您谈论时间的转换时,您通常谈论的是少量的时间。修复是通过调用 来执行的adjtime()
,或者在 Linux 上可能是adjtimex()
。
来自 ntpd 手册页:
-x Normally, the time is slewed if the offset is less than the step
threshold, which is 128 ms by default, and stepped if above the
threshold. This option sets the threshold to 600 s, which is
well within the accuracy window to set the clock manually.
Note: Since the slew rate of typical Unix kernels is limited to
0.5 ms/s, each second of adjustment requires an amortization
interval of 2000 s. Thus, an adjustment as much as 600 s will
take almost 14 days to complete. This option can be used with
the -g and -q options. Note: The kernel time discipline is dis‐
abled with this option.
那么,我怀疑您是否愿意以这种速度等待 7 小时的校正。这将需要一年多的时间。在 Linux 上,32 位系统上的 adjtime 实际上被限制在约 2000 秒的增量内。64 位系统可能不会引起这个问题,但速度这一变化何时生效仍是一个令人担忧的问题。
因此,在 Linux 实现中存在一个阈值,大概在其他实现中也是如此,在此阈值之下,您会得到一个非常缓慢的“摆动”,但在此阈值之上,主机和客户端上的系统时钟将会逐步提高,这可以进行得更快。
还会有另一个阈值,如果主服务器和客户端之间的时间差异太大,客户端将认为存在错误并且不会更新。来自 ntpd 手册页:
-g Normally, ntpd exits with a message to the system log if the
offset exceeds the panic threshold, which is 1000 s by default.
This option allows the time to be set to any value without
restriction; however, this can happen only once. If the thresh‐
old is exceeded after that, ntpd will exit with a message to the
system log. This option can be used with the -q and -x options.
请注意,该-g
选项几乎肯定不是为守护进程设置的。它通常用作ntpd -gq
,在系统启动时一次性运行,或手动运行,其行为与 非常相似ntpdate
。不过,恐慌阈值可能在编译时可配置,因此请查看操作系统供应商的手册页。
编写一个程序,使用您选择的任何频率和调整大小进行一系列时间调整,这非常简单。您可以在 ntp master 上执行此操作,它会将调整后的时间提供给其客户端,但您需要知道客户端系统将接受的最大调整大小,以及什么最小阈值会导致它们执行非常缓慢的调整。为了安全起见,您应该调查客户端系统上的 ntp 实现。
如果您要更新的系统具有与 Linux 上默认 ntpd 类似的特性,但没有此-x
选项,那么您可以使用每 5 秒进行半秒调整的机制,并在大约 3 天内实现同步。进行不跨越秒边界的亚秒级调整可能有助于避免触发两次 cron 作业之类的事情,但您可能会发现某种副作用。
如果您遇到服务器不再同步的情况,那么事情就会变得更加混乱。如果可行的话,我希望监控时差,如果某些服务器不再同步,则自动停止自动定期更新并发出警报。
答案2
如您所知,如果时钟变化在很短的时间间隔内,客户端将保持同步。在某些系统上,这个时间间隔只有五分钟。您的系统可能是 10 分钟。您可以在该时间间隔内跳转时钟,客户端将跟踪时钟。
我可以看到四个选项:
什么也不做,永远生活在错误的时间里。
将时钟重置四分钟(如果间隔为 600 秒,则重置九分钟),然后重复令人厌烦在那一年mc0e有计算是必要的。您确实需要使用脚本来执行此操作。今年大部分时间的时间都可能不正确。记录大量时间偏移量,以便与生产报告进行关联。
将服务器停机七小时(圣诞节,有人要吗?),然后一次性修好所有时钟。
调整时钟并确保每个人都知道会有 7 小时的报告重叠。但是,这些人应该已经知道生产时间有 7 个小时的重叠,所以您可能会发现这是可以接受的。(显然我不知道这会对您的工厂流程产生什么影响。)
这些解决方案都不理想。如果生产报告时间很重要,那么选项 2 可能是最糟糕的选择。