0%

Linux Chrony完整指南:从配置到故障排查

Linux Chrony完整指南:从配置到故障排查

1 简介

1.1 简介

NTP(Network Time Protocol,网络时间协议)是用来使计算机时间同步化的一种协议,它可以在大规模、不可靠的互联网上提供高精度、高稳定的时间同步

它的设计目标是让所有参与设备的时间与协调世界时(UTC)保持一致

1.2 为什么需要NTP

在现代计算中,准确的时间至关重要,其应用场景包括但不限于:

  • 金融交易: 股票、期货交易的时序和审计。
  • 分布式系统与数据库: 确保事件发生的正确顺序,解决数据一致性问题。
  • 日志分析: 当系统出现故障时,来自不同服务器的日志需要精确的时间戳才能进行有效的故障排查。
  • 身份验证与安全: Kerberos认证、SSL证书验证等都严重依赖于系统时间的准确性。
  • 任务调度:cron作业,需要在多台机器上协调运行。

1.3 工作原理

1.3.1 分层的组织机构确保可靠性

NTP采用分层(Stratum)的树状结构来组织时间源:

“Stratum”是一个源自拉丁语的词汇,它的核心意思是“层”或“层次”,发音为/ˈstrɑː.təm/(英式发音)

数字越小代表越权威,例如:

  • Stratum 0: 最高精度的时间源,如原子钟、GPS时钟。它们不直接连接到网络。
  • Stratum 1: 直接连接到Stratum 0设备的服务器,它们提供主要的时间服务。
  • Stratum 2: 向Stratum 1服务器同步时间的客户端,同时也可以为Stratum 3提供服务。
  • 以此类推…(Stratum 15为最低层级,16表示未同步)

[!NOTE]

在chrony配置文件中,Stratum值默认为10

NTP客户端通过与一个或多个服务器交换数据包,来计算时间偏移量网络延迟,然后通过复杂的算法逐步调整本地时钟(通常通过“微调”时钟频率的方式,而非粗暴地“跳变”时间),最终实现同步

1.3.2 四种精心设计的同步机制

Chrony 的时间同步机制是一个精致的、复杂的流程,具体包括以下四种代表性的同步机制:

1、精确测量时间偏移量网络延迟

基于客户端和服务器之间的时间戳交换,估算本地时钟与服务器时钟之间的偏移,能够考虑网络延迟的影响

2、采用动态轮询间隔适应不同网络条件

Chrony 的轮询机制不是固定不变的,而是根据网络条件和时钟稳定性动态调整

  • 初始阶段:使用较短的轮询间隔(例如 2⁴=16 秒)来快速同步
  • 稳定后:逐渐增加轮询间隔,最长可达 2¹⁰=1024 秒
  • 自适应机制:当检测到时钟不稳定或网络条件变化时,会自动缩短轮询间隔以更快适应变化

注意Chrony 的轮询都是以2为底数,这个可以从《1.5 轮询间隔》章节的抓包结果可以验证

这种动态轮询机制使 Chrony 能够在保持精度的同时减少网络流量,特别适合间歇性连接的环境

3、使用渐进调整步进调整相结合的方式修正时间

当客户端计算出时间偏移后,不会立即大幅调整时钟,而是采用渐进式调整【这点很关键】:

对于微小偏差处理,chrony采用平滑调整避免了时间跳跃,确保依赖单调递增时间的应用程序不受影响

对于重大偏差处理,chrony步进调整(直接跳变),这个选项可以在chrony配置文件中调整

[!IMPORTANT]

  • 例如配置 makestep 1.0 3 表示在前 3 次时钟更新中,如果校正值大于 1 秒,则步进调整

4、应用高级统计算法优化时间源选择和时钟漂移预测

chrony配置文件可以设置pool连接池,或者多个server NTP服务器地址从而维护多个时间源样本

使用加权最小二乘法等统计算法筛选最优时间源,从而选择最稳定、最精确的时间源作为同步

1.4 chrony的诞生

chrony出现之前,Linux下时间同步的绝对主角是 ntpd

ntpd是一个非常成熟、稳定的守护进程,为互联网的时间同步服务了几十年

然而,随着计算环境的变化,尤其是在现代动态环境中(如虚拟机、云实例、移动设备),ntpd暴露出一些局限性

1、启动和同步速度较慢:它需要较长时间来测量和修正时钟漂移,因此从启动到达到稳定同步状态可能需要数分钟甚至更久。

2、时间跳变问题: 当时间误差非常大时,ntpd可能会选择直接“步进”(跳变)时钟,这可能导致依赖单调递增时间的应用程序出现问题。

为了克服ntpd在现代环境中的不足,chrony应运而生

它由Richard Curnow开发,现在已成为许多主流Linux发行版(如Red Hat Enterprise Linux 7/8/9, CentOS, Fedora等)的默认时间同步工具

chrony的设计哲学是:更快、更灵活、更适合现代异构网络环境,chrony相对于ntpd的主要优势包括

  1. 更快的同步速度:chrony能更快地计算出理想的时间调整值,通常在启动后几秒内就能完成初次同步。这对于频繁开关机的系统(如云主机)至关重要
  2. 对断续网络的卓越处理:chrony被设计为可以很好地处理间歇性网络连接。它能够记录在断网期间本地时钟的漂移情况,并在网络恢复后迅速补偿,重新同步
  3. 更平滑的时间调整:chrony默认情况下会通过加速或减慢时钟的方式来纠正任何时间偏差,而不是直接跳变时间。只有在系统启动时发现时间偏差极大(默认超过1000秒)时,才会选择步进调整。这大大减少了对应用程序的干扰。
  4. 更好的安全性:对NTP的中间人攻击和放大攻击是现代安全的关注点。chrony支持更强的哈希算法(如SHA256/SHA512)来进行认证
  5. 更小的系统资源占用:chrony在运行时消耗的资源更少,这在资源受限的嵌入式系统或虚拟机中是一个优点。

上述这些优势可以结合《1.3.2 四种精心设计的同步机制》做对比学习

1.5 轮询间隔

chrony的轮询间隔是一个在设定范围内动态变化的值

可以通过chronyc ntpdate来查看轮询时间,注意Poll interval,其中9就是以2为底数的指数值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
chronyc ntpdata

# 典型的返回结果
Remote address : 10.10.0.1 (0A0A0001)
Remote port : 123
Local address : 10.10.0.2 (0A0A0002)
Leap status : Normal
Version : 4
Mode : Server
Stratum : 10
Poll interval : 9 (512 seconds)
Precision : -26 (0.000000015 seconds)
Root delay : 0.000000 seconds
Root dispersion : 0.000000 seconds
Reference ID : 7F7F0101 ()
Reference time : Fri Oct 03 20:48:07 2025
Offset : +0.000198895 seconds
Peer delay : 0.001237581 seconds
Peer dispersion : 0.000000035 seconds
Response time : 0.000414145 seconds
Jitter asymmetry: +0.00
NTP tests : 111 111 1111
Interleaved : No
Authenticated : No
TX timestamping : Kernel
RX timestamping : Kernel
Total TX : 36
Total RX : 24
Total valid RX : 24

另外通过抓包也可以验证轮询时间,可以看出开始的间隔是512秒后面的间隔是1024秒

2 配置指南

2.1 安装chrony

配置完仓库源后就可以

1
yum -y install chrony

2.2 基本参数详解

配置参数在/etc/chrony.conf文件,针对参数进行讲解

1、时间源配置

chrony使用加权最小二乘法等统计算法筛选最优时间源,从而选择最稳定、最精确的时间源作为同步

  • pool:指定 NTP 服务器池,而不是单个服务器
    • 例如pool.ntp.org 是一个轮询的域名,解析为多个 NTP 服务器
    • 使用 pool 可以提高可靠性和负载均衡

[!NOTE]

后续客户端需要将这里替换为公网或者内网地址

  • iburst:加速初始同步
    • 在服务启动时,立即发送 4-8 个数据包而不是 1 个
    • 显著减少初始时间同步所需的时间
    • 特别适用于系统启动时的快速同步

[!NOTE]

1
使用iburst启动 chronyd 时,会快速与多个服务器建立连接,而不是等待常规的轮询间隔

2、时钟精度维护

默认值是:driftfile /var/lib/chrony/drift

系统时钟由于硬件差异会有微小的走快或走慢,因此Chrony 会计算并记录这个漂移率(单位:ppm - 百万分之一)

下次启动时读取这个文件,更快地校准时间

3、控制时间步进(跳跃)调整

默认值是makestep 1.0 3

  • 1.0:当时钟偏差超过 1.0 秒时启用步进调整(直接修改时间)
  • 3:在前 3 次时钟更新中允许步进调整(直接修改时间)

[!NOTE]

《1.3.2 四种精心设计的同步机制》提及,帮助理解参数配置

对于*微小偏差处理***,chrony采用平滑调整避免了时间跳跃,确保依赖单调递增时间的应用程序不受影响

对于重大偏差处理,chrony步进调整(直接跳变)

4、硬件时钟同步

启用硬件时钟(RTC)同步

  • 每 11 分钟将系统时间同步到硬件时钟(RTC)
  • 确保硬件时钟保持相对准确
  • 系统重启时硬件时钟能提供较好的初始时间

启用RTC同步最大的好处,个人认为是重启后的初始化时间

2.3 高级参数

1、设置最小可用时间源数量,提高可靠性

默认值是:minsources 2,默认是注释状态,不启用

  • 只有当至少 2 个时间源可用时才调整系统时钟
  • 提高时间同步的可靠性,防止单个错误源影响系统

[!NOTE]

在生产环境中建议取消注释,避免单一时间源故障导致时间错误

2、配置 NTP 服务器访问控制【配置NTP服务器的关键参数】

重要事说三遍:如果要让本机作为NTP服务为局域网用户提供校时服务需要设置以下参数:

启用本地时钟源:添加一行 local stratum 10

设置客户端访问网段:例如:allow 192.168.0.0/16,默认是注释状态,不启用。如果是完全依赖本地时间,即为其他服务器提供服务,此处务必要删除注释,添加正确的网络地址,例如allow 192.168.0.0/16

allow 指令允许指定网络段的客户端连接本机作为 NTP 服务器

[!IMPORTANT]

1、如果要让 chrony完全依赖本地时钟(不再从外部网络源同步),需要关闭此项指令注释

2、只有设置这个参数,chronyd才会在本地监听123端口,启用服务对外提供NTP服务

注意:

  • 使用本地时钟作为时间源时,精度依赖系统硬件质量
  • 通常在局域网内可保持微秒级精度,但无法达到原子钟或外部NTP服务器的精度

3 监控和调试命令

3.1 基本监控命令

chrony软件整体包含了两个主要组件

chronyd: 守护进程,在后台运行

chronyc: 命令行界面工具,用于监控chronyd的性能并在运行时更改各种操作参数。它提供了一个交互式界面来实时查看和调整同步状态

3.1.1 查看时间源状态

chronyc sources -v 命令主要用于查看系统中所有配置的NTP时间源状态,帮助你诊断时间同步问题

它能显示每个时间源的详细同步状态、层级、轮询间隔等信息

这个命令是本人目前最常用的调试命令

一个典型的返回结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
chronyc sources -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
===============================================================================
^* 10.10.0.1 10 8 1 56 +85us[ +131us] +/- 334us

理解 chronyc sources 输出状态

chronyc sources 命令的输出中,每行开头的符号表示时间源的状态:

  • ^? 表示此时间源状态为不可达,chronyd无法从其获取有效的时间信息。
  • ^* 表示当前选中的、用于同步系统时间的服务器。
  • ^+ 表示这是一个合格的、可用的候选时间源。
  • ^ 表示chronyd能识别到该时间源,但尚未将其选为同步源

如果时间源状态不可达,需要关注服务端的防火墙设置以及是否启用allow指令

3.1.2 查看跟踪信息

一个典型的返回结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
chronyc tracking
Reference ID : 0A0A0001 (10.10.0.1)
Stratum : 11
Ref time (UTC) : Fri Oct 03 22:14:05 2025
System time : 0.000010474 seconds slow of NTP time
Last offset : -0.000028865 seconds
RMS offset : 0.000032506 seconds
Frequency : 6.847 ppm fast
Residual freq : -0.001 ppm
Skew : 0.023 ppm
Root delay : 0.000230864 seconds
Root dispersion : 0.000885171 seconds
Update interval : 1042.0 seconds
Leap status : Normal

几个状态值解释如下:

字段名称 解释与意义
Reference ID 当前正在同步的 NTP 服务器的标识(IP地址或ID)
Stratum 时间源的层级。1 表示直接连接到精准时钟(如原子钟),数字越大,层级越低
Ref time (UTC) 上一次成功进行时钟更新的时间(UTC时区)
System time 系统时钟与NTP时间之间的偏差。slow 表示慢,fast 表示快
Last offset 最后一次时钟同步时的绝对偏移量。值越接近0,说明同步精度越高
RMS offset 偏移量的长期平均值(均方根),是衡量同步稳定性的重要指标
Frequency 如果未经校正,系统时钟固有的漂移速率(单位:ppm)
Root delay 到主(Stratum 1)时间源的总网络延迟
Root dispersion 在同步过程中累积的最大可能误差范围
Update interval 两次连续同步之间的时间间隔
Leap status 闰秒状态。通常为 “Normal”

3.1.3 查看活动连接

chronyc activity 命令主要用于快速查看 Chrony 时间同步服务中所有配置的 NTP 服务器(时间源)的在线状态摘要,它能让你对时间源的可用性有一个快速的全局了解

  • sources online:这表示当前处于在线状态且可接触的 NTP 源数量。Chrony 正在与这些服务器通信并同步时间
  • sources offline:这表示被视为离线或不可达的 NTP 源数量。Chrony 无法从这些服务器获取时间
  • sources with unknown address:此计数代表那些地址无法解析的 NTP 源

一个典型的返回结果如下

1
2
3
4
5
6
7
8
9
10
chronyc activity

# 返回结果

200 OK
1 sources online
0 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address

3.1.4 手动触发时间检查

chronyc makestep 是一个用于强制立即同步系统时钟的命令

当系统时间与NTP服务器时间相差很大时,渐进式同步会非常慢。使用 chronyc makestep 可以立刻将系统时间调整正确

1
2
3
4
 chronyc makestep

# 如果成功返回结果
200 OK

[!WARNING]

不过,正因为它的工作方式是“跳跃”,在生产环境中使用时需要谨慎

如果系统时间突然向前或向后跳跃一大段,可能会影响正在运行的应用程序,例如导致数据库的日志混乱或依赖定时任务的作业出错

3.2 服务端调试命令

3.2.1 启动chronyd服务

1
2
3
4
## 立即启动并设置服务自启动
systemctl enable chronyd --now
## 重启服务
systemctl restart chronyd

3.2.2 查看服务状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
systemctl status chronyd

# 返回结果
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2025-10-04 02:11:14 CST; 1min 45s ago
Docs: man:chronyd(8)
man:chrony.conf(5)
Process: 221121 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 221123 (chronyd)
Tasks: 1 (limit: 23196)
Memory: 568.0K
CGroup: /system.slice/chronyd.service
└─ 221123 /usr/sbin/chronyd

Oct 04 02:11:14 cephadm systemd[1]: chronyd.service: Deactivated successfully.
Oct 04 02:11:14 cephadm systemd[1]: Stopped NTP client/server.
Oct 04 02:11:14 cephadm systemd[1]: Starting NTP client/server...
Oct 04 02:11:14 cephadm chronyd[221123]: chronyd version 4.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 +DEBUG)
Oct 04 02:11:14 cephadm chronyd[221123]: Frequency 7.205 +/- 0.288 ppm read from /var/lib/chrony/drift
Oct 04 02:11:14 cephadm systemd[1]: Started NTP client/server.

查看服务端的网络监听状态

1
2
 ss -tunlp | grep 123
udp UNCONN 0 0 0.0.0.0:123 0.0.0.0:* users:(("chronyd",pid=21794,fd=7))

[!IMPORTANT]

再次强调:如果要让 chrony完全依赖本地时钟(不再从外部网络源同步),需要关闭allow此项指令注释

3.3 配置防火墙

Chronyd服务通常需要配置防火墙,特别是当它作为时间服务器为其他客户端提供时间同步时,需要配置防火墙

1
firewall-cmd --add-service=ntp --permanent && firewall-cmd --reload

或者直接开放NTP使用的UDP 123端口

1
firewall-cmd --add-port=123/udp --permanent

服务端配置完成后,需要在客户端检查时间源状态,使用chronyc sources -v查看时间源状态