在CentOS 7及以上版本中,系统默认使用chrony作为NTP时间同步服务,替代了老版本中的ntpd。chrony轻量、启动快、同步精度高,特别适合服务器环境。要配置chrony使用NTP池进行时间同步,核心操作就是编辑/etc/chrony.conf文件,指定pool服务器地址,然后重启服务即可。下面我把整个流程、常见问题和优化技巧一次性讲透。

一、为什么CentOS要用chrony而不是ntpd

CentOS 7开始,Red Hat系发行版把默认的时间同步工具从ntpd换成了chrony。原因很简单:chrony占用资源更少,同步速度更快,尤其在虚拟机和云服务器这种时间容易漂移的环境下表现更好。chrony支持NTP协议,也能作为NTP服务器给其他机器提供时间服务,功能上完全覆盖ntpd。如果你还在用老版本CentOS 6,那确实还是ntpd,但现在主流环境都是7、8甚至Stream版本,chrony是标配。

二、检查chrony是否已安装并运行

先确认chrony有没有装好。执行以下命令:

systemctl status chronyd

如果显示active (running),说明服务已经在跑。如果没有安装,用yum或dnf装一下:

yum install chrony -y

装完之后启动并设置开机自启:

systemctl start chronyd
systemctl enable chronyd

三、配置NTP池——核心步骤

打开配置文件:

vi /etc/chrony.conf

你会看到里面有默认的server行,比如server 0.centos.pool.ntp.org iburst。这就是NTP池地址。所谓NTP池,就是一个由全球志愿者维护的时间服务器集群,域名会自动解析到离你最近的多台NTP服务器,实现负载均衡和高可用。

国内用户建议把默认的centos池换成国内的NTP池,同步速度更快、延迟更低。推荐配置如下:

# 注释掉原来的server行
# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst

# 使用阿里云NTP池
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
server ntp4.aliyun.com iburst

# 或者使用国家授时中心
server ntp.ntsc.ac.cn iburst

iburst参数的意思是:首次同步时快速发送一批数据包,加速初始同步过程。这个参数建议保留。

四、配置本地时钟作为后备源

如果网络断了或者所有NTP服务器都不可达,chrony会使用本地硬件时钟作为参考。在配置文件中加上一行:

local stratum 10

stratum 10表示本地时钟的层级比较低,优先级低于网络NTP源,只有在网络源全部失效时才会用到。这是一个保险措施,避免服务器在离线状态下时间完全失控。

五、允许哪些客户端可以同步时间

如果你的CentOS机器不仅自己同步时间,还要给内网其他机器提供NTP服务,需要在配置文件中添加allow指令:

allow 192.168.1.0/24

这行表示允许192.168.1.0网段的所有机器通过chrony同步时间。如果不加这行,默认只允许本机(127.0.0.1)同步。生产环境中根据实际网络规划配置即可。

六、重启服务并验证同步状态

配置改完保存退出后,重启chrony服务:

systemctl restart chronyd

然后用chronyc命令查看同步状态,这是最关键的验证步骤:

chronyc sources -v

输出中带*号的就是当前正在使用的同步源,带+号的是备选源。如果看到类似下面的内容:

210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp1.aliyun.com              1   6   377    23   +12ms[  +15ms] +/-  45ms
^+ ntp2.aliyun.com              1   6   377    24   +18ms[  +20ms] +/-  52ms
^- ntp3.aliyun.com              1   6   377    22   +10ms[  +13ms] +/-  38ms
^- ntp4.aliyun.com              1   6   377    25   +15ms[  +18ms] +/-  42ms

说明四个阿里云NTP源都正常工作,当前主用的是ntp1.aliyun.com。Reach列显示377(八进制),转换成二进制是11111111,表示最近8次探测全部成功,状态非常健康。

再用下面的命令查看同步详情:

chronyc tracking

会显示当前时间偏移量、频率偏移、最后一次更新时间等信息。如果Ref ID显示正常IP或域名,System time显示0.000000000秒左右,说明同步精度很高。

七、防火墙配置——别忘了放行UDP 123端口

NTP协议使用UDP 123端口。如果你的服务器开了防火墙,必须放行这个端口,否则chrony根本连不上NTP服务器。firewalld环境下执行:

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

如果是iptables环境:

iptables -A INPUT -p udp --dport 123 -j ACCEPT
service iptables save

这个步骤很多人会忽略,导致配置看起来都对但就是同步不上,排查时一定要先检查端口通不通。

八、chrony与ntpdate的区别和使用建议

有些人习惯用ntpdate命令手动同步一次时间,比如ntpdate ntp1.aliyun.com。但在CentOS 7以上,ntpdate已经被弃用,而且如果chronyd服务正在运行,ntpdate会报错说socket in use。正确做法是:如果需要立即强制同步,可以先停掉chronyd,用ntpdate同步一次,再启动chronyd;或者直接用chronyc makestep命令:

chronyc makestep

这个命令会让chrony立即调整时间而不是慢慢漂移修正。但日常运维中不建议频繁手动干预,让chrony自己持续同步才是正道。

九、常见问题排查

问题一:chronyc sources显示所有源都是问号或者没有*号。先检查网络连通性:ping ntp1.aliyun.com,再检查UDP 123端口是否放行。如果网络没问题,看看/etc/chrony.conf里的server行有没有写错。

问题二:时间同步了但偏移量很大(几十毫秒甚至更多)。这通常是虚拟机环境的问题,虚拟机的时钟容易受宿主机影响。可以在虚拟机配置中开启时间同步工具(如VMware Tools的时间同步),或者在chrony配置中增大makestep的阈值。

问题三:重启后chrony没有自动启动。检查是否执行了systemctl enable chronyd,确认/etc/systemd/system/multi-user.target.wants/下有chronyd.service的软链接。

十、进阶优化建议

第一,在配置文件中加上driftfile /var/lib/chrony/drift,这行默认就有,它会记录本地时钟的漂移速率,重启后chrony能更快校准。不要删掉这行。

第二,如果服务器经常重启或者虚拟机快照恢复,建议加上rtcsync参数,让chrony定期把系统时间写回硬件时钟:

rtcsync

第三,生产环境建议至少配置3-4个NTP源,分散风险。不要只配一个,万一那个源挂了就麻烦了。国内推荐阿里云、腾讯云、国家授时中心的NTP池混用。

第四,定期用chronyc sources和chronyc tracking做健康检查,可以写个简单的监控脚本,把偏移量超过阈值的情况告警出来。时间同步异常往往是很多分布式系统故障的隐性根因,比如数据库主从延迟、日志时间错乱、证书验证失败等。

总结一下,CentOS上配置chrony时间同步并不复杂,核心就是改/etc/chrony.conf里的server为合适的NTP池地址,放行防火墙UDP 123端口,重启服务后用chronyc命令验证。但真正的运维功夫在于后续的监控和问题排查,把时间同步当成基础设施的一部分来对待,而不是配完就不管了。