chrony 配置 makestep 1 -1 禁止时间跳变、rtcsync 同步硬件时钟,配合开机加载 RTC 时间和每日 cron 固化,可彻底解决服务器时间跳变引发的 HTTPS 证书错误、日志错乱、监控失真及 Kafka 时间戳倒流问题。

服务器时间突然跳变,会导致 HTTPS 证书报“证书尚未生效”或“已过期”,Nginx/Java/MySQL 日志时间错乱、监控告警失真,甚至 Kafka 消息时间戳倒流。根本原因常是系统时钟未受控漂移,或硬件时钟(RTC)与系统时钟长期不同步。用 chrony 主动校准 + hwclock 定期固化,能稳定解决。
chrony 配置:禁用跳跃,只做渐进式调整
默认 chrony 在检测到大偏差时会直接 step(跳变)时间,这正是问题源头。需强制它始终 slewing(缓慢偏移):
- 编辑
/etc/chrony.conf,添加或确认以下行: -
makestep 1 -1:表示“任何偏差都禁止 step,一律 slewing”(-1代表所有时间差) -
rtcsync:让 chrony 每 11 分钟自动把校准后的系统时间写回硬件时钟(可选但推荐) - 确保有至少 2–3 个可靠 NTP 源,例如:
pool ntp.aliyun.com iburst
重启服务:systemctl restart chronyd;检查状态:chronyc tracking(看 System time 是否在缓慢收敛)、chronyc sources -v(确认源在线且有效)。
开机时从硬件时钟加载时间,避免冷启动误差
服务器断电重启后,若 RTC 时间严重不准(如 BIOS 电池失效),系统可能以 1970 或随机时间启动,chrony 启动前就已出错。需在 systemd 启动早期读取 RTC:
- 启用
systemd-timesyncd并禁用其服务(避免和 chrony 冲突):systemctl disable systemd-timesyncd - 创建
/etc/systemd/system/hwclock-load.service:
[Unit] Description=Load system time from hardware clock Before=chronyd.service[Service] Type=oneshot ExecStart=/sbin/hwclock --hctosys --utc RemainAfterExit=yes
[Install] WantedBy=sysinit.target
启用该服务:systemctl enable hwclock-load.service。这样每次开机,系统先按 RTC 时间初始化,再由 chrony 渐进校准。
定期固化系统时间到硬件时钟,防止断电丢失
chrony 的 rtcsync 是被动同步(依赖内核定时器),不够可靠。建议每天固定时刻主动写入一次:
- 添加 cron 任务:
0 3 * * * /sbin/hwclock --systohc --utc >> /var/log/hwclock.log 2>&1 - 确保硬件时钟使用 UTC(而非本地时间),避免时区切换引发歧义。验证命令:
timedatectl status | grep "RTC time",显示时间应与date -u接近 - 如 BIOS 显示时间异常,可在 BIOS 中设为 UTC 模式,或统一用
timedatectl set-local-rtc 0强制系统按 UTC 管理 RTC
验证与日常巡检要点
修复不是一劳永逸。建议每周执行一次快速检查:
-
chronyc tracking:关注Offset(应持续 Leap status(应为Normal) -
hwclock --show与date -u对比:两者差值建议控制在 ±1 秒内 - 查日志:
journalctl -u chronyd | grep -i "step\|offset",确认无 step 记录 - 模拟测试:手动拨快/慢 30 秒,观察
chronyc tracking中Offset是否缓慢归零(非跳变)
不复杂但容易忽略。核心就三点:chrony 不跳、开机先读 RTC、每天写回 RTC。时间稳了,证书和日志自然就对了。










