chrony

来自 ArchWiki

本文介绍如何设置和运行 chrony,一个替代的 NTP 客户端和服务器,它对漫游友好,专为非始终在线的系统而设计。

安装

安装 chrony 软件包。

配置

最小的可用配置文件(使用 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
注意: 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 可能是理想的选择:只有前三个更改将被步进,因此意外仅限于计算机启动。

精度

  • serverpoolxleavepresend 可能有助于提高精度,而不会产生任何兼容性成本。
  • hwtimestamp:某些网络接口卡可以对其数据包进行时间戳,以考虑网络堆栈中的延迟。使用 hwtimestamp * 打开它:这在不支持此类适配器的情况下不会执行任何操作。
  • tempcomp:跟踪软件时钟错误(通常是由于主板晶体温度变化)和温度传感器之间的关系。适用于那些渴望极致精度的人。

用法

启动 chronyd

该软件包提供了 chronyd.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 -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

请参阅 dhcpcd-run-hooks(8)

参见