在 WSL 中的 Ubuntu 中执行sudo systemctl poweroff
并重新启动后,我看到:
<3>WSL (814) ERROR: UtilTranslatePathList:2671: Failed to translate C:\Program Files\PowerShell\7
<3>WSL (814) ERROR: UtilTranslatePathList:2671: Failed to translate C:\Windows\System32\OpenSSH\
<3>WSL (814) ERROR: UtilTranslatePathList:2671: Failed to translate C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common
<3>WSL (814) ERROR: UtilTranslatePathList:2671: Failed to translate C:\Program Files\dotnet\
...
Ubuntu 启动了,但没有 Windows 驱动器挂载到 WSL。此外,Ubuntu 一会儿后就退出了。重新启动后,一切似乎都正常。
发生了什么事?我该如何解决?
答案1
简短回答:
- 您仍然不应该在 WSL2 发行版上使用 Linux 关机方法。
wsl --shutdown
为了完全恢复,您最终将需要重新启动。
更多细节:
在提供 Systemd 支持的更新版 WSL 下,你现在可以运行某些“关机”命令,但这并不意味着你应该。 这包括:
sudo systemctl poweroff
sudo systemctl halt
sudo systemctl reboot
- 在桌面管理器(Gnome、Xfce4 和其他)中选择任何相关的关机或重启选项。
在所有这些情况下,Systemd 都会用systemd-shutdown
(有关更多详细信息,请参阅手册页)替换自身,即使在 WSL 报告发行版不再运行(通过wsl.exe -l -v
)后,它仍会继续运行。
我在这里做了一些猜测,但是当 WSL 尝试重新启动 Ubuntu 时,它似乎无法加载自己的,init
因为 PID1 仍然被“占用” systemd-shutdown
(或者可能是因为systemd
没有调用它)。
$ ps -fp 1
UID PID PPID C STIME TTY TIME CMD
root 1 0 1 22:23 ? 00:00:00 /lib/systemd/systemd-shutdown halt --timeout 90000000us --log-level 6 --log-target console
因此,WSL 的大部分“正常”启动过程都不会发生。这包括 Windows 驱动器挂载以及binfmt_misc
允许 WSL 运行 Windows 命令的注册。但显然,将 Windows 路径附加到基础环境中的 Linux 路径的尝试不会发生。
在您在上面命令参数中看到的超时(90 秒)之后,systemd-shutdown
将会终止,并且 WSL 分发也将(再次)终止。
您也可以使用wsl --terminate <distro_name>
PowerShell 终止。
无论哪种情况,新重启的 Ubuntu 都不会显示问题中列出的错误消息。
然而,您仍需要wsl --shutdown
重新启动才能重新获得运行 Windows 命令的能力。的“损坏”binfmt_misc
实际上会延伸到全部WSL2 发行版在您的系统上运行,直到wsl --shutdown
。