跳转至内容

chrony

来自 ArchWiki

chrony 是一个实现了 网络时间协议 (NTP) 的客户端和服务器。它对漫游友好,专门为并非一直在线的系统而设计。它还可以跟踪硬件时钟 (RTC) 的漂移。详情请参阅项目的 功能列表

安装

安装 chrony 软件包。

配置

该软件包会安装一个带有注释的 /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
注意 rtcsyncrtcfile 不能同时使用。使用 rtcfile 还会阻止 hwclocktimedatectl 等工具访问 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

  • serverpoolxleavepresend 可能有助于在不产生任何兼容性成本的情况下提高准确性。
  • hwtimestamp:某些网络接口卡可以对其数据包进行时间戳标记,以抵消网络栈中的延迟。使用 hwtimestamp * 开启:在不支持此功能的适配器上该选项不会产生任何效果。
  • tempcomp:跟踪软件时钟误差(通常由主板晶体温度变化引起)与温度传感器之间的关系。适用于追求极致精度的人员。

用法

启动 chronyd

该软件包提供了 chronyd.servicechrony-wait.service,详见 systemd

  • systemd-timesyncd.servicechronyd 冲突,因此如果你想正确地 启用 chronyd,你需要先 禁用 它。

告知 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

在线/离线状态可以通过 networkmanagerconnman 的调度程序服务自动处理,详见下文。

检查配置的 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

参阅 dhcpcd-run-hooks(8)

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.