在CentOS系统中,chronyc是chrony时间同步服务的命令行客户端工具,用来查看和管理NTP时间源的同步状态、跟踪精度以及进行手动调校。要快速查看当前时间源状态,直接在终端执行chronyc sources -v,输出结果会显示每个时间源的状态字符(*表示当前同步源,+表示候选源,?表示未连接源)、延迟、偏移量和抖动值。如果你发现时间偏差超过几毫秒或者同步状态不稳定,就需要从配置文件、网络延迟、时间源选择三个维度进行排查和调校。
很多运维人员在CentOS 7及以上版本中默认使用chrony替代了老旧的ntpd,但对chronyc的跟踪命令和精度调校方法并不熟悉。本文会从安装配置、状态跟踪、精度分析、手动调校、常见问题五个方面,把chronyc的使用彻底讲透。
一、CentOS上chrony的安装与基础配置CentOS 7/8/9默认已经预装chrony。如果你的系统是最小化安装,可以用以下命令安装:
yum install chrony -y
安装完成后,启动服务并设置开机自启:
systemctl start chronyd systemctl enable chronyd
核心配置文件位于/etc/chrony.conf。这个文件决定了你的服务器从哪些时间源获取时间、同步策略是什么。一个典型的生产环境配置如下:
server ntp1.aliyun.com iburst server ntp2.aliyun.com iburst server ntp3.aliyun.com iburst server ntp4.aliyun.com iburst # 允许的客户端网段 allow 192.168.1.0/24 # 如果本地时钟漂移过大,允许手动步进校正 makestep 1.0 3 # 记录时钟漂移到文件 driftfile /var/lib/chrony/drift # 启用RTC同步 rtcsync
其中iburst参数非常关键,它让chrony在启动时快速发送一组时间请求包,缩短首次同步时间。makestep 1.0 3表示如果时间偏差超过1秒,在前3次更新时允许直接跳跃校正,而不是慢慢追赶。
二、chronyc sources命令详解:跟踪时间源状态chronyc sources是最常用的状态查看命令。执行后输出类似这样:
210 Number of sources = 4 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* ntp1.aliyun.com 1 6 377 24 +123us[ +189us] +/- 15ms ^+ ntp2.aliyun.com 1 6 377 23 -245us[ -180us] +/- 18ms ^- ntp3.aliyun.com 1 6 377 25 +312us[ +378us] +/- 22ms ^- ntp4.aliyun.com 1 6 377 24 -178us[ -112us] +/- 20ms
每一列的含义必须搞清楚。第一列的状态字符:*表示当前正在同步的主时间源,+表示备用候选源,-表示可以使用但未被选中,?表示无法连接。Stratum是层级,1表示直接连接一级时间源(如GPS、原子钟),2表示从一级源同步过来的服务器。Poll是轮询间隔(秒),Reach是一个八进制数,表示最近8次轮询的成功情况,377代表8次全部成功。LastRx是距上次收到响应的秒数。Last sample方括号内是原始偏移量,方括号外是经过滤波后的偏移量。最后的+/-值是估计的误差范围。
如果你想看更详细的信息,加-v参数:
chronyc sources -v
这会额外显示每个源的IP地址、本地接口、状态变化时间等信息。另外还有一个chronyc sourcestats命令,提供更全面的统计数据,包括每个源的平均偏移、标准差、样本数量等:
chronyc sourcestats -v三、chronyc tracking命令:查看本地时钟精度
如果说sources看的是"外面的时间准不准",那tracking看的就是"我自己的时钟走得稳不稳"。执行:
chronyc tracking
典型输出:
Reference ID : CB6B0F0D (ntp1.aliyun.com) Stratum : 2 Ref time (UTC) : Thu Jun 12 08:23:45 2025 System time : 0.000012345 seconds fast of NTP time Last offset : +0.000000123 seconds RMS offset : 0.000045678 seconds Frequency : 1.234 ppm slow Residual freq : -0.001 ppm Skew : 0.012 ppm Root delay : 0.023456 seconds Root dispersion : 0.001234 seconds Update interval : 64.5 seconds Leap status : Normal
这里面最核心的几个指标:System time是本地时钟与NTP时间的偏差,生产环境一般要求控制在1毫秒以内。RMS offset是偏移量的均方根,反映长期稳定性,越小越好,优秀的服务器能做到几十微秒级别。Frequency是本地时钟的频率偏差,单位ppm(百万分之一),1ppm大约等于每天偏差0.086秒。Skew是频率变化速率。Root delay是到主时间源的网络延迟估计,Root dispersion是累积误差估计。这两个值越小,说明你的时间同步精度越高。
四、精度调校的具体方法当你发现chronyc tracking显示偏移量偏大或者频率偏差明显时,需要从以下几个层面调校。
1. 更换更近的时间源
网络延迟是影响精度的第一要素。用chronyc sources查看每个源的LastRx和偏移量,优先选择延迟低、偏移小的源。国内推荐阿里云、腾讯云、国家授时中心的NTP服务。可以用ping命令先测一下延迟:
ping ntp1.aliyun.com -c 10
如果延迟超过50ms,考虑换同地域的源。chrony.conf中可以配置多个server,chrony会自动选择最优的。
2. 调整轮询间隔和最小间隔
默认情况下chrony的最小轮询间隔是64秒(2的6次方),最大是1024秒。如果你需要更快的同步响应,可以在chrony.conf中调整:
minpoll 4 maxpoll 8
minpoll 4表示最小间隔16秒(2的4次方),maxpoll 8表示最大间隔256秒。注意不要设得太小,否则会增加时间源服务器的负载,也会因为网络抖动导致同步不稳定。生产环境建议minpoll 6(64秒)就够了。
3. 手动强制同步校正
如果服务器刚启动时间偏差很大,chrony默认会慢慢追赶,可能需要很久才能同步到位。可以手动触发一次立即校正:
chronyc makestep
这会让chrony立即跳跃到正确时间,而不是慢慢调整。如果你想强制指定某个源进行校正:
chronyc makestep ntp1.aliyun.com
4. 校准本地时钟频率
如果RMS offset长期偏高但网络延迟正常,可能是本地硬件时钟(晶振)本身有偏差。chrony会自动学习并补偿这个偏差,记录在driftfile中。你可以查看当前的漂移值:
chronyc drift
如果发现漂移值异常,可以删除driftfile重启chronyd让它重新学习:
systemctl stop chronyd rm /var/lib/chrony/drift systemctl start chronyd
5. 使用ntpd -q模式做一次性校准(可选)
有些场景下你需要用ntpdate做一次性强制同步(虽然ntpdate已经被弃用,但在某些旧系统上仍可用):
ntpdate ntp1.aliyun.com
同步完成后再启动chronyd进行持续维护。注意:不要同时运行ntpd和chronyd,会产生冲突。
五、常见问题与排查思路问题1:chronyc sources显示所有源都是?状态
这说明chrony无法连接任何时间源。首先检查网络连通性和防火墙:
firewall-cmd --list-ports # 确保UDP 123端口开放 firewall-cmd --add-service=ntp --permanent firewall-cmd --reload
然后确认chrony.conf中的server地址是否正确,是否被DNS解析。
问题2:Reach值一直是0
Reach为0表示从未成功收到过响应。检查server地址是否可达,用ntpdate -q测试:
ntpdate -q ntp1.aliyun.com
如果ntpdate也不通,就是网络层面的问题,不是chrony配置问题。
问题3:系统时间一直在跳动,不稳定
这种情况通常是配置了太多时间源且它们之间互相矛盾。chrony的算法会选择"最优"源,但如果源太多且质量参差不齐,反而会导致频繁切换。建议精简到3-4个高质量源,并且尽量选择同一个层级的源。
问题4:虚拟机中chrony同步精度差
虚拟机环境下,宿主机的时钟可能本身就不准,而且虚拟机有时间漂移问题。建议在宿主机层面也配置好NTP同步,同时在虚拟机中使用chrony的local directive模式,从宿主机获取时间作为本地参考:
server 192.168.1.1 iburst local stratum 10
这样即使外部时间源不通,虚拟机也能以宿主机为参考保持相对同步。
六、监控建议与自动化运维在生产环境中,建议将chronyc tracking的关键指标纳入监控体系。可以写一个简单的shell脚本定时采集:
#!/bin/bash
OFFSET=$(chronyc tracking | grep "System time" | awk '{print $5}')
RMS=$(chronyc tracking | grep "RMS offset" | awk '{print $4}')
if (( $(echo "$OFFSET > 0.001" | bc -l) )); then
echo "WARNING: Time offset exceeds 1ms: $OFFSET"
fi
if (( $(echo "$RMS > 0.0001" | bc -l) )); then
echo "WARNING: RMS offset too high: $RMS"
fi
把这个脚本加入crontab每分钟执行一次,配合告警系统,就能实时掌握时间同步健康状况。
总结来说,chronyc是CentOS时间同步运维的核心工具。sources看源状态,sourcestats看统计数据,tracking看本地精度,makestep做强制校正。把这四个命令用熟,配合合理的chrony.conf配置,就能让服务器时间精度稳定在毫秒甚至微秒级别,满足绝大多数业务场景的需求。
