☰
Ubuntu时间服务器搭建与chrony配置实战指南
2026/10/10 6:49:50 网站建设 项目流程

很多人把时间服务器当成一个“可选项”,觉得系统时间不差那几秒钟,没必要专门折腾。真到出问题的时候就知道了:日志对不上排查半天、证书验证报错、数据库主从同步异常、定时任务跑乱……这些坑我全都踩过。这篇文章就把时间服务器从原理到配置、再到 Ubuntu 上的客户端调用完整过一遍,尤其适合刚接触 Linux 运维、或者在公司内网搭过基础服务但没认真处理过时间同步的朋友。

我们会用到 NTP(Network Time Protocol)这套经典协议,也会重点讲如今 Ubuntu 上更推荐的 chrony,最后补上手动同步、定时校准、故障排查这些实战环节。内容偏实操,该有的配置项和命令我都会贴出来,照着抄基本就能用。

1. 时间服务器到底在解决什么问题

1.1 为什么系统时间不准会引发连锁事故

先举个最简单的例子:你在一台服务器上写日志,另一台服务器在分析日志。如果两台机器的时间差了 30 秒,那同一个请求的日志时间戳就对不齐,排查故障时你以为的顺序其实是错的,这还不算最严重的。

真正致命的是加密认证环节。HTTPS 证书、Kerberos 认证、JWT Token 这些机制都依赖客户端和服务器的时间基本一致。客户端时间比服务器慢了几分钟,证书会被判定为“尚未生效”;快了几分钟,证书又被判定为“已过期”。我遇到过一次线上服务突然大面积握手失败,最后定位就是一台机器的时间漂移了将近 5 分钟,当时的观感就是整个集群全线报 SSL 错误,非常刺激。

数据库场景更敏感。MySQL 主从复制虽然主要靠 binlog 的位点,但很多高可用方案里的心跳检测、事务超时判断都要用时间戳。定时任务调度更是直接依赖系统时间,每天凌晨跑的备份脚本如果时间错乱,轻则重复执行,重则漏跑。所以时间同步不是运维洁癖,是基础设施的基本功。

1.2 NTP 与 chrony 的选型逻辑

传统的时间同步方案是 ntpd,它已经服务了 Linux 系统几十年,原理是通过层级结构从上游时间源逐级同步。每个节点有一个层级值(stratum),最顶层是 stratum 0(原子钟、GPS 接收机这些硬件时间源),直接连接它们的服务器是 stratum 1,然后逐级往下。层级越低,时间越接近真实源。

但 ntpd 有个老毛病:同步过程慢,启动后可能要花不少时间才能逐渐收敛,而且对网络抖动比较敏感。后来出现了 chrony,它的设计目标就是“更快、更准、更适合现代网络环境”。chrony 有两个核心优势:

一是同步速度快。chrony 能在几十秒内完成初步校准,而 ntpd 可能要等几分钟甚至更久。这对频繁重启的虚拟机、笔记本这类设备特别重要。

二是对网络延迟和抖动有更好的处理。chrony 使用多种算法过滤异常样本,即使上游时间源偶尔不稳定,也能维持本地时间的平滑调整,不会出现时间突然跳变的情况。

Ubuntu 从 16.04 开始就把 chrony 放进了软件源,20.04 及以后的版本更是默认用 systemd-timesyncd 配合 chrony 作为时间同步方案。所以我下面的配置主要围绕 chrony 展开,同时也会提到 systemd-timesyncd 这种轻量级客户端的用法。

注意:如果你的环境要求必须用传统 ntpd(比如某些老旧的监控系统只认 ntpd 的 socket),那可以继续保留,但新部署的机器我建议无脑选择 chrony。

2. 服务端配置:搭建企业内部时间服务器

2.1 安装与基础配置文件解读

假设我们要在公司内网搭一台时间服务器,用来给其他机器提供时间同步源。先装 chrony:

sudo apt update sudo apt install chrony -y

安装完成后,主配置文件在/etc/chrony/chrony.conf。不同版本的 Ubuntu 路径基本一致,旧版本可能直接叫/etc/chrony.conf,如果找不到就用dpkg -L chrony查一下。

打开配置文件,默认内容里有一段很关键:

# 使用 Ubuntu 默认的公共 NTP 服务器池 pool ntp.ubuntu.com iburst maxsources 4 pool 0.ubuntu.pool.ntp.org iburst maxsources 2 pool 1.ubuntu.pool.ntp.org iburst maxsources 2 pool 2.ubuntu.pool.ntp.org iburst maxsources 2

pool指令表示从一组域名动态解析出多个服务器地址,iburst表示启动后立刻发送多个同步请求,加速初次校准。在搭建公司内部时间服务器时,这几行可以保留,因为你的服务器也需要从公网时间源获取基准时间。

接下来需要配置的是允许哪些内网机器来访问这台时间服务器。默认配置里有这样一段:

# 允许本地访问 allow 127.0.0.1 allow ::1

如果你希望整个 192.168.1.0/24 网段的机器都能同步,就需要添加一行:

allow 192.168.1.0/24

注意allow指令可以写多个,也可以指定单个 IP。不配置 allow 的话,chrony 默认只允许本机访问,其他机器即使知道你的服务器 IP 也无法同步。

2.2 关键参数说明与验证手段

配置文件里还有两个参数值得留意:

# 设置本地时钟作为所有客户端的时间源 local stratum 10

local stratum 10的作用是:当这台服务器无法连接到任何上游时间源时,它依然可以把自己当作时间源提供给客户端。这个配置在我们内网服务器“断外网但不希望客户端全部报错”的场景下很有用。

还有一个常见参数:

# 允许 chronyc 远程管理 cmdallow 127.0.0.1 cmdallow ::1 # bindcmdaddress 127.0.0.1 # bindcmdaddress ::1

这些是 chrony 管理接口的权限配置。默认情况下只允许本机执行chronyc命令,如果你需要远程管理,可以放开cmdallow,但一般不建议在生产环境这么做。

改完配置后重启服务:

sudo systemctl restart chrony sudo systemctl enable chrony

验证服务是否正常:

sudo chronyc tracking

chrony tracking的输出能告诉你当前系统时间与上游时间源的偏差、同步方向、最后的校准时点。如果看到Leap status : Normal,且Stratum显示数字,说明同步链路是通的。

查看客户端连接情况:

sudo chronyc clients

这个命令会列出正在从你这台服务器同步时间的客户端 IP、请求次数等信息。内网机器接入后,可以通过它确认服务端确实在发挥“时间源”的作用。

提示:chrony 的配置修改之后不需要重启整个服务,执行sudo systemctl restart chrony虽然简单粗暴,但它会导致正在同步的客户端瞬间断开。更平滑的方式是执行sudo chronyc reload,可以让 chrony 重新读取配置文件而不中断服务。

3. Ubuntu 客户端调用教程:三种方式与适用场景

3.1 轻量级客户端:systemd-timesyncd

Ubuntu 桌面版和服务器版默认都带了 systemd-timesyncd。它不是一个完整的时间服务器实现,而是作为一个轻量级 NTP 客户端存在,适合“只需要定期对时、不额外跑 daemon”的场景。

如果你想将一台 Ubuntu 机器指向内部时间服务器,最省事的办法就是编辑/etc/systemd/timesyncd.conf:

[Time] NTP=192.168.1.10 FallbackNTP=ntp.ubuntu.com

NTP是首选时间服务器地址,FallbackNTP是主服务器不可达时的备用。保存后重启服务:

sudo systemctl restart systemd-timesyncd sudo systemctl status systemd-timesyncd

查看同步状态:

timedatectl

输出里会有一行System clock synchronized: yes,如果显示yes,说明已经成功从时间服务器同步了。再看NTP service: active,也能确认服务在运行。

这里有一个默认规则容易踩坑:systemd-timesyncd 默认是启用的,但如果你之前手动装过 chrony 或者 ntpd,它们会冲突,因为多个时间同步服务不能同时在跑。所以手动配置 timesyncd 之前,最好先确认系统里没有其他 NTP 服务在运行,否则两边会互相干扰。

3.2 完整客户端:使用 chrony 主动调用时间服务器

如果你需要更精细的控制,比如调整同步频率、查看详细漂移数据,建议直接在客户端也装 chrony。安装方式同服务端一致。装完后修改配置:

# 注释掉默认的公网 pool # pool ntp.ubuntu.com iburst maxsources 4 # 指定内网时间服务器 server 192.168.1.10 iburst

重启 chrony 并验证:

sudo systemctl restart chrony sudo chronyc tracking

chronyc tracking里最关键的一项是System time,它显示本地时间与服务器时间的偏差值。比如输出System time : 0.000032 seconds fast of NTP time,说明当前系统快了 0.000032 秒,极为精准。

chronyc sources可以查看当前同步源的状态:

sudo chronyc sources

输出中^*表示当前正在使用的同步源,^+表示候选同步源,^-表示不可用的源。如果看到^*指向你配置的内网 IP,就说明客户端已经正式从时间服务器完成同步了。

3.3 一次性手动同步:ntpdate 与 chrony 的 fallback

有些场景下你不希望系统常驻一个时间同步服务,只想开机时手动对一次时间。传统工具是ntpdate,但在新版 Ubuntu 里它已经被移除,软件源也找不到。替代方案有两个:

第一个是直接用 chrony 的chronyc配合手动调整。先停掉服务再手动同步:

sudo systemctl stop chrony sudo chronyd -q "server 192.168.1.10 iburst" sudo systemctl start chrony

chronyd -q会启动一次临时同步,完成后自动退出,不会影响后续服务的正常启动。

第二个办法是安装ntpdate的替代品,比如ntpsec-ntpdate:

sudo apt install ntpsec-ntpdate -y sudo ntpdate -q 192.168.1.10

-q参数表示只查询不同步,-s参数表示将结果记录到 syslog。注意 ntpdate 这类工具在同步时会直接跳变系统时间,而不是渐进调整,所以服务器上如果有正在运行的关键任务,最好避开业务高峰期执行。

3.4 定时校准任务:crontab 的配置方法

如果你习惯了“每天固定对一次时间”的老思路,也可以设置 crontab。虽然这不是最优解(chrony 本身就持续在后台微调),但某些特殊场景确实有需求,比如虚拟机被宿主机挂起恢复后时间出现大幅偏差。

编辑 crontab:

sudo crontab -e

添加一行,每天凌晨 2 点校准一次:

0 2 * * * /usr/sbin/ntpdate -s 192.168.1.10

如果用timedatectl显示的是System clock synchronized: no,说明 systemd-timesyncd 没在正常工作,这时候 crontab 反而是一个可靠兜底。不过我还是建议优先把 chrony 或 timesyncd 配好,连续微调比每天跳变一次对系统更友好。

4. 常见问题与排查技巧实录

4.1 客户端显示同步成功但时间依旧不对

这个现象我遇到过好几次,排查下来大概率是时区问题。NTP 同步的是 UTC 时间,Linux 系统内部也用 UTC 存储时间,而用户看到的是经过时区转换后的本地时间。如果时区设置错误,哪怕 UTC 时间是准的,你date命令显示的也是错的。

检查时区:

timedatectl

如果Timezone不是Asia/Shanghai之类的预期值,手动修改:

sudo timedatectl set-timezone Asia/Shanghai

改完后再确认Local time是否正常。时区和时间同步是两套独立机制,两者都要正确,才能真正杜绝“看着时间不对”的问题。

4.2 chrony 日志报错:Timeout 或 Network is unreachable

当客户端配置了内网时间服务器但无法连通时,journalctl -u chrony里会出现类似Timeout synchronizing的日志。排查顺序:

  1. ping 一下时间服务器 IP,确认网络通。
  2. 检查防火墙是否放行了 UDP 123 端口。这是 NTP 的固定端口,很多云安全组默认不放行,容易遗漏。
  3. 确认服务端 chrony 配置里的allow是否包含了客户端网段。
  4. 用chronyc sources看同步源是否显示为^?,如果是,表示该源从未成功响应。

防火墙这一条特别容易忽略。云服务器有安全组,物理机有 iptables,你服务端配置得再好,UDP 123 被拦住了,客户端一样连不上。

4.3 时间偏移太大导致 chrony 拒绝同步

chrony 默认有一个保护机制:如果本机时间与上游时间源相差超过 1000 秒(约 16 分钟),它会认为这是异常情况,不会直接把时间跳过去,而是慢慢调整。这种设计是为了防止系统时间突然大跳变引发业务问题,但代价是恢复时间很长。

碰到这种场景,最快的办法是先手动把时间大致校准到正常范围内,再启动 chrony 做后续微调:

sudo systemctl stop chrony sudo date -s "2026-09-15 10:00:00" sudo systemctl start chrony

或者用chronyd -q强制同步一次:

sudo systemctl stop chrony sudo chronyd -q "server 192.168.1.10 iburst" sudo systemctl start chrony

注意chronyd -q在某些版本里会覆盖本地时间直接跳变,所以执行前确认没有重要服务依赖当前时间。

4.4 阿里云、腾讯云等云主机重启后时间回退

云主机经常遇到一个问题:重启后时间又回到了快照时刻,或者和真实时间相差很大。这是因为虚拟化环境下,宿主机不会实时把时间传递给虚拟机,特别是开启了 suspend 功能的主机,休眠期间时间流逝与实际不同步。

解决方法是让虚拟机在启动时自动执行一次时间同步。如果是 systemd-timesyncd,可以在/etc/systemd/timesyncd.conf里配置好 NTP 地址,它会自动启动。如果用的是 chrony,确认iburst参数已配置,它会在启动后几十秒内完成初步同步。再加上开机启动服务:

sudo systemctl enable chrony

基本上重启后就能自动恢复正确时间。

一个记录表整理在这里,方便对应:

现象可能原因排查命令解决办法
时间一直差 8 小时时区配置错误timedatectltimedatectl set-timezone Asia/Shanghai
chrony 显示同步失败防火墙拦截 UDP 123journalctl -u chrony放行 UDP 123 端口
同步源显示^?网络不通或 allow 未配置chronyc sources检查服务端 allow 配置
时间偏差超过 1000 秒chrony 拒绝大跳变chronyc tracking手动校准一次再启动 chrony
timesyncd 与 chrony 冲突多个 NTP 服务同时运行systemctl status chrony禁用其中一个服务

4.5 内网没有公网出口怎么搭时间源

如果你的服务器完全隔离在公网之外,访问不了ntp.ubuntu.com,也访问不了阿里云 NTP 服务器,那么只能把内网的一台机器作为“权威时间源”,手动设置基准时间,然后让其他机器都同步它。

这种情况下服务端配置需要加以下参数:

server 127.127.1.0 iburst fudge 127.127.1.0 stratum 10 local stratum 10

127.127.1.0是 chrony 对本地时钟的特殊引用,表示把本机系统时间当作时间源。fudge的作用是调整这个本地时钟源的 stratum 层级别。配置完成后,重启 chrony:

sudo systemctl restart chrony sudo chronyc tracking

你会看到时钟源变成了本地时钟,其他内网机器就可以把它当作 NTP 服务器了。这个方案的局限是,其他机器同步到的基准时间取决于你这台服务器手动设置的时间是否准确,所以建议定期找一台能访问外网的机器对一次表,再把基准时间纠正回来。

5. 我用下来觉得最省心的几个习惯

先说明,下面的建议纯属个人经验,不一定适合所有场景,但至少能让你少走弯路。

第一个习惯:所有服务器统一用 UTC 存储时间,只在用户界面层做时区转换。Linux 服务器上跑的应用大多数都希望时间戳基于 UTC,如果每台机器都设置成 Asia/Shanghai,日志文件里的时间戳会带上时区偏移,跨系统对比时非常难受。桌面机可以设成北京时间,服务器建议保持 UTC,然后业务展示层自行转换。

第二个习惯:配置文件尽量统一模板。公司里几十台机器,如果每台机器的时间服务器配置都手写一遍,大概率会出现某台漏配了iburst、某台把server写成了pool之类的差异。维护一个统一配置模板,用配置管理工具下发,比在每台机器上手动改要稳得多。

第三个习惯:定期巡检,而不是出事再查。一条命令就能看所有关键状态:

timedatectl && chronyc tracking && chronyc sources

把这三条命令的输出自动化采集到监控系统里,一旦System clock synchronized: no就触发告警。时间同步这种事,平时根本感觉不到存在,但只要它失效一次,后面引发的问题往往非常难排查。

第四个习惯:别过度依赖外部公网 NTP。公司的生产环境里,哪怕是云服务器,我也建议至少保留一个内部的 chrony 服务器作为时间源,所有机器统一指向它,再由这台服务器去同步公网时间源。这样做的最大好处是:当某个系统被要求走严格的内网隔离时,时间同步不受影响;同时内网里出现时间漂移时,也能从共同的上游源做一致性校准。多台机器各自单独连公网时间池,如果网络路径抖动,它们之间的时间差反而会被放大,串日志的时候又要头疼了。

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

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

立即咨询