当我查询 NTP 守护进程的状态时,ntpdc -c sysinfo
我得到以下输出:
system peer: 0.0.0.0
system peer mode: unspec
leap indicator: 11
stratum: 16
precision: -20
root distance: 0.00000 s
root dispersion: 12.77106 s
reference ID: [73.78.73.84]
reference time: 00000000.00000000 Thu, Feb 7 2036 7:28:16.000
system flags: auth monitor ntp kernel stats
jitter: 0.000000 s
stability: 0.000 ppm
broadcastdelay: 0.000000 s
authdelay: 0.000000 s
这表明 NTP 同步失败。但系统时间精确度在 1 秒以内。当我在没有网络连接的情况下运行系统与现在相同的时间时,系统时间将偏差约 10 秒。
此行为表明系统有另一种同步时间的方式。我意识到还有systemd-timesyncd.service
(配置文件位于/etc/systemd/timesyncd.conf
)并timedatectl status
给了我正确的时间:
Local time: Thu 2016-08-25 10:55:23 CEST
Universal time: Thu 2016-08-25 08:55:23 UTC
RTC time: Thu 2016-08-25 08:55:22
Time zone: Europe/Berlin (CEST, +0200)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: yes
Last DST change: DST began at
Sun 2016-03-27 01:59:59 CET
Sun 2016-03-27 03:00:00 CEST
Next DST change: DST ends (the clock jumps one hour backwards) at
Sun 2016-10-30 02:59:59 CEST
Sun 2016-10-30 02:00:00 CET
所以我的问题是这两种机制有什么区别?其中之一已被弃用吗?它们可以并行使用吗?当我想要查询 NTP 同步状态时,我应该信任哪一个?
(请注意,我有一个不同的系统(在不同的网络中),这两种方法都表明成功并产生正确的时间。)
答案1
systemd-timesyncd 基本上是一个小型的仅限客户端的 NTP 实现,或多或少与较新的 systemd 版本捆绑在一起。它比完整的 ntpd 更轻量,但仅支持时间同步 - 即它不能充当其他计算机的 NTP 服务器。它旨在取代客户端的 ntpd。
您不应该并行使用两者,因为理论上它们可能会选择不同的时间服务器,这些服务器之间有轻微的延迟,导致您的系统时钟周期性地“跳跃”。
ntpdc
要获取状态,不幸的是,如果您使用 ntpd,则需要timedatectl
使用 timesyncd,据我所知,没有任何实用程序可以读取两者。
答案2
systemd-timesyncd 没有时钟规则:时钟没有经过训练或补偿,并且内部时钟随时间的漂移也没有减少。它具有调整轮询间隔的基本逻辑,但如果不加以约束,主机将永远处于不均匀的时间,因为 systemd-timesyncd 以它认为近期漂移所需的任何间隔推送或拉动。它也无法评估远程时间源的质量。您不太可能获得超过 100 毫秒的准确度。这对于笔记本电脑等简单的最终用户设备来说已经足够了,但对于需要更高时间精度的分布式系统来说,它肯定会导致问题。