pio*_*son 17 clock windows-task-scheduler windows-subsystem-for-linux wsl-2
在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 问题中引用了许多技巧,可以解决这个问题,根据我的经验,大多数但并非总是如此......
Don*_*rez 14
如果有人通过搜索找到了这一点,并且没有注意到问题中实际上列出了一个解决方案,您可以通过修复 WSL 时钟漂移。
sudo hwclock -s
Run Code Online (Sandbox Code Playgroud)
如果您只是偶尔需要这样做,这是一个很好的解决方案。如果您需要更频繁地执行此操作,请考虑@piouson 的解决方案
pio*_*son 13
更新:正如drkvogel所提到的,时钟同步修复是在WSL2 内核版本 5.10.16.3 中发布的
过时的
在撰写本文时,此GitHub 问题已针对该错误开放。
我为我的情况选择的解决方法(WSL2 中的单一发行版)是使用 Windows 任务计划程序hwclock在WSLWindows 重新同步硬件时钟时运行。
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 事件过滤中获取事件 XPath,请参见图像。使用所提供的方式让任务计划程序自动显示计划的触发器。
小智 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
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。
* * * * * date > /tmp/log.txtpgrep cron。sudo service cron start。小智 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)
只需重新启动 wsl,它对我来说很好用
wsl --shutdown
Run Code Online (Sandbox Code Playgroud)
然后
wsl
Run Code Online (Sandbox Code Playgroud)
在 PowerShell 中
我大约 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)
华泰
| 归档时间: |
|
| 查看次数: |
6179 次 |
| 最近记录: |