双系统趣事

用双系统 Windows 和 Ubuntu 的同学其实遇到过一个很有意思的问题，双系统时间不同步，从 Linux 切换回 Windows 后恰好慢了 8 个小时

其实这是因为 Windows 和 Linux 对硬件时钟（RTC）时间的解读方式不同。
我们的主板上会有一颗时钟芯片，存储着物理世界的时间，但
Windows 认为硬件时钟里存储的时间应该是本地时间（比如，你的时区是东八区，硬件时钟就应该是北京时间）。
Linux/Ubuntu 认为硬件时钟里存储的时间应该是 UTC（协调世界时）时间。

假设你的时区是 东八区（UTC+8，北京时间）。真实世界的时间是 北京时间（本地时间）下午 4 点（16:00），对应的 UTC 时间就是 上午 8 点（08:00）。

第一步：在 Windows 中

1. 正在使用 Windows，系统时间正确显示为 16:00（下午 4 点）。

2.Windows 认为硬件时钟应该存储本地时间。所以，它会把 16:00 这个时间写入硬件时钟。

第二步：重启，进入 Ubuntu

1. 启动电脑，进入 Ubuntu。

2.Ubuntu 去读取硬件时钟，它默认认为硬件时钟上存储的是 UTC 时间。于是它读到了 16:00。

3.Ubuntu 心想：“哦，硬件时钟上说 UTC 时间是 16:00。而我所在的时区是 UTC+8，那么本地时间应该是 UTC 时间加上 8 小时。”

4. 计算：16:00（它以为的 UTC） + 8 小时 = 第二天凌晨 00:00。

5.Ubuntu 自动通过互联网进行网络时间校准（NTP）。当系统启动联网后，它发现：“咦？我根据硬件时钟算出来的本地时间（00:00）和网络标准时间（16:00）对不上，差了 8 小时。”

于是，Ubuntu 做了一件聪明事：

它自动把系统时间纠正为了正确的网络时间（16:00）。

同时，为了保持未来的一致性，它用这个纠正后的 UTC 去更新硬件时钟。

此时，硬件时钟里的数字被 Ubuntu 从 16:00 改为了 08:00。

第三步：重启，切回 Windows（时间错误）

再次重启电脑，回到 Windows。

Windows 去读取硬件时钟，它依然认为硬件时钟上存储的是本地时间。于是它读到了 08:00。

当 Windows 无法在启动时自动联网校准时，则需要手动校准，因此直接把这个时间显示为本地时间上午 8 点。

此文由 Mix Space 同步更新至 xLog
原始链接为 https://fmcf.cc/notes/18