技术指南

Linux 时间漂移排障:区分时区、时钟与 NTP 同步

从 UTC 现场出发,区分时区显示、系统时钟、同步来源与收敛状态,再安全恢复时间敏感服务。

证书突然被判定尚未生效、令牌立即过期、定时任务错窗或跨机日志无法排序时,先区分显示时区、系统实时时钟和同步状态。时区只改变同一时间点的显示方式;NTP 已启用只表示某个同步服务可能被启动;只有守护进程选中可信来源、剩余修正可接受,并且依赖业务恢复,才能说明时间故障已经收敛。

用现象先分五条路径

观察优先判断下一步
UTC 时间正确,只有本地小时或日期错误时区配置或应用自己的时区核对 `/etc/localtime`、进程配置和容器环境,不调整系统时钟
UTC 本身偏差,且同步服务未运行同步实现缺失、被禁用或互相替换识别发行版实际使用的 timesyncd、chronyd 或其他实现
服务运行但没有选中来源DNS、网络、来源配置、来源一致性或认证问题读取守护进程状态、来源选择和同窗日志
来源已选中,但仍有剩余修正守护进程正在 slew,或误差过大不适合在线慢调观察收敛速度;按业务故障预算决定维护窗口
每次重启、迁移或宿主暂停后再次偏移RTC、启动顺序、虚拟化时间源或宿主事件核对 RTC/UTC、boot 日志和供应商事件,不只更换公共 NTP

先保存 UTC、时区与当前实现

输出应与一条独立可信时间来源和真实业务错误同窗保存;grep 只用于收窄初查,结论仍需回读完整服务日志
stamp=$(date --utc --iso-8601=ns)
printf 'observed_utc=%s\n' "$stamp"
date --iso-8601=ns
timedatectl status
timedatectl show -p Timezone -p LocalRTC -p NTP -p NTPSynchronized
readlink -f /etc/localtime
systemctl list-units --type=service --state=running --no-pager \
  | grep -E 'systemd-timesyncd|chronyd|ntp(d)?' || true
journalctl -b --no-pager \
  | grep -Ei 'clock|time.*(jump|sync)|ntp|chrony' | tail -n 120

`timedatectl status` 汇总系统时钟、RTC、时区和网络同步状态,但不能替代具体守护进程的来源证据。还要记录观察位置:宿主机、容器和远程开发环境可能读取不同的时区文件或受到不同权限限制;容器通常不应自行修改宿主时钟。

时区错误不等于系统时间错误

Linux 应用通常以 Unix 时间或 UTC 交换事件,再按 IANA 时区规则显示。`timedatectl set-timezone` 修改 `/etc/localtime` 指向的时区数据,不是校准系统时钟。先把同一事件的 UTC 时间戳与本地显示并排比较;如果 UTC 正确,只修复系统、容器或单个应用的时区,并复查夏令时边界。RTC 应尽量保持 UTC,systemd 上游明确警告 local RTC 会给时区和夏令时调整带来问题。

systemd-timesyncd 要看服务器和同步结果

这些子命令只适用于 systemd-timesyncd;发行版未安装或改用 chronyd 时,不要把命令不可用误判为 NTP 故障
timedatectl timesync-status
timedatectl show-timesync --all
systemctl status systemd-timesyncd.service --no-pager --full
journalctl -u systemd-timesyncd.service -b --no-pager
systemd-analyze cat-config systemd/timesyncd.conf

systemd-timesyncd 是最小化 SNTP 客户端:大偏差会 step,小偏差会逐渐调整;复杂的完整 NTP 场景不在其范围内。它可能从全局配置、每链路静态设置和 DHCP 得到服务器,因此有效配置不能只读 `/etc/systemd/timesyncd.conf`。`time-set.target` 只保证启动时把时钟推进到一个大致单调的值,不等于已和准确来源同步;依赖准确时间的单元需要使用同步门禁而不是仅依赖启动顺序。

Chrony 要分开看来源、系统时钟和收敛

这些是只读监控命令。先确认本机实际运行 chronyd,再解释输出;不要把示例中的固定偏差或 reach 数值当作通用健康阈值
chronyc activity
chronyc tracking
chronyc sources -v
chronyc sourcestats -v

`tracking` 的 System time 是系统时钟相对 Chrony 内部 NTP 时钟的当前剩余修正;其他多数偏差字段相对的是 NTP 时钟,含义并不相同。`sources -v` 中 `*` 是当前最佳来源,`+` 是参与组合的来源,`?` 可能表示不可达、未同步或样本不足,`x` 表示与其他来源不一致。Reach 是八次轮询的八进制移位寄存器;`377` 只说明最近八次收到有效响应,不能单独证明来源正确或业务时间已经收敛。

来源不可用时按 DNS、路径与信任边界排查

  1. 从实际运行同步守护进程的网络命名空间解析配置中的主机名,核对 IPv4/IPv6 路由和主机防火墙;不要用浏览器能打开网页证明 UDP 123 可用。
  2. 读取来源选择理由、最近样本、root distance 和服务日志,区分无响应、样本被拒绝、来源互相矛盾与本机尚未积累足够样本。
  3. 叶节点只应作为客户端,不要为排障无条件开放公网 NTP 服务或控制接口。RFC 8633 建议持续监控同步状态、限制控制消息并避免把不可信模式暴露给公网。
  4. 普通 NTP 报文不提供来源真实性保护。若威胁模型需要认证,使用实现和服务端共同支持的 NTS;Chrony 的 `nts` 选项通过 TLS 完成 NTS-KE,但仍不能消除网络延迟操纵。

按误差与业务风险选择 slew 或维护窗口

条件恢复方式门禁
小偏差且业务可容忍缓慢收敛保持已选可信来源,让守护进程渐进校正观察剩余修正、来源状态和业务错误是否同时下降
大偏差,但应用依赖顺序、租约或时间窗暂停写流量、队列消费者和时间敏感任务,进入维护窗口后按实现文档 step保存旧时间、误差、来源与受影响状态;逐项恢复依赖
来源互相矛盾或疑似攻击先隔离异常来源并保留日志,不强迫系统接受单一新时间至少有符合本组织信任模型的独立来源与人工核对
重启后反复回退修复 RTC/UTC、启动同步门禁或供应商虚拟化问题冷启动后重复来源选择、UTC 与业务验收

Chrony 平时通过加速或减慢时钟完成 slew;`makestep` 会立即跳变,并被上游手册明确标注可能严重影响某些软件。不要复制固定阈值。若必须 step,先根据实际偏差、预计慢调时间和应用语义制定停写与恢复顺序;已经产生的错误令牌、租约、日志和定时任务不会因时钟校准自动修复。

用时间证据和依赖业务共同验收

只运行本机实际实现对应的状态命令;把输出与修复前快照、独立时间来源和业务检查放在同一 UTC 时间窗比较
date --utc --iso-8601=ns
timedatectl show -p Timezone -p LocalRTC -p NTP -p NTPSynchronized

# systemd-timesyncd hosts
timedatectl timesync-status

# chronyd hosts
chronyc tracking
chronyc sources -v
  • 守护进程已选中预期来源,最近样本、剩余修正和误差边界在本业务事先定义的范围内。
  • TLS、OIDC/JWT、数据库、队列、分布式锁、缓存 TTL 和计划任务按实际使用项复测,未再出现尚未生效、过期、重复或错窗。
  • 跨主机日志能按 request ID 和 UTC 顺序关联;错误事件没有通过改时钟被隐藏或重写。
  • 在一个完整轮询与业务周期后仍保持同步;重启敏感场景还应安排可观察的冷启动验收。

回滚配置,不把错误时间当作回滚点

如果更换来源、启用 NTS、调整防火墙或替换同步实现后状态变差,恢复已保存的守护进程配置、服务启用状态和网络规则,再重新验证来源。不要把系统时钟拨回已知错误值。配置回滚和时间校正是两件事;任何再次 step 都要经过同样的业务门禁。

把时钟健康纳入运行基线

持续记录当前实现、选中来源、同步状态、剩余修正、频率偏差和最近成功样本,并对未同步、来源全部丢失和偏差超出业务预算告警。镜像、systemd/chrony、网络、虚拟化平台或时区数据库升级后重新验收;对必须等待准确时间的服务,显式设置启动门禁和超时后的安全失败行为。

本文命令在 2026-08-18 按 systemd、Chrony 与 IETF 当前上游文档完成语义和语法审阅,没有在读者的 VPS、生产数据库、身份系统或队列上执行。发行版可能使用不同服务名、Chrony 版本、NTP 提供方、容器权限和虚拟化时钟源;运行前先确认本机帮助、实际同步实现和业务可容忍的时间误差。

返回知识库