跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

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 需要从中选出最佳的一个(或多个)用于同步。源选择遵循以下原则:

  1. 可达性检查(Reachability):检查每个源最近 8 次轮询的响应情况(Reach 寄存器,八进制表示),377 表示 8 次全部成功
  2. 层级(Stratum)评估:优先选择层级更低(更接近权威时间源)的服务器
  3. 距离(Root Distance)评估:综合考量到权威时间源的累积延迟(Root Delay)和分散度(Root Dispersion)
  4. 一致性检查(Falseticker Detection):交叉验证多个源的时间,排除与其他源差异过大的异常源(即 Falseticker)
  5. 综合评分:通过 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 长期为 0chronyc sources -v服务器不可达或 DNS 解析失败
系统时间偏差巨大且不收敛chronyc tracking 查看 Last offset考虑手动 chronyc makestep,或检查 makestep 配置
虚拟机时间频繁跳跃检查 maxslewrate 和 minsamples增大 minsamples 和 maxsamples,降低频率调整灵敏度
chronyc tracking 显示 Leap status: Not synchronised检查 NTP 服务器可达性至少一个源需处于 ^* 或 ^+ 状态

八、与 ntpd 的对比总结

特性Chronyntpd
首次同步速度秒级(借助 iburst)分钟级
网络适应性极强(处理丢包、断线、休眠)一般(假设稳定网络)
内存占用<5 MB>20 MB
默认时钟调整方式Slewing(平滑微调)偏差 > 125ms 时 Stepping
端口随机化是(随机源端口)否(固定 123 端口)
NTS 安全认证支持有限支持
参考时钟(PPS/GPS)原生支持需要额外配置

Chrony 已在主流 Linux 发行版(RHEL 8/9、Ubuntu 25.10+、Fedora、Debian)中成为默认的时间同步方案,充分证明了其作为 ntpd 替代者的成熟度和优越性。

作者

老丹

关注我
其他文章
上一个

地图坐标系深度解析:从地球到屏幕的精密数学之旅

下一个

深入理解正向代理:原理、用途、协议与实战指南

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

近期文章

  • Linux系统的安全基石:深入理解可插拔认证模块(PAM) 2026年7月27日
  • vsftpd 完全指南:从核心原理到Docker容器化部署 2026年7月27日
  • 互联网的”导航”安全卫士:深入解读DNSSEC 2026年7月27日
  • Ubuntu DNS 配置完全指南 2026年7月27日
  • 在 Ubuntu 中使用 Certbot 的操作指南 2026年7月27日

文章分类

  • C/C++开发 (13)
  • Docker容器 (3)
  • Linux工具包 (10)
  • Linux服务配置 (33)
  • Linux系统 (10)
  • OpenWrt路由 (2)
  • Shell脚本 (3)
  • 安防技术 (4)
  • 数据安全 (30)
  • 网络协议 (17)
  • 计算机理论 (22)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号