Linux 时钟源与时间同步原理

8次阅读

linux有系统时间(CPU tick维持)和硬件时间(RTC晶振维持),需用chronyd渐进同步并写回RTC;禁用ntpdate跳变,云服务器应优先用systemd-timesyncd。

Linux 时钟源与时间同步原理

Linux 有两个时间,别搞混了

系统启动时,内核从硬件时钟(RTC)读一次时间设为系统时间;之后两者就各自走各自的——系统时间靠 CPU tick 累加维持,硬件时钟靠主板电池供电的晶振维持。你用 date 看到的是系统时间,用 hwclock -r 看到的是硬件时间。它们长期不同步是常态,尤其重启后没做同步的话,差几分钟很常见。

  • 系统时间不准 → 影响日志时间戳、定时任务触发、kafka 消息时间戳、zookeeper 会话超时(30 秒偏差就会断连)
  • 硬件时间不准 → 下次开机直接继承错误时间,雪上加霜
  • 所以同步完成后,记得用 hwclock -w 把校准后的系统时间写回硬件时钟

ntpdate 和 ntpd/chronyd 的本质区别

ntpdate 是“一刀切”:发现当前时间比 NTP 服务器慢 5 分钟,立刻把系统时间拨快 300 秒。这会导致 cron 任务重复执行、java 应用里 System.currentTimeMillis() 突然倒退、数据库事务时间戳乱序等真实故障。而 ntpdchronyd 是“渐进式”:它通过微调内核时钟频率(tick rate),让时间在几十秒甚至几分钟内慢慢追上,不跳变、不倒流。

  • RHEL/centos 7+ 默认用 chronyd,不是 ntpd;RHEL 8+ 已移除 ntp 包,chrony 是唯一官方支持方案
  • 生产环境严禁只跑 ntpdate 就完事;正确做法是先用 ntpdate -u 快速粗调(比如偏差 > 1 秒),再启 chronyd 做细调
  • chronyd虚拟机、断网重连、网络抖动更友好,ntpd 在持续在线的物理机上更稳,但新系统别纠结,直接用 chronyd

/etc/chrony.conf 里最关键的三行配置

默认配置往往连不上国内可用源,得手动改。重点不是加多少 server,而是控制行为逻辑:

  • server ntp.aliyun.com iburst:用阿里云公共 NTP 源(免备案、低延迟),iburst 表示首次连接时发多个包加速同步
  • makestep 1.0 3:如果系统时间偏差超过 1 秒,允许前 3 次启动时“跳变”校正(避免 chronyd 启动失败卡住)
  • rtcsync:启用内核 RTC 同步,让硬件时钟每 11 分钟自动对齐一次系统时间,防止关机后 RTC 漂移

别碰 driftfilehwtimestamp——前者是 chrony 自己管的偏移记录,后者需要 NIC 硬件支持,普通服务器开了反而报错。

验证同步是否真生效,别信 timedatectl status 的表面状态

timedatectl status 显示 “NTP enabled: yes” 和 “NTP synchronized: yes” 只代表服务在跑、上次同步没失败,不代表当前时间准。真正要看的是:

  • chronyc tracking:看 Offset 字段,单位是秒,理想值应 1s,说明没同步成功或源不可达
  • chronyc sources -v:看列出的 server 是否有 *(当前主源)或 +(候选源),全都是 ? x 就是网络不通或防火墙拦了 udp 123 端口
  • chronyc makestep:强制立即跳变同步(仅调试用),执行后立刻再跑 chronyc tracking 看 offset 是否归零

最常被忽略的一点:云服务器(如阿里云腾讯云)默认禁用 NTP 客户端,靠宿主机注入时间;如果你手动启了 chronyd,反而可能和宿主机时间打架,导致 offset 持续震荡——这种场景下,应该关掉 chronyd,改用 systemd-timesyncd(轻量级,只 client 不 server)。

text=ZqhQzanResources