chrony
chrony 是一个实现了 网络时间协议 (NTP) 的客户端和服务器。它对漫游友好,专门为并非一直在线的系统而设计。它还可以跟踪硬件时钟 (RTC) 的漂移。详情请参阅项目的 功能列表。
安装
配置
该软件包会安装一个带有注释的 /etc/chrony.conf 配置文件。一个最简单的实用配置文件(使用 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 rtcsync
rtcsync 选项会设置 RTC,但会放弃使用替代的 rtcfile 来跟踪 RTC 漂移,请参阅下文的 #实时时钟 (RTC)。
另请参阅 项目 FAQ 以及 chronyc(1), chrony.conf(5), chronyd(8) 手册页。
NTP 服务器
你在 /etc/chrony.conf 中定义的第一件事就是你的机器将同步的服务器。NTP 服务器被分为一个具有多个层级(称为 strata)的等级系统:被认为是独立时间源的设备被分类为 stratum 0 源;直接连接到 stratum 0 设备的服务器被分类为 stratum 1 源;连接到 stratum 1 源的服务器则被分类为 stratum 2 源,依此类推。
必须理解的是,服务器的 stratum 不能作为其准确性或可靠性的指标。通常,stratum 2 服务器用于一般的同步目的:如果你还不知道要连接哪些服务器,你应该使用 pool.ntp.org 服务器 (备用链接) 并选择离你位置最近的服务器池。
以下行告诉 chrony 从 NTP 池中选择 4 个源(chrony 对池有特殊处理,以免干扰其对服务器端漂移的跟踪),并在启动时使用 burst 行为:
pool 2.arch.pool.ntp.org iburst maxsources 4
离线计算机
如果你的计算机在启动时未连接到互联网,建议使用 offline 选项告知 chrony 在收到指令前不要尝试连接服务器。
pool 2.arch.pool.ntp.org iburst maxsources 4 offline
使用 NTS 服务器
自 4.0 版本 [1] 起,chrony 支持 网络时间安全 (NTS),这是一种经过加密安全的 NTP 变体。要使用它,请添加一个 NTS 安全服务器,并在末尾指定 nts,如下所示:
server time.cloudflare.com iburst nts
你可以在 https://github.com/jauderho/nts-servers 找到一份维护的已知支持 NTS 的服务器列表。
通过 /etc/chrony.conf 中的 authselectmode 选项,可以配置 NTS 策略。
实时时钟 (RTC)
在引导过程中,初始时间从硬件实时时钟 (RTC) 读取并设置系统时间,然后在 chrony 守护进程运行一段时间后,在几分钟内进行同步。如果硬件时钟不同步,则初始系统时间可能会与真实时间相差几分钟。chrony.conf 提供了三种处理 RTC 的不同机制:
- 第一种机制是
rtcsync,它简单地定期将当前时间写入 RTC。这是 ntpd 使用的经典方法,但它会关闭 RTC 漂移跟踪:这对于间歇性运行的桌面系统不利,因为此类系统大量依赖 RTC 进行计时。 - 第二种机制是
rtcautotrim,它仅在时间差超过阈值时才覆盖 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可能是理想的:只有前三次更改将采用步进方式,从而将影响限制在计算机启动阶段。
Precision
server和pool:xleave和presend可能有助于在不产生任何兼容性成本的情况下提高准确性。hwtimestamp:某些网络接口卡可以对其数据包进行时间戳标记,以抵消网络栈中的延迟。使用hwtimestamp *开启:在不支持此功能的适配器上该选项不会产生任何效果。tempcomp:跟踪软件时钟误差(通常由主板晶体温度变化引起)与温度传感器之间的关系。适用于追求极致精度的人员。
用法
启动 chronyd
该软件包提供了 chronyd.service 和 chrony-wait.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 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 调度程序创建调度任务:
cp /usr/share/doc/chrony/examples/chrony.nm-dispatcher.onoffline /etc/NetworkManager/dispatcher.d/20-chrony-onoffline.sh chmod 700 /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