linux系统时钟偏差需通过chrony持续校准而非手动设偏移,driftfile记录固有漂移率自动补偿,rtc必须设为utc并同步,虚拟机需启用kvm-clock时钟源。

系统时钟偏差不是“设个偏移值”就能解决的
Linux 没有提供类似 set-clock-offset +5s 这种直接加减秒数的接口。所谓“配置偏差”,本质是让系统时钟更接近真实 UTC,靠的是持续校准机制,而不是静态偏移补偿。如果你看到 chronyc tracking 输出里 Offset 是 -123.456ms,那它已经在自动修正了——你不需要、也不该手动“配”这个值。
chrony 的 driftfile 才是真正影响长期偏差的关键
driftfile 记录的是系统时钟的固有漂移率(单位:ppm),chronyd 启动时会读取它来预估并补偿硬件时钟跑快/跑慢的趋势。这个文件通常在 /var/lib/chrony/drift,内容形如 -23.456(表示每百万秒慢 23.456 微秒)。
- 不要手动修改这个文件——chronyd 会在运行中自动更新它
- 首次部署或更换硬件后,建议让 chronyd 运行至少 24 小时再观察 drift 值是否稳定
- 如果 drift 值剧烈跳变(比如一天内从 -15 变成 +80),说明系统负载异常、温度波动大,或存在虚拟机时钟源问题
- 在 KVM/QEMU 虚拟机中,务必启用
host时钟源(检查/sys/devices/system/clocksource/clocksource0/current_clocksource是否为kvm-clock)
手动干预偏差只在极端场景下有效,且必须带条件
当偏差超过 1 秒且 chrony 无法自动收敛(比如网络中断后长时间离线),可触发强制步进(makestep)。但注意:这会跳变时间,破坏单调性,数据库、Kafka、ZooKeeper 等服务可能出错。
- 确认当前偏差:运行
chronyc tracking | grep "Offset" - 仅当 Offset 绝对值 > 1s 且服务允许跳变时,才执行:
sudo chronyc -a makestep - 若 chrony 配置里没启用
makestep,需先在/etc/chrony/chrony.conf加一行:makestep 1.0 -1(表示对任意大于 1 秒的偏差都允许步进) - 执行后立刻验证:
timedatectl status | grep "System clock synchronized"应为 yes
硬件时钟(RTC)不准会掩盖系统时钟的校准效果
即使 chronyd 把系统时钟调得非常准,如果关机后 RTC 没同步、或者 BIOS 时间本身漂移严重,下次开机又会回到旧时间。这是最容易被忽略的环节。
- 确认 RTC 存的是 UTC:
timedatectl status | grep "RTC in local TZ"输出应为no - 每次成功同步后,把系统时间写入 RTC:
sudo hwclock --systohc --utc - 检查 systemd 是否在关机前自动同步:运行
systemctl is-enabled systemd-hwclock-save.service,若为 disabled,则启用:sudo systemctl enable systemd-hwclock-save.service - 老旧服务器主板电池失效会导致 RTC 每天快/慢几分钟,这种问题 chrony 无法修复,只能换电池











