同步 Linux 双系统的时间

4 min read

装过 Windows × Linux 双系统的同学都会知道,默认情况下 Windows 与 Linux 的时间是不同步的,原因在于 Windows 默认使用中国标准时间 (CST),而类 Unix 系统则更喜欢使用世界协调时间 (UTC),这两者都可以表示中国时区 (东八区) 的时间但并不兼容,相差正好 8 个小时。

以前用 Windows × Ubuntu 的双系统没怎么在意这个问题,因为 Ubuntu 是主力机 Windows 用的少,另外有 NTP 自动对时,也没出过什么问题。但换到 Windows × Manjaro 双系统后,出事了!QAQ Manjaro 默认没有开启 NTP,而 Windows 却对了时,导致今天后本机时间比实际时间快了 8 个小时。然后就发生了 git 提交到了未来这种诡异的情况。

今天说什么也得解决这一问题,而且解决方法并没有想象中这么难。大体上有两种思路:

  1. 让 Windows 使用 UTC (推荐)
  2. 让 Linux 使用 RTC (CST)

让 Windows 使用 UTC

Windows 一般会将 BIOS 时间 (RTC) 设置为地方时。但实际上 Windows 也能处理 UTC,需要修改注册表。

使用 regedit,新建如下 DWORD 值,并将其值设为十六进制的 1。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\RealTimeIsUniversal

也可以用管理员权限启动命令行来完成:

reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f

如果以上操作不起作用,并且你使用的是 Windows 64位系统,将 DWORD 修改为 QWORD

如果 Windows 要求根据夏令时更新时钟,可以允许。时钟仍然是 UTC,仅是显示时间会改变。

设置时间标准后需要重新启动才会生效。

让 Linux 使用 RTC (CST)

另一个思路就是让 Linux 使用 CST,但 Linux 默认并不能直接使用 CST,不过我们可以设置 Linux 使用 BIOS 时间 (RTC),其实就相当于让 Linux 使用 CST,缺点是用不了夏令时了,不过在中国也就无所谓了。

要想让 Linux 使用 RTC,首先要确保时区正确

timedatectl status

如果时区 (Time zone) 不是 Asia/Shanghai,则使用下面的命令切换时区

timedatectl set-timezone Asia/Shanghai

命令会创建一个 /etc/localtime 软链接,指向 /usr/share/zoneinfo/ 中的时区文件,如果手动创建此链接请确保是相对链接而不是绝对链接,参阅 archlinux(7)

然后在命令行中运行

timedatectl set-local-rtc true

然后使用以下命令查看状态

timedatectl status

如果 RTC 与 CST 相同就说明设置成功了。

Manjaro 启动 NTP 自动对时

Manjaro 默认没有启动 NTP 自动对时,你需要手动配置与启动。

首先需要配置一下 /etc/systemd/timesyncd.conf,取消 #NTP= 的注释。然后填上 NTP 服务器的地址。这里推荐两组 NTP 服务器的域名

阿里巴巴 NTP

NTP=time1.aliyun.com time2.aliyun.com time3.aliyun.com time4.aliyun.com time5.aliyun.com time6.aliyun.com time7.aliyun.com

Apple NTP

NTP=time1.apple.com time2.apple.com time3.apple.com time4.apple.com time5.apple.com time6.apple.com time7.apple.com

然后使用以下命令启动 NTP

timedatectl set-ntp true

然后使用以下命令查看 NTP 的状态

timedatectl timesync-status