WSL2时钟与Windows不同步。

174

从睡眠/休眠恢复后,WSL2时钟会失去同步。 illustration showing Windows clock and WSL clock out of sync

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


44
2023年了,问题仍然存在... - CodeWarrior
17个回答

2

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


1
我按照指示安装了最新的内核Windows子系统Linux更新-5.10.102.2。但遗憾的是,我发现问题仍然存在,我的wsl2系统在同步后一天仍比主机Windows系统快几秒钟。 - yang

2

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

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

安装ntpdate:

sudo apt install ntpdate


0
请使用管理员权限的 PowerShell 运行以下命令。
# Schedule a task to set the date inside WSL to the date found by PowerShell.
# It uses "RU" to run as SYSTEM user.
schtasks /Create /F /TN wsl-clock-sync /RU SYSTEM /SC ONEVENT /EC System `
    /TR "powershell -command &{wsl -u root date -s `$(date)}" `
    /MO "*[System[Provider[@Name='Microsoft-Windows-Kernel-Power'] and (EventID=107 or EventID=507) or Provider[@Name='Microsoft-Windows-Kernel-General'] and (EventID=1)]]"
Pause

命令将作为定时任务运行
wsl -u root date -s $(date)

更新:看起来好像不起作用...

0

对我来说,这个问题似乎发生在系统进入睡眠模式时。所以我注册了一个bash命令,每当它失去同步时调用。我是通过添加一个function.sh文件并在~/.bashrc中引用它来实现的。

function.sh:

YELLOW='\033[0;33m'
NC='\033[0m'

TIME_SERVER=ntp.ubuntu.com

# Sync wsl time
sync_date () {
    echo -e "${RED}sudo ntpdate $TIME_SERVER ${NC}"
    echo
    sudo ntpdate $TIME_SERVER
}

~/.bashrc:

source ~/Linux/funtions.sh

请注意,我添加了一些颜色和自定义内容(TIME_SERVER:[Windows 时间服务器是另一个选项])。

您可以使用 cli 中的 sync_date 命令同步时间。


0

0
在Arch Linux上,"sudo hwclock -s"对我来说已经无法工作了(有人知道为什么吗?)
修复方法"sudo ntpdate time.windows.com"对我有效。

0
如果你想通过在你的~/.bashrc~/.profile文件末尾添加一些内容的方式来实现,但又觉得每次都要输入su密码很烦人,你可以创建一个定时提示,只在你需要时运行更新。在这里,我通过在Haribk's function周围放置一个包装器来实现了这一点。
YELLOW='\033[0;33m'
NC='\033[0m'
TIME_SERVER=ntp.ubuntu.com

# Sync wsl time
sync_date () {
    # Uncomment one of the options below.
    cmd="ntpdate $TIME_SERVER"
    #cmd=hwclock -sv
    echo -e "${YELLOW}sudo ${cmd}${NC}"
    echo
    sudo $cmd
}

date
t=10
resp=
while [[ $t != 0 ]]
do
  t=$(( $t - 1 ))
  read -t1 -ep"($t) Sync clock with host? [yN] " -n1 resp
  if [[ $? == 0  && $resp == '' || ${resp,,} == 'n' ]]
  then
    break
  fi
  if [[ ${resp,,} == 'y' ]]
  then
    sync_date
    break
  fi
done
if [[ $resp == '' ]]; then echo; fi

这提供了一个倒数计时为9的“是/否”提示,并且如果在该时间内没有输入或按下Enter键,则默认选择“否”。

这种方法可能有效,但并不是正确的做法。最好使用系统服务;可以通过一些调整来使用systemd-timesyncd。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接