☰
CentOS7时间同步实战:用chrony替换ntpd配置时间源
2026/10/21 23:29:12 网站建设 项目流程

CentOS7上做时间同步这件事,很多人第一反应还是装ntpd、改ntp.conf那一套老流程。但实际上CentOS7从系统层面已经把默认的NTP实现换成了chrony,只是有太多教程还在用老思路教人。“CentOS7使用chrony配置时间源”说白了就是把NTP服务本身换了个更靠谱的引擎,配置文件里核心的server、pool、allow、local stratum这几个关键项吃透了,剩下的就是排查习惯的问题。这篇文章我就从为什么换、怎么配、踩过哪些坑三个层面,把chrony配置时间源的完整过程拆开讲一遍。适合刚接手CentOS7服务器、需要在内网搭时间同步体系、或者遇到时间漂移问题想彻底解决的运维同学参考。

1. 为什么CentOS7时间同步要选chrony而不是ntpd

1.1 CentOS7的默认选择:chrony不是新玩具,而是正统接班

从CentOS7开始,官方仓库里chrony就作为系统默认的NTP实现被集成进来了。这里有个容易混淆的点:CentOS7的发行包里依然保留了ntp相关软件,但系统里并没有默认启用ntpd服务。很多人装完系统直接跑systemctl status ntpd会得到unit not found或者inactive的结果,觉得是自己没装好,其实这就是预期行为——rh时间同步的默认方案就是chronyd。

为什么官方要做这个切换?核心原因是ntpd在应对现代服务器环境时的几个短板太明显了。第一是同步收敛速度慢:ntpd启动后往往需要很长一段时间(以分钟计)才能把系统时间逐步调整到接近目标源的水平,对于刚开机、时间偏差很大的机器来说,这段时间系统时间基本不可用。第二是对网络抖动和间歇性断连的容忍度低,虚拟机迁移、网络闪断、宿主机休眠这类场景下,ntpd的同步表现并不理想。chrony正是针对这些问题设计的。

第三点也值得放在台面上说:ntpd的配置语法虽然成熟,但很多参数对新手极不友好,比如driftfile、restrict、fudge这类概念理解门槛很高。chrony的配置风格更接近现代系统——选项命名直白,配置项数量少,逻辑清晰,新手照着一份示例配置改server和allow就能跑起来。

1.2 chrony真正厉害的两个点:快速同步与抗干扰能力

chrony的快速同步能力,源自它对初始时间偏差的处理方式。ntpd的默认策略是缓慢“驯服”系统时间,尽量不产生时间跳变;而chrony默认配置里带了一条makestep 1 3,允许在启动后前三次同步中,如果检测到系统时间与服务器偏差超过1秒,直接一次步进校准到位,而不是花几分钟慢慢拉。这条策略对刚上架的新服务器、长时间断电重启的机器来说是救命稻草——你肯定不想等一个时间偏了十几分钟的数据库节点花十分钟把时间“磨”回来。

抗干扰能力体现在chrony对源服务器质量的持续监测机制上。它不只是简单地把NTP请求发出去然后信任返回结果,而是会持续统计每个时间源的延迟、抖动、偏移量,综合计算出一个“信任度”分数,并动态调整各个源的权重。某个源网络抖动剧烈时会自动降低其影响,恢复后又能自动回到正常状态。这意味着即使某台上游NTP服务器偶尔抽风,也不会拖垮整个时间同步链路的稳定性。

2. 安装部署与基础配置实操

2.1 安装并启动chrony服务,确认系统时区

绝大多数CentOS7默认是已经装好chrony的,但有些精简安装或者云镜像会把不用的包裁掉。先检查一下:

rpm -q chrony

如果没有输出,直接安装:

yum install -y chrony

安装后需要确保服务开机自启,这一点很容易被忽略,因为很多人在测试时systemctl start chronyd看着能用就走了,结果服务器重启后时间照样漂。规范操作是两步一起做:

systemctl enable chronyd systemctl start chronyd

然后确认服务状态:

systemctl status chronyd -l

看到active (running)并且没有任何报错,说明chroyd进程本身没问题。

在配置时间源之前,我强烈建议先确认系统时区是对的,因为chrony解决的只是“时间准不准”,不负责“时区对不对”。时区错误时间再准也无意义。检查时区:

timedatectl

如果Time zone不是预期的Asia/Shanghai,改一下再回到时间同步的工作:

timedatectl set-timezone Asia/Shanghai

这里说一个小细节:国内大部分云服务器默认时区就是Asia/Shanghai,但从海外服务商购的裸金属服务器经常是UTC时区,改完时区后date看到的本地时间才是我们习惯的格式。

2.2 /etc/chrony.conf核心参数逐条拆解

chrony的配置文件路径是/etc/chrony.conf,启动后会由chronyd进程读取。这个文件默认的内容不多但每个参数都有用,我拆几个核心项讲透。

server和pool是定义上游时间源的条目。区别在于server指定的是单个NTP服务器,而pool指定的是一个域名背后的一组服务器——解析后会从中挑选若干台作为源。在配置文件里,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

iburst这个参数值得单独讲。它的作用是:当chronyd启动并试图与源建立同步关系时,如果这个源可达,则立即发送一组(通常4个)快速连续的NTP请求,而不是按正常的轮询间隔每秒一个。这样初始同步建立的时间从几十秒缩短到几秒钟。绝大多数生产环境都应该保留iburst。

allow参数用于控制哪些客户端可以访问本机的NTP服务。默认配置里通常只有allow 127.0.0.1(以及可能的::1),如果需要让局域网其他机器从这台服务器同步时间,就需要显式放开对应网段:

allow 192.168.1.0/24

deny是它的反向操作,优先级高于allow,但日常配置里被用到的机会不多。

local stratum是另一个容易踩坑的配置。默认值8,含义是:当chronyd无法与任何上游源通信时,是否允许本机以“本地时钟源”的身份继续对外提供NTP服务,并且把自己声明的层级设为8。层级(stratum)数值越小表示离真实时间源越近。如果一台服务器既连着外网上游源,又想在内网提供时间服务,local stratum 10通常是比较稳妥的配置——它保证了内网客户端能看到一个有层级的可用来源,不会因为上一级断了而全部级联失效。

makestep 1 3前面提到了,含义是“在前3次时间校准中,如果偏差超过1秒则直接步进”。这三个数字都可以按实际调整,生产环境里我建议保持默认,除非你有审计或业务上禁止时间跳变的要求。

rtcsync这个参数默认是开启的。它让chronyd周期性(默认每11分钟)把系统时间同步到硬件时钟(RTC)。如果关掉它,服务器的硬件时钟可能长期不更新,下次断电重启后硬件时间就会明显跑偏。虚拟化环境里这个参数尤其重要——很多虚机的问题就出在宿主机时间不准,导致虚机内的RTC时间也不准,这时还要配合下面的虚拟化优化参数。

rtcsync

hwtimestamp相关的配置行(例如hwtimestamp *)用于支持硬件时间戳特性,如果你用的是普通物理网卡且没有特殊需求,保持默认或者不启用即可。这块不是时间同步的核心链路,不需要过度关注。

2.3 修改配置后的生效操作

修改/etc/chrony.conf之后需要重启服务才能让配置生效,这一条必须记住:

systemctl restart chronyd

重启后不要急着下结论,先看同步状态:

chronyc sources -v

如果看到^*标记的一个或多个源,说明已经与上游源建立起了同步关系,*表示当前被选中的主时间源。^?表示不可达,^-表示虽然可达但被判定为不合格(比如层级过高、偏差过大),这些状态后续需要进一步排查。

除了配置文件,还有一个小操作是很多人在切配置后容易漏掉的:清理chronyd的旧状态。chronyd会在/var/lib/chrony/下保留一些历史测量数据(主要是drift相关数据),大部分情况下让它自己重新学习就行,但如果发现重启后依然沿用旧的错误漂移值,可以停掉服务后清理这几个文件再启动:

systemctl stop chronyd rm -f /var/lib/chrony/* systemctl start chronyd

这个操作在排查“配置改了但时间依然不对”的疑难杂症时非常有效。

3. 内外网不同场景的时间源配置实战

3.1 有外网的常规服务器:用云厂商或公共NTP池

如果你的服务器可以访问公网,最简单的方案就是用CentOS官方默认的0.centos.pool.ntp.org到3.centos.pool.ntp.org。不过国内网络环境访问这些地址的延迟和稳定性并不总是理想,实测有时候会出现持续无法同步的情况。我的建议是,国内生产服务器的上游时间源优先选择两个或三个可用源做冗余,比如某云厂商的内网NTP地址和国内高校的公共NTP地址交叉使用。

一个小技巧:pool关键字通常和公共NTP池配合使用。你可以在配置里既写server又写pool,让chronyd获取更充足的候选源。例如:

server ntp.aliyun.com iburst server ntp1.aliyun.com iburst pool 2.centos.pool.ntp.org iburst

配置完成后重新加载,然后用chronyc sources -v观察。正常状态下,多个源会同时被列为可达(^+、^*),系统会从这些综合质量最好的源中选一个作为主源。值得说明的是,NTP的选源并不是简单地挑延迟最低的那个——chrony会综合考虑抖动、距离、稳定度等多项指标,最终选出的源可能不是延迟最优但一定是最稳的。

3.2 无外网的内网环境:自建时间服务器并下发同步

很多企业内部环境是隔离的,不能访问公网NTP。这种情况下需要一台或多台“内网时间基准服务器”作为整个环境的唯一上级源。现实中常见做法是在管理网里挑一台相对稳定、长期不关机的机器作为内网NTP服务器,用它同步公网源(如果能通过管理网出公网),或者直接使用本机硬件时钟作为时间基准。

同步公网源的情况配置起来和上一节完全相同,但需要把这条NTP链路特地打开防火墙出方向规则(通常UDP 123出方向默认放行),并在这台服务器上加上local stratum 10,防止上游公网NTP不可达时内网其他机器拿不到时间源。如果这台基准服务器完全连不上公网,只能依赖硬件时钟,那配置就简化为:

server 127.127.1.0 iburst local stratum 10

127.127.1.0是NTP协议中约定俗成的“本地参考时钟”地址,不代表真实服务器,而是告诉chrony:把本机硬件时钟当作时间源。这种模式下时间精度完全取决于服务器硬件时钟的稳定性,长期运行后偏差会逐步增大,需要手动干预校准,但总比整个内网没有时间源强。

内网其他客户端在这台基准服务器配好后,它们的配置就很简单了。把server指向这台内网服务器:

server 192.168.1.10 iburst

注意这里客户端不需要local stratum,也不需要allow,它们只需要做“主动拉取时间”这一件事。

3.3 客户端防火墙规则与chrony对外服务的配置

如果这台服务器不仅要同步上游源,还要作为内网NTP服务器给其他机器提供时间,那就必须放行UDP 123端口。CentOS7防火墙基于firewalld,操作如下:

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

第一条命令把端口加入永久规则,第二条命令让规则立即生效。这里千万注意--permanent和--reload的顺序,如果你先reload再permanent,或者只执行permanent不reload,规则都不会按预期生效。

除了防火墙,还要确认chrony配置文件的allow配了对应网段。很多人在这一步栽跟头:防火墙端口开了,客户端chronyc sources依然显示源不可达,原因就是服务端/etc/chrony.conf里只允许了127.0.0.1。修改allow后重启chronyd即可。

另外在客户端验证同步时有个更直接的手段:用chronyc tracking查看详细同步状态。这个命令会打印出当前系统时间与主源之间的偏差(System time字段)、频率误差、每轮校正间隔等。看到Leap status为Normal、Stratum字段为合理的数值,基本说明同步链路健康。

4. 验证、排查与虚拟化环境的时间坑

4.1 chronyc命令族的正确用法

配置文件改完,验证不能只看systemctl status,要把chronyc的几个命令都用起来。

chronyc sources -v是第一道验证,输出里每一行代表一个源,关键看状态符:

  • ^*:当前选中的主源,一切正常
  • ^+:可作为备选源的可用源
  • ^-:源可用但因层级/距离等原因不被选入候选集
  • ^?:源不可达,多半是网络或防火墙问题

chronyc tracking是第二道验证,这个命令输出偏移量和频率修正数据。我关注的核心字段是System time(系统时间偏差)、Last offset(上次校正偏移量)和Leap status。如果System time长期在几毫秒以内波动,说明同步质量很好;如果偏差恒定大于几十毫秒,则要考虑上游源质量或者本地虚拟化时钟精度的问题。

chronyc sourcestats则是查看源的统计信息,它给出每个源的采样点数量、偏移标准差等数据,适合深入判断某个源是否值得信任。

4.2 高频问题排查速查表

我把实际运维中遇到过的典型问题和排查思路整理成一张表,照着表逐项排除,能解决大部分时间同步故障。

症状可能原因排查/解决办法
sources -v全部显示^?防火墙阻断UDP 123 / 上游源不可达检查防火墙规则,换一个可用的上游NTP地址
客户端能连通但Stratum显示16上游服务器时间本身不可用,或者服务端禁止了客户端在服务端确认allow和local stratum配置
chronyc tracking显示Leap status: Not synchronizedchronyd尚未与任何源建立同步关系等待几十秒后再看,或者检查makestep是否被设置过小
服务器时间与真实时间相差几分钟但系统不校正makestep被改成过大或禁用,时间被缓慢驯服确认makestep 1 3存在,或手动chronyc makestep强制步进
内网客户端无法同步到自建服务器服务端allow网段未配置 / 防火墙未放行UDP 123服务端加allow,放行端口后重启chronyd
同步一段时间后系统时间又开始小幅度漂移虚拟化环境时钟源被频繁暂停(如宿主机过载)检查rtcsync与虚拟化时钟配置,必要时调高同步频率

4.3 虚拟化环境的时间漂移处理经验

虚拟化环境(包括各类云主机和本地虚拟机)是时间同步问题的高发区。底层机制是:虚拟机里的“硬件时钟”本质上是由宿主机模拟的,如果宿主机负载过高,虚拟CPU的时钟中断会严重延迟,导致虚拟机内时间漂移速度远超物理机。chrony可以在一定程度上补偿这种漂移,但前提是配置正确。

我的经验是两步走。第一步确保rtcsync是开启状态,让系统时间与虚拟RTC之间保持“锚定”关系,至少避免重启后时间跳变过大。第二步是不要隔太久才同步一次,虚拟环境的系统时钟不稳定,把轮询间隔(默认由minpoll/maxpoll控制,通常为64秒到1024秒)调得更频繁一些是比较实用的做法。例如在配置里显式设置:

server ntp.aliyun.com iburst minpoll 4 maxpoll 6

这里的minpoll 4和maxpoll 6表示轮询间隔在2^4=16秒到2^6=64秒之间动态调整。相比默认的64秒起步,这个配置在虚拟化场景下能更快感知到时间漂移。

还有一类特殊情况是虚拟机休眠(suspend)恢复后时间偏移极大。chrony应对这个场景的能力已经比ntpd好很多,但如果偏移达到几十分钟甚至几个小时,可以手动强制校准一次:

chronyc makestep

这条命令会立即将系统时间步进到与当前所选主源一致,不需要等待下一次自动同步周期。在每次虚拟机恢复运行后手动执行一次,是保持集群内各节点时间一致的可靠手段。

5. 最后再分享两个实际经验

从CentOS7迁移到chrony配置时间源的这几年,我个人体会最深的一点是:时间同步的维护焦点不在于配置本身,而在于持续观察。配置文件十几行就能搞定,但真正的问题往往发生在网络环境变化、上游NTP队列不可达、或者虚拟化宿主机调整之后。习惯性地定期跑一次chronyc tracking和chronyc sources -v,比等告警来了再排查要省力得多。

第二个经验是关于多级时间架构的:如果内网机器数量超过几十台,我建议不要全部直接指向同一个上游源,而是搭成两三层的时间分发结构——最上层一两台机器同步公网源,第二层负责给本地部分机器提供时间服务,下面的机器只面向第二层。这种结构的好处是即使某台上游分层服务器故障,最多影响一个分组的机器,不会全网时间全部失联。chroyd本身对这种层级结构支持得非常好,每一层只需要在配置里指定自己的上游,配合allow限制访问范围即可。实际部署过几次之后你会发现,时间同步这件事一旦架构清晰,就能稳定跑很久,不需要频繁介入。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询