WSL2 时钟与 Windows 不同步

pio*_*son 17 clock windows-task-scheduler windows-subsystem-for-linux wsl-2

从睡眠/休眠状态恢复后,WSL2 时钟不同步。 显示 Windows 时钟和 WSL 时钟不同步的插图

GitHub 上 共享了一个解决方法sudo hwclock -s来重新同步 WSL 中的时钟,但是每次从睡眠/休眠状态恢复时都必须执行此操作。

drk*_*gel 74

更新

修复现已包含在 WSL2 Linux 内核5.10.16.3及更新版本中!请注意,您可能需要从 Windows 应用商店安装 WSL2,才能通过 Microsoft 的 Craig获取最新的内核版本。

较旧的答案

sudo hwclock -s可以让您到达那里,但由于某种原因无法获得确切的时间 - 我经常发现这是未来一分钟左右!

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

但这都是因为Linux 内核中的一个错误,该错误应该在某个时候包含在 Windows 更新中......

GitHub 问题中引用了许多技巧,可以解决这个问题,根据我的经验,大多数但并非总是如此......

  • 我使用的是内核 5.15.79.1-microsoft-standard-WSL2,当我暂停笔记本电脑时它仍然受到影响。 (28认同)
  • 内核更新肯定没有解决这个问题,我在最新的 WSL 内部版本上仍然遇到这个问题 (17认同)
  • 同样,我在“5.15.79.1-microsoft-standard-WSL2”上,但仍然遇到这个问题。`wsl --status` 显示`默认发行版:Ubuntu-22.04` `默认版本:2` (11认同)
  • 我调试了脚本两天,才意识到这是一个时钟问题。hwclock -s 对我不起作用。ntpdate 做到了。谢谢你!!!!! (5认同)
  • 我安装了 5.10.102.1-microsoft-standard-WSL2,每次都必须这样做。我错过了什么吗? (2认同)
  • “但这都是因为 Linux 内核中的一个错误,该错误应该在某个时候包含在 Windows 更新中......” - 3 年后 (2认同)

Don*_*rez 14

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

sudo hwclock -s
Run Code Online (Sandbox Code Playgroud)

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

  • 仍然(或再次)看到内核 5.15.79.1-microsoft-standard-WSL2 的偏差(WSL 日期在未来)。 (6认同)
  • 我仍然遇到这个问题,但“hwclock”没有帮助。`sudo ntpdate ntp.ubuntu.com` 对我有用。 (5认同)
  • 有时硬件时钟也会显示错误的时间,因此这没有帮助,您需要使用 ntpdate 之类的东西。问题在某个时刻得到了解决,但又再次出现。WSL GitHub 中有一个问题:https://github.com/microsoft/WSL/issues/10006 (3认同)

pio*_*son 13

更新:正如drkvogel所提到的,时钟同步修复是在WSL2 内核版本 5.10.16.3 中发布的


过时的

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

我为我的情况选择的解决方法(WSL2 中的单一发行版)是使用 Windows 任务计划程序hwclockWSLWindows 重新同步硬件时钟时运行。

Windows:以管理员身份打开 PowerShell

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)
Run Code Online (Sandbox Code Playgroud)

WSL2:运行sudo visudo并添加hwclock到 sudoers 以跳过密码提示

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)
Run Code Online (Sandbox Code Playgroud)

结果

显示 Windows 时钟和 WSL 时钟同步的插图

有关如何从 Windows 事件过滤中获取事件 XPath,请参见图像。使用所提供的方式让任务计划程序自动显示计划的触发器。

显示已创建计划任务的插图

  • 如果您运行的是 WSL 常见的 ubuntu,则此方法将会失败,因为 hwclock 列出的路径不正确。在 ubuntu 上,正确的路径是 `/sbin/hwclock` (2认同)

小智 13

这在 Ubuntu 22.04.2 LTS 上对我有用。

安装ntpdate

sudo apt install ntpdate
Run Code Online (Sandbox Code Playgroud)

将此行添加到 ~/.profile

sudo ntpdate time.windows.com
Run Code Online (Sandbox Code Playgroud)

现在,每次您打开新会话时,日期和时间都会同步。另外,如果您想同步现有会话,请运行以下命令:

sudo ntpdate time.windows.com
Run Code Online (Sandbox Code Playgroud)


小智 9

使用cron来安排sudo hwclock -s

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

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

sudo crontab -e 
Run Code Online (Sandbox Code Playgroud)

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

PATH=/sbin:/bin:/usr/bin
@hourly hwclock -s
Run Code Online (Sandbox Code Playgroud)

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

cron 故障排除:

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


小智 8

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

有两个组成部分。

首先,Windows 时间同步首先需要良好。它不是开箱即用的,适用于未加入域的计算机。

  • 将 w32time 更改为自动启动。在管理员 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你需要SpecialPollInterval适应Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\TimeProviders\NtpClient阅读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


小智 7

GitHub 问题已关闭

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

wsl.exe sudo hwclock -s
Run Code Online (Sandbox Code Playgroud)


fah*_*dul 6

只需重新启动 wsl,它对我来说很好用

wsl --shutdown
Run Code Online (Sandbox Code Playgroud)

然后

wsl
Run Code Online (Sandbox Code Playgroud)

在 PowerShell 中

  • 但每次问题再次出现时您都必须重新启动..? (4认同)
  • 我试图将我的 WSL 和 Windows 日期更改为将来的某个日期以进行一些测试,这对我有用。人们错误的回答是“sudo hwclock -s”将同步到 Windows,但这是错误的。它实际上将日期同步到您的硬件时钟。重新启动 WSL(这就是这个答案所建议的)会同步到 Windows,因此您可以轻松地将 Windows 和 WSL 更改为某个虚假日期。谢谢 :) (3认同)
  • 我的解决方案通过使用 Windows 任务计划程序自动重新运行,消除了每次重新启动的需要。 (2认同)
  • 我为那些懒得做你的解决方案的人提供选择。由他们来选择哪一个 (2认同)
  • 如果您实际上没有在 WSL 中执行任何操作,这是最简单有效的解决方案。谢谢! (2认同)
  • 对于 Windows 用户来说,这是最惯用的解决方案:将其关闭然后再次打开。 (2认同)

bfu*_*zze 5

我大约 6-9 个月前开始遇到这个问题。重新启动 wsl 总是有效,但由于显而易见的原因,这并不理想。 hwclock -s定期运行 cron 作业可以工作几个月,但现在不行了。@igor-alex 的方法对我有用,但它需要一些不同的步骤:

/etc/wsl.conf(同上)

[boot]
systemd=true
Run Code Online (Sandbox Code Playgroud)

安装systemd-timesync(同上)

sudo apt install systemd-timesyncd
Run Code Online (Sandbox Code Playgroud)

对 timesyncd 的建议编辑对我不起作用,导致无法启动服务。相反,我做了以下事情:

sudo systemctl edit systemd-timesyncd.service
Run Code Online (Sandbox Code Playgroud)
[Unit]
ConditionVirtualization=
ConditionVirtualization=wsl
Run Code Online (Sandbox Code Playgroud)

https://unix.stackexchange.com/a/737366/547670提供

并启动它(与上面相同)

sudo systemctl start systemd-timesyncd
Run Code Online (Sandbox Code Playgroud)

华泰