chrony
本文介绍如何设置和运行 chrony,一个替代的 NTP 客户端和服务器,它对漫游友好,专为非始终在线的系统而设计。
安装
配置
最小的可用配置文件(使用 IP 地址而不是主机名)可能如下所示
/etc/chrony.conf
server 1.2.3.4 offline server 5.6.7.8 offline server 9.10.11.12 offline driftfile /var/lib/chrony/drift rtconutc # This sets the rtc, but throws out RTC drift tracking. rtcfile is the recommended alternative: see "RTC options" below. rtcsync
请参阅 /usr/share/doc/chrony/README
,它将为您指出您可能仍然存在的任何疑问的正确答案。在线文档也可用。 另请参阅相关的 man 手册页: chronyc(1), chrony.conf(5), chronyd(8)。
NTP 服务器
您在 /etc/chrony.conf
中定义的第一个内容是您的机器将同步到的服务器。NTP 服务器在一个分层系统中分类,该系统具有许多级别,称为层:被认为是独立时间源的设备被分类为层 0 源;直接连接到层 0 设备的服务器被分类为层 1 源;连接到层 1 源的服务器然后被分类为层 2 源,依此类推。
必须理解的是,服务器的层不能作为其准确性或可靠性的指标。通常,层 2 服务器用于通用同步目的:如果您还不知道您将要连接的服务器,您应该使用 pool.ntp.org 服务器 (备用链接) 并选择最靠近您位置的服务器池。
以下行告诉 chrony 从 NTP 池中选择 4 个源(chrony 对池有特殊的处理,以免混淆其对服务器端漂移的跟踪),并在启动时使用突发行为
pool 2.arch.pool.ntp.org iburst maxsources 4
离线计算机
如果您的计算机在启动时未连接到互联网,建议使用 offline 选项,告诉 Chrony 不要尝试连接到服务器,直到收到指令为止
pool 2.arch.pool.ntp.org iburst maxsources 4 offline
使用 IP 地址而不是主机名,或者将主机名映射到 /etc/hosts
文件中的 IP 地址也可能是一个好主意,因为在建立连接之前,DNS 解析将不可用。
使用 NTS 服务器
自 4.0 版本 [1] 以来,chrony 支持 网络时间安全 (NTS),这是一种加密安全的 NTP 变体。要使用它,请添加一个 NTS 安全的服务器,并在末尾指定 nts
,如下所示
server time.cloudflare.com iburst nts
您可以在 此处 找到所有已知的支持 NTS 的服务器列表。
实时时钟
在启动期间,初始时间从硬件实时时钟 (RTC) 读取,然后设置系统时间,并在 chrony 守护程序运行一段时间后,在几分钟内同步。如果硬件时钟不同步,则初始系统时间可能与真实时间相差几分钟。Chrony.conf 有三种不同的机制来处理 RTC
- 第一种机制是
rtcsync
,它只是定期将当前时间写入 RTC。这是 ntpd 使用的经典方法,但会关闭 RTC 漂移跟踪:这对间歇运行的桌面不利,后者在 RTC 上进行了大量计时。 - 第二种机制是
rtcautotrim
,它仅在 RTC 时间超过差异阈值时才覆盖 RTC 时间。此方法可以与rtcfile
一起使用,后者允许跟踪 RTC 错误。 - 最后一种机制是不对 RTC 做任何事情,但将它的错误和漂移记录在
rtcfile
中。RTC 时间将保持错误,但系统时间将变为正确,因为 chrony 知道它有多错误。chronyc 中的rtctrim
命令 仍然可以根据需要同步 RTC
# chronyc chronyc> trimrtc 200 OK chronyc> quit
rtcsync
和 rtcfile
不能同时使用。使用 rtcfile
还会阻止诸如 hwclock
和 timedatectl
之类的工具访问 RTC。有关详细信息,请参阅 chrony.conf(5) § 系统时钟。此外,rtconutc
描述了 RTC 是否在 UTC 上运行。
示例:间歇运行的桌面
间歇运行的桌面将需要使用 rtcfile
来跟踪 RTC 错误。一台运行 Arch Linux 五年的机器,在 RTC 内累积了 300 秒的误差。重启后,chrony 花了很长时间才使用上述配置调整此差异。如果我们改为使用以下配置
/etc/sysconfig
不可用,必须创建。/etc/sysconfig/chronyd
OPTIONS='-r -s'
/etc/chrony.conf
dumpdir /var/lib/chrony rtcfile /var/lib/chrony/rtc
有趣的是,这仍然使 RTC 过时,但在每次重新启动后,chrony 都会调整 RTC 的累积误差,并且即使在启动后不久,系统时间也与 NTP 非常同步。
RTC 仍然过时,因为我们忘记添加 rtcautotrim
行来告诉 chrony 调整 RTC。如果我们添加它,RTC 和系统时间都将变为正确。
其他有趣的选项
实用性
makestep
:允许 chrony 通过突然设置而不是频率调整来更改时间。这样做可能会使正在运行的程序感到惊讶,但有助于修复较大的错误。对于经常离线的计算机,makestep 0.1 3
可能是理想的选择:只有前三个更改将被步进,因此意外仅限于计算机启动。
精度
server
和pool
:xleave
和presend
可能有助于提高精度,而不会产生任何兼容性成本。hwtimestamp
:某些网络接口卡可以对其数据包进行时间戳,以考虑网络堆栈中的延迟。使用hwtimestamp *
打开它:这在不支持此类适配器的情况下不会执行任何操作。tempcomp
:跟踪软件时钟错误(通常是由于主板晶体温度变化)和温度传感器之间的关系。适用于那些渴望极致精度的人。
用法
启动 chronyd
该软件包提供了 chronyd.service
,请参阅 systemd 以了解详细信息。
告知 chronyd 已连接互联网
如果您已连接到互联网,请运行
# chronyc chronyc> online 200 OK chronyc> exit
您可能还对显示状态的 activity
选项感兴趣
# chronyc activity 200 OK 3 sources online 0 sources offline 0 sources doing burst (return to online) 0 sources doing burst (return to offline) 0 sources with unknown address
现在,Chrony 应该连接到配置的时间服务器并在需要时更新您的时钟。要告知 chrony 您不再连接到互联网,请执行以下操作
# chronyc offline 200 OK # chronyc activity 200 OK 0 sources online 3 sources offline 0 sources doing burst (return to online) 0 sources doing burst (return to offline) 0 sources with unknown address
在线/离线状态可以由 networkmanager 和 connman 的调度器服务自动处理,请参见下文。
检查配置的 NTP 服务器
要检查 chrony 实际使用的 NTP 服务器以及它们的精度,您可以使用 chronyc -N 'sources -a -v'
$ chronyc -N 'sources -a -v' .-- Source mode '^' = server, '=' = peer, '#' = local clock. / .- Source state '*' = current best, '+' = combined, '-' = not combined, | / 'x' = may be in error, '~' = too variable, '?' = unusable. || .- xxxx [ yyyy ] +/- zzzz || Reachability register (octal) -. | xxxx = adjusted offset, || Log2(Polling interval) --. | | yyyy = measured offset, || \ | | zzzz = estimated error. || | | \ MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^+ ptbnts1.ptb.de 1 6 377 50 -38us[ -13us] +/- 8723us ^* ptbnts2.ptb.de 1 6 377 49 +2061ns[ +27us] +/- 7538us ^+ nts.ntp.se 2 6 377 51 +594us[ +619us] +/- 15ms ^+ nts.sth1.ntp.se 2 6 377 51 +655us[ +680us] +/- 15ms ^+ nts.sth2.ntp.se 2 6 377 53 +991us[+1016us] +/- 15ms ^+ time.cloudflare.com 3 6 377 49 -1250us[-1250us] +/- 10ms
通知网络状态
如果您已在 chrony.conf
中将池指定为离线,则需要告知 chrony 网络状态已更改。
您可以使用 chronyc 通知 chrony 您的网络配置已更改,也可以为您的相关网络配置管理器使用调度器。
NetworkManager
chronyd 可以通过使用 NetworkManager 的调度器脚本,随网络连接一起进入在线/离线模式。使用随附的上游 NetworkManager 调度器创建符号链接
ln -s /usr/share/doc/chrony/examples/chrony.nm-dispatcher.onoffline /etc/NetworkManager/dispatcher.d/20-chrony-onoffline.sh
您也可以从 AUR 安装 networkmanager-dispatcher-chronyAUR。
netctl
从 AUR 安装 netctl-dispatcher-chronyAUR。这会向 netctl 添加一个挂钩,该挂钩会自动为任何连接运行。
dhcpcd
创建以下挂钩
/etc/dhcpcd.exit-hook
if $if_up; then chronyc online elif $if_down; then chronyc offline fi