WSL2 时钟与 Windows 不同步

WSL2 Clock is out of sync with Windows

WSL2 时钟在从 sleep/hibernate 恢复后不同步。

GitHub sudo hwclock -s 上共享了一个解决方法以在 WSL 中重新同步时钟,但每次从 sleep/hibernate 恢复时都必须这样做。

更新:, the Clock Sync fix was released in WSL2 kernel version 5.10.16.3

所述

已过时

在撰写本文时,此 GitHub Issue 已针对错误开放。

我针对我的情况(WSL2 中的单一发行版)选择的解决方法是在 Windows 重新同步硬件时钟。

Windows: Open PowerShell as Administrator

schtasks /create /tn WSLClockSync /tr "wsl.exe sudo hwclock -s" /sc onevent /ec system /mo "*[System[Provider[@Name='Microsoft-Windows-Kernel-General'] and (EventID=1)]]"
Set-ScheduledTask WSLClockSync -Settings (New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries)

WSL2: Run sudo visudo and add hwclock to sudoers to skip password prompt

# bottom of my file looks like this
...
...
#includedir /etc/sudoers.d
<username> ALL=(ALL) NOPASSWD:/usr/sbin/hwclock, /usr/bin/apt update, /usr/bin/apt upgrade

Results

See image for how to get Event XPath from Windows Event filtering. Use as provided to let task scheduler auto-display scheduled triggers.

只要重启wsl,对我来说没问题

wsl --shutdown

然后

wsl

在 PowerShell 中

如果有人通过搜索找到了这个并且没有注意到问题中实际上列出了解决方案,您可以通过修复 WSL 时钟漂移。

sudo hwclock -s

如果您只是偶尔需要这样做,这是一个很好的解决方案。如果您需要更频繁地执行此操作,请考虑@piouson 的解决方案

sudo hwclock -s 让你有点像那里,但由于某种原因没有得到准确的时间 - 我经常发现它是未来一分钟左右!

sudo ntpdate pool.ntp.org 应该会给你正确的时间。

但这都是因为 bug in the Linux kernel 应该在某个时候包含在 Windows 更新中...

根据我的经验,the GitHub issue 中提到了很多可以解决这个问题的技巧,但并非总是如此...

更新:现已修复!在 Windows Insiders 版本中,至少:https://devblogs.microsoft.com/commandline/servicing-the-windows-subsystem-for-linux-wsl-2-linux-kernel/

您可以按照此评论中的方法手动将WSL2内核更新到5.10.16:#5650 (comment)。我已经用这个方法解决了这个问题。

我已将此添加到 Windows 任务计划程序,设置为每 12 小时 运行:

wsl.exe -d ubuntu -u root -- ntpdate time.windows.com

要安装 ntpdate:

sudo apt install ntpdate

GitHub Issue 已关闭

您也可以 运行 在 Powershell 终端中使用以下命令进行同步。

wsl.exe sudo hwclock -s

使用 cron 安排时间 sudo hwclock -s

正如其他人之前所说 sudo hwclock -s 同步时钟,
但是您需要在每 sleep/hibernate 之后执行此操作。 解决方案是每小时添加一个 cron 任务来同步时钟。

使用 sudo 打开 crontab(必须使用 sudo 打开,因为命令使用 sudo):

sudo crontab -e 

并在任务后用新行添加此代码(这是 cron 要求):

PATH=/sbin:/bin:/usr/bin
@hourly hwclock -s

您必须设置 PATH,因为 root-cron 没有它,或者使用绝对路径,例如/usr/sbin/hwclock.

cron 故障排除:

  • 要验证 cron 是否正常工作,您可以添加一个虚拟任务(不要忘记添加新行):
    * * * * * date > /tmp/log.txt
  • 如果没有创建文件,请验证 cron 是否正常工作:pgrep cron
    如果没有 PID 显示,启动 cron:sudo service cron start.
  • 学习cron定时方法:cron timing generator

解决此问题:截至 2022 年 5 月,此问题在一定程度上仍然存在。

有两个组件。

首先,Windows 时间同步需要从头开始。它不是开箱即用的,在不是 domain-joined.

的机器上
  • 将 w32time 更改为自动启动。在 Administrator cmd 中,但不是 PowerShell,sc triggerinfo w32time start/networkon stop/networkoff。用 sc qtriggerinfo w32time 验证。要以这种方式进入 cmd,您可以启动 Admin PowerShell,然后只需键入 cmd。

  • 在注册表中进行一些更改。

    • Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\Config中,将MaxPollInterval设为十六进制c、十进制12
    • 勾选Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\Parameters\NtpServer。如果它以 0x9 结尾,你就完成了。如果它以 0x1 结尾,则需要将 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\TimeProviders\NtpClient 中的 SpecialPollInterval 调整为 3600
  • 重新启动,然后从 Powershell 运行 w32tm /query /status /verbose 验证 w32time 服务是否启动。如果没有,请再次检查触发器。如果一切都失败了,将其设置为自动延迟启动

其次,WSL2 需要真正保持同步。 MS 可能会发布另一个内核修复程序。同时,计划任务可以定期将其恢复同步: schtasks /Create /TN WSL2TimeSync /TR "wsl -u root hwclock -s" /SC ONEVENT /EC System /MO "*[System[Provider[@Name='Microsoft-Windows-Kernel-Power'] and (EventID=107 or EventID=507) or Provider[@Name='Microsoft-Windows-Kernel-General'] and (EventID=1)]]" /F