现代linux系统应使用chronyd或systemd-timesyncd替代已弃用的ntpd;chronyd适用于内网/生产环境,支持大偏差校正(需配置makestep并执行hwclock--systohc);systemd-timesyncd适合轻量场景,启用后需timedatectl验证。

现代 Linux 系统时间同步不能靠 ntpdate 临时打补丁,也不能盲目启用 ntpd —— RHEL 8+/CentOS 8+、Ubuntu 20.04+ 默认已弃用 ntpd,强行启用会导致 systemctl start ntpd 静默失败,或 ntpq -p 报 Connection refused。真正可靠且默认支持的方案是 chronyd(客户端)或 systemd-timesyncd(轻量级客户端),选哪个取决于你的场景和精度要求。
chronyd 客户端:内网/生产环境首选
如果你在企业内网、Kubernetes 节点、或对时间收敛速度有要求(比如虚拟机、云主机),chronyd 是唯一推荐方案。它能处理网络抖动、大幅偏差(靠 makestep)、并支持硬件时钟写入。
- 先确认没冲突:
systemctl is-active ntpd应为inactive;若为active,执行systemctl disable --now ntpd - 确保已安装:
rpm -q chrony(RHEL/CentOS)或dpkg -l | grep chrony(Debian/Ubuntu) - 编辑
/etc/chrony.conf,只保留一行有效server,例如:server 192.168.100.10 iburst;注释掉所有pool.ntp.org类公网源,避免内外混用导致漂移 - 重启服务:
systemctl restart chronyd,立刻验证:chronyc tracking中System time显示OK,且chronyc sources -v目标 IP 前有* - 若首次同步卡住,检查防火墙:
firewall-cmd --list-ports | grep 123;无输出则加规则:firewall-cmd --permanent --add-port=123/udp && firewall-cmd --reload
systemd-timesyncd:桌面/边缘设备快速启用
适合不需要高精度、不跑关键服务的场景(如开发机、树莓派、CI 构建节点)。它不监听端口、不提供服务端能力、资源占用极低,但无法处理 >5 秒的偏差,也不支持 iburst 或自定义源组。
- 启用即生效:
systemctl enable --now systemd-timesyncd - 查看状态:
timedatectl status,确认System clock synchronized: yes且NTP service: active - 若需指定 NTP 源(默认是 systemd 内置池),编辑
/etc/systemd/timesyncd.conf,取消注释并修改Servers=行,例如:Servers=time1.aliyun.com - 手动触发一次同步:
systemctl kill --signal=SIGHUP systemd-timesyncd(注意不是restart,后者会重置连接状态)
chronyc makestep:修正大偏差的唯一安全方式
当系统时间偏差超过 30 秒(chrony 默认阈值),它会拒绝步进校正,只做缓慢 slewing —— 这意味着你等几分钟也看不到时间跳变。此时必须显式启用 makestep。
- 编辑
/etc/chrony.conf,添加或取消注释这行:makestep 1 -1(表示对任意偏差 ≥1 秒都允许立即跳变) - 重启服务:
systemctl restart chronyd - 立即执行:
chronyc -a makestep(-a表示跳过认证,适合本地操作) - ⚠️ 注意:
makestep不会自动写入硬件时钟;同步后务必运行hwclock --systohc,否则重启后时间归零
别忽略硬件时钟写入这个动作
无论用哪种工具同步,只要没执行 hwclock --systohc,关机再开机时间就回退。这不是 bug,是 Linux 的设计:系统时间与硬件时钟默认异步运行。
- chronyd 可配置开机自动写入:在
/etc/sysconfig/chronyd(RHEL/CentOS)中设HARDWARECLOCK=yes;Ubuntu/Debian 则需在/etc/default/rcS中设UTC=yes并确保systemd的hwclock-save.service启用 - 手动写入最稳妥:
hwclock --systohc(以系统时间为基准更新硬件时钟) - 验证是否生效:
hwclock --show输出应与date接近(误差几秒内)











