Chrony 时间同步服务——从底层实现到生产级配置的完全指南
一、为什么是 Chrony?——历史演进与设计哲学
长久以来,ntpd(Network Time Protocol daemon)作为 NTP 协议的标准实现,几乎是所有 Unix/Linux 系统时间同步的唯一选择。然而,随着计算环境的剧变——虚拟化、云计算、移动设备和 IoT 的普及——ntpd 的设计局限逐渐暴露。
ntpd 是为始终在线、网络稳定、硬件时钟精准的服务器环境设计的。它依赖长时间的统计来驯服时钟漂移,启动同步往往需要数分钟。在以下场景中,ntpd 表现不佳:
- 间歇性网络连接:笔记本、移动设备频繁切换网络或断开连接
- 虚拟机环境:虚拟 CPU 调度延迟导致时钟不稳定,时钟漂移率变化剧烈
- 系统挂起/恢复:休眠唤醒后,系统时钟可能与标准时间偏差巨大
Chrony 正是为了解决这些问题而生的现代化 NTP 实现。它的设计目标更贴近现实世界的不完美环境:网络可能丢包、连接可能中断、系统可能休眠、时钟可能因温度变化而漂移。它不仅能更快地完成初始同步,还能在这些复杂条件下维持更高精度的系统时间。
二、核心架构——两个组件,一套系统
Chrony 由两个核心组件构成,职责分明:
2.1 chronyd——后台守护进程
chronyd 是实际执行时间同步工作的守护进程。它在系统启动时随系统启动,始终在后台运行。它的核心职责包括:
- 定期向配置的 NTP 服务器或参考时钟源发送请求并接收响应
- 计算网络往返延迟(Round-Trip Delay)和本地时钟与服务器的偏差(Offset)
- 根据历史测量数据,估算本地时钟的漂移率(Clock Drift)
- 通过调整系统时钟的频率(频率微调)或直接步进(Stepping)来实现时间校准
- 记录同步状态和统计信息到日志
2.2 chronyc——命令行监控与管理工具
chronyc 是一个与 chronyd 通信的命令行工具,用于监控同步状态、查看统计信息、执行管理操作。它支持两种工作模式:
- 交互式模式:直接输入
chronyc进入交互式 shell,可连续执行多个命令 - 命令行模式:
chronyc <command>直接执行单条命令
通过 chronyc,你可以查看当前正在同步的服务器、每个时间源的质量、系统时钟的偏差值等关键信息。
三、工作原理——从采样到校准的完整流程
时间同步并非简单地“拿到一个时间就设置”,而是一个涉及采样、过滤、源选择、算法处理、时钟调整的多阶段复杂过程。
3.1 采样阶段——Polling 与 Measurement
chronyd 按照可变的轮询间隔(Polling Interval)向每个配置的时间源发送 NTP 请求。轮询间隔由 minpoll 和 maxpoll 配置项控制,以 2 的幂次秒为单位:
- 默认
minpoll=6,即最短间隔 64 秒 - 默认
maxpoll=10,即最长间隔 1024 秒
chronyd 会根据当前同步质量动态调整轮询间隔。如果同步质量好(偏差小、抖动低),它会逐渐增大轮询间隔以减少网络负载;如果质量恶化,它会缩短间隔以获取更多样本。
每个 NTP 请求-响应过程会产生一个样本(Sample),包含以下关键数据:
- 偏移量(Offset):本地时钟与服务器时钟的差值
- 延迟(Delay):网络往返时间(Root Delay 的组成部分)
- 时间戳:测量发生的精确时间
与 ntpd 不同,Chrony 在发送 NTP 请求时会随机化源端口和传输时间戳字段,以增强隐私保护和安全性(防止中间人攻击和指纹识别)。
3.2 过滤阶段——剔除噪声样本
并非所有样本都可信。网络拥塞、ARP 查询、CPU 调度延迟都可能造成样本异常。Chrony 采用多重过滤机制来剔除噪声:
maxdelay延迟过滤:往返延迟超过设定值(默认 3 秒)的样本被直接丢弃maxdelayratio相对延迟过滤:样本延迟超过历史最小延迟的设定倍率时被丢弃maxdelaydevratio统计延迟过滤:样本延迟相对于历史延迟分布的标准差超出设定倍率时被丢弃(默认 10.0)filter中值滤波:当配置了filter选项时,多个样本经过中值滤波合并为一个样本,有效降低噪声影响
3.3 源选择阶段——选择最优时钟源
当配置了多个时间源时,Chrony 需要从中选出最佳的一个(或多个)用于同步。源选择遵循以下原则:
- 可达性检查(Reachability):检查每个源最近 8 次轮询的响应情况(
Reach寄存器,八进制表示),377 表示 8 次全部成功 - 层级(Stratum)评估:优先选择层级更低(更接近权威时间源)的服务器
- 距离(Root Distance)评估:综合考量到权威时间源的累积延迟(Root Delay)和分散度(Root Dispersion)
- 一致性检查(Falseticker Detection):交叉验证多个源的时间,排除与其他源差异过大的异常源(即 Falseticker)
- 综合评分:通过
stratum、distance、stratum_weight等参数计算每个源的分数,分数最高的源被标记为^*(当前同步主源),次优的源标记为^+(备用源)
3.4 时钟调整——Slewing 与 Stepping
选定最优源后,chronyd 需要将系统时钟校准到目标时间。Chrony 支持两种调整方式:
- Slewing(频率微调)——默认行为:Chrony 通过微调系统时钟的频率(加快或减慢),让时钟逐渐“追赶”或“等待”标准时间。这是无间断、平滑的调整方式,不会造成时间跳跃,对运行中的应用程序影响最小。Linux 系统支持的最大频率调整幅度为 100,000 ppm(即每秒最多调整 0.1 秒),Chrony 的默认最大频率调整幅度为 83,333.333 ppm(每秒调整 1/12 秒)。
- Stepping(步进调整)——当偏差过大时:当系统时钟与标准时间的偏差超过
makestep设定的阈值时,Chrony 会直接跳跃式设置时钟。makestep 1.0 3的含义是:如果偏差超过 1 秒,在前 3 次时钟更新中允许步进调整。
需要注意的是,步进调整可能对某些依赖单调递增时间的应用程序造成不良影响(如数据库事务、日志排序),因此 Chrony 默认采用 Slewing 为主,仅在必要时才 Stepping。
四、配置文件完全指南——/etc/chrony.conf
Chrony 的主配置文件通常位于 /etc/chrony/chrony.conf(Debian/Ubuntu)或 /etc/chrony.conf(RHEL/CentOS)。配置文件中的每一条指令占据独立行,指令不区分大小写,以 #、;、!、% 开头的行被视为注释。
以下将按功能模块逐一详解所有重要配置指令。
4.1 时间源配置——server、pool、refclock
server 指令——指定 NTP 服务器
server time.google.com iburst minpoll 6 maxpoll 10
server 指令用于指定一个明确的 NTP 服务器。可以配置多个 server,Chrony 会自动从中选择最优者。
支持的选项:
| 选项 | 说明 | 默认值 |
|---|---|---|
minpoll | 最小轮询间隔(2 的幂次秒)。minpoll 6 = 64 秒。注意:对公共互联网服务器,间隔不应短于 64 秒,以免被视为滥用。最小值可达 -7(1/128 秒,仅限低延迟局域网) | 6(64 秒) |
maxpoll | 最大轮询间隔(2 的幂次秒)。maxpoll 10 = 1024 秒。最大值 24(6 个月) | 10(1024 秒) |
iburst | 启动时发送 4-8 个请求的突发包,大幅加速首次同步。强烈推荐启用 | 禁用 |
burst | 当无法获得良好测量值时,发送最多 4 个请求的突发包 | 禁用 |
key | 指定用于 NTP 认证的密钥 ID(配合 keyfile 使用) | 无 |
nts | 启用 Network Time Security(NTS)认证机制,无需预共享密钥 | 禁用 |
maxdelay | 忽略往返延迟超过此值(秒)的测量 | 3 秒 |
maxdelayratio | 忽略延迟超过历史最小延迟此倍数的测量 | 禁用 |
maxdelaydevratio | 忽略延迟偏离历史标准差此倍数的测量 | 10.0 |
mindelay | 手动指定最小往返延迟(替代自动检测),用于改善静态网络中的稳定性 | 自动检测 |
asymmetry | 指定网络路径的延迟不对称性(-0.5 至 +0.5),用于补偿固定偏差 | 自动估计 |
offset | 对测量的偏移量应用固定修正值(秒),用于补偿已知的固定延迟偏差 | 0.0 |
prefer | 优先选择此源而非其他源 | 禁用 |
noselect | 永不选择此源,仅用于监控 | 禁用 |
trust | 假设此源的时间总是真实的(仅当其他 trust 源也同意时才可被拒绝) | 禁用 |
require | 要求至少一个带此选项的源是可选择的,否则不更新时钟 | 禁用 |
offline | 启动时假设此源不可达,需通过 chronyc online 手动启用 | 禁用 |
auto_offline | 当发送请求失败时自动假设源离线 | 禁用 |
xleave | 启用交错模式(Interleaved Mode),允许服务器在发送后捕获传输时间戳,显著提高测量精度(需服务器支持) | 禁用 |
pool 指令——使用服务器池
pool pool.ntp.org iburst
pool 指令类似于 server,但指向一个会解析为多个 IP 地址的域名,用于负载均衡和高可用。Chrony 会从这个池中动态添加/替换服务器实例。当某个服务器不可达、不同步或成为 Falseticker 时,会自动替换为池中的新地址,自动替换间隔至少 30 分钟。
refclock 指令——使用本地参考时钟
refclock PPS /dev/pps0 refid GPS poll 2
refclock SHM 0 refid GPSD delay 0.4 offset 0.06
refclock 指令用于配置本地参考时钟源,如 GPS 接收器(通过 PPS 秒脉冲或共享内存 SHM)。这在嵌入式设备和需要极高精度时间同步的场景中至关重要。
关键选项:
delay:指定输入源到 Chrony 的传输延迟上限。例如,如果延迟抖动范围 0.01-0.2 秒,delay应设为 0.4(2 倍最大值)offset:修正固定的传输延迟偏差(如 GPS 数据从产生到被 Chrony 读取的固有延时)poll:指定采样间隔(2 的幂次秒)。poll 2表示每 4 秒采样一次。当poll < 2时,采样数据不做滤波直接使用
关键原则:仅配置 PPS 源不能单独同步系统时钟(PPS 只提供精确的秒脉冲,不包含时间信息),必须配合 SHM 或 Socket 源使用。
4.2 时钟行为配置
driftfile——漂移率记录
driftfile /var/lib/chrony/drift
指定一个文件,Chrony 会在其中记录系统时钟的漂移率(频率误差)。系统重启或服务重启后,Chrony 可立即读取该值,快速恢复精确同步,无需重新学习。
makestep——步进调整策略
makestep 1.0 3
当系统时钟与标准时间的偏差超过阈值(1.0 秒)时,在前 N 次(3 次)时钟更新中允许直接步进调整。如果不希望 Chrony 在运行中步进时钟(避免时间跳跃影响应用程序),可将第二个参数设为负值(如 makestep 0.125 -1)。
rtcsync——同步硬件时钟
rtcsync
此指令让内核自动将系统时间同步回硬件实时时钟(RTC)。系统关机或重启后,BIOS/硬件时钟仍保持正确时间。
maxslewrate——最大频率调整速率
maxslewrate 50000
指定系统时钟频率调整的最大速率(ppm)。默认值为 83333.333 ppm(每秒调整 1/12 秒)。增大此值可加快 Slewing 速度,但可能影响时钟稳定性。
local stratum——本地时钟层级
local stratum 10
当失去所有外部时间源时,Chrony 可以使用本地时钟作为时间参考。此指令指定本地时钟的 Stratum 层级(通常设为 10,表示“不可信”级别)。其他客户端同步到本机时,会看到 Stratum 为 11(本地层级 + 1)。
4.3 访问控制配置
allow——允许客户端访问
allow 192.168.1.0/24
allow 10.0.0.0/8
允许指定子网内的主机向本机 Chrony 服务查询时间(即本机作为 NTP 服务器)。如果不配置任何 allow,则本机仅作为 NTP 客户端,不对外提供服务。
deny——拒绝客户端访问
deny 192.168.2.0/24
拒绝指定子网的主机访问本机 Chrony 服务。可结合 allow 实现精细化访问控制。
4.4 日志与监控配置
log——启用日志记录
log tracking statistics measurements
启用指定类型的日志记录。可选的日志类型包括:
tracking:记录系统时钟的跟踪信息(偏差、频率、层级等)statistics:记录每个时间源的统计信息measurements:记录原始测量样本数据
logdir——指定日志目录
logdir /var/log/chrony
日志文件输出目录。Chrony 会在此目录下生成 tracking.log、statistics.log 等文件。
dumpdir——状态转储目录
dumpdir /var/lib/chrony
指定 Chrony 保存每个时间源的历史测量数据的目录。这些数据在服务重启后可被恢复,帮助更快进入稳定同步状态。
五、监控与管理——chronyc 实战
5.1 查看时间源状态
chronyc sources -v
输出示例:
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* time.google.com 1 8 377 141 -123us[ -106us] +/- 10ms
^+ time.cloudflare.com 2 8 377 135 -1048us[-1048us] +/- 29ms
^+ 0.pool.ntp.org 2 8 377 139 +3483us[+3483us] +/- 18ms
关键列说明:
MS:源类型,^表示服务器(=表示对等体,#表示本地参考时钟)S:状态标志——*当前同步的主源;+备用源;-未合入的源;?不可达源Stratum:时间源的层级,1 为最高(权威),16 表示不可用Reach:最近 8 次轮询的可达性(八进制表示),377 表示 8 次全部成功;0 表示全部失败LastRx:距离上次接收响应的时间(秒)Last sample:本地时钟与源的时间差(微秒),正数表示本地时钟偏快
5.2 查看详细同步跟踪
chronyc tracking
输出示例:
Reference ID : 4A2B1C3D (time.google.com)
Stratum : 2
Ref time (UTC) : Thu Jun 19 10:23:45 2026
System time : 0.000123456 seconds fast of NTP time
Last offset : +0.000045678 seconds
RMS offset : 0.000098765 seconds
Frequency : 12.345 ppm fast
Residual freq : -0.001 ppm
Skew : 0.123 ppm
Root delay : 0.012345 seconds
Root dispersion : 0.001234 seconds
Update interval : 512.0 seconds
Leap status : Normal
关键指标解读:
- Reference ID:当前同步的主源的 IP 地址或 refid
- Stratum:本机的时间层级(如果同步到 Stratum 1 服务器,本机为 Stratum 2)
- System time:系统时钟与 NTP 时间的偏差(正数表示偏快)
- Frequency:系统时钟的固有漂移率(ppm),正数表示时钟偏快
- Root delay:到权威时间源的累积网络往返延迟
- Root dispersion:到权威时间源的累积时间分散度(测量误差)
5.3 查看源统计信息
chronyc sourcestats
显示每个时间源的详细统计信息,包括样本数量、频率估计、标准差等,用于评估各个时间源的质量。
5.4 手动触发同步
chronyc makestep
立即执行一次步进调整(不等待 makestep 的定时条件),通常用于系统刚刚恢复网络连接或从休眠中唤醒后的快速校准。
六、生产级配置示例
以下是一个完整的生产环境配置示例(适用于企业服务器):
# === 时间源配置 ===
# 使用国内 NTP 服务池,加快首次同步
pool ntp.aliyun.com iburst minpoll 6 maxpoll 10
pool time.cloud.tencent.com iburst
# 本地参考时钟(仅当有 GPS 硬件时启用)
# refclock PPS /dev/pps0 refid GPS poll 2
# refclock SHM 0 refid GPSD delay 0.4 offset 0.06
# === 时钟行为 ===
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
maxslewrate 50000
# === 本地时间服务器(允许内网客户端同步) ===
local stratum 10
allow 192.168.0.0/16
allow 10.0.0.0/8
# === 日志与监控 ===
logdir /var/log/chrony
log tracking statistics measurements
dumpdir /var/lib/chrony
# === 安全(可选,启用 NTS 认证) ===
# server time.google.com nts
# ntstrustedcerts /etc/chrony/certs/
七、故障排查速查表
| 问题现象 | 排查命令 | 可能原因与对策 |
|---|---|---|
chronyc sources 全部显示 ? | chronyc tracking、ping <server> | 网络不通或防火墙阻止 UDP 123 端口 |
Reach 长期为 0 | chronyc sources -v | 服务器不可达或 DNS 解析失败 |
| 系统时间偏差巨大且不收敛 | chronyc tracking 查看 Last offset | 考虑手动 chronyc makestep,或检查 makestep 配置 |
| 虚拟机时间频繁跳跃 | 检查 maxslewrate 和 minsamples | 增大 minsamples 和 maxsamples,降低频率调整灵敏度 |
chronyc tracking 显示 Leap status: Not synchronised | 检查 NTP 服务器可达性 | 至少一个源需处于 ^* 或 ^+ 状态 |
八、与 ntpd 的对比总结
| 特性 | Chrony | ntpd |
|---|---|---|
| 首次同步速度 | 秒级(借助 iburst) | 分钟级 |
| 网络适应性 | 极强(处理丢包、断线、休眠) | 一般(假设稳定网络) |
| 内存占用 | <5 MB | >20 MB |
| 默认时钟调整方式 | Slewing(平滑微调) | 偏差 > 125ms 时 Stepping |
| 端口随机化 | 是(随机源端口) | 否(固定 123 端口) |
| NTS 安全认证 | 支持 | 有限支持 |
| 参考时钟(PPS/GPS) | 原生支持 | 需要额外配置 |
Chrony 已在主流 Linux 发行版(RHEL 8/9、Ubuntu 25.10+、Fedora、Debian)中成为默认的时间同步方案,充分证明了其作为 ntpd 替代者的成熟度和优越性。