报错是这么冒出来的。一台装了 CentOS 7 和 Windows 的测试机,每次从 Windows 切回 Linux 时间就差八小时,timedatectl 里 RTC time 与 Universal time 一样,Local time 却是错的。

原因不止一个,得分开看。Linux 默认把 RTC 当 UTC 解释,Windows 当本地时间写,两边互相改。另一种情况是/etc/adjtime 第三行是 LOCAL 而不是 UTC,系统按本地时间理解硬件时钟。

另外,系统时区符号链接与 RTC 模式不匹配,两个方向的换算各错一次。

动手时先确认当前 RTC 模式

timedatectl | grep -i rtc; tail -3 /etc/adjtime

随后改成按 UTC 存硬件时钟

timedatectl set-local-rtc 0

然后把当前时间写回硬件时钟

hwclock --systohc --utc

剩下的就是重启后核对两者

hwclock --show; date

改之前我把相关日志按时间截了一段存着,事后对时间线用得上。

中途换过一次思路,把范围缩到最小的那一层,反而快了。

恢复的判定其实很直接。timedatectl 输出 RTC in local TZ: no,/etc/adjtime 第三行是 UTC,重启后 date 与 hwclock –show 一致且与标准时间差在秒级。

双系统机器的时钟问题只能选一边迁就,让 Windows 改注册表用 UTC 更彻底;改 RTC 模式前先手动对一次时,否则会把错误时间写进硬件。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189