如何不关机重启WSL2恢复虚拟服务

对于Windows系统WSL技术较熟悉的小伙伴对于WSL和WSL2两个版本间的架构差异应该都比较了解,有不少人可能都会吐槽WSL2其实是一种倒退,只不过今天我们不讨论这点,而是来分享下在使用WSL2服务遇到的问题,及亲测有效的解决方案。

之前的分享中有提到过借助WSL2+Podman两者组合方案实现容器化环境搭建,后来在使用过程中却也是遇到了些问题。起初以为是Podman的技术原因还不成熟的原因,直到后来才发现是WSL2服务本身存在问题,进而导致容器环境无法正常使用。

问题现象

平日里一般都会使用休眠来代替关机,之前未使用虚拟服务时也没有察觉出有何异常。只是有次开启了Podman里的容器,想在休眠恢复后再重新连接虚拟服务的容器服务系统,便遇到了无法访问的情况:终端命令一直卡住不动,没有任何报错和响应输出。

解决方案

开始是只能无奈的关机重启再启动WSL2和Podman服务,只是这样会比较麻烦,得要重新启用需要使用的软件与文档。后来网上调研了些相关的处理办法,梳理出如下可用的方案(只需要4个步骤就可以恢复Podman的服务):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 1.停止虚拟服务
net stop vmms

# 2.停止Liux子系统管理
net stop LxssManger

# 3.停止WSL2虚拟服务
taskkill /f /im wslservice.exe

# 4.启动Podman服务
podman machine start podman-vm

# 5.进入WSL系统
podman machine ssh podman-vm

命令执行过程中的日志输出参考如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
C:\Users\用户名>net stop vmms
The Hyper-V 虚拟机管理 service is stopping.
The Hyper-V 虚拟机管理 service was stopped successfully.

C:\Users\用户名>net stop LxssManager
The LxssManager service is stopping.
The LxssManager service was stopped successfully.


C:\Users\用户名>taskkill /f /im wslservice.exe
SUCCESS: The process "wslservice.exe" with PID 48264 has been terminated.

C:\Users\用户名>wsl -l
适用于 Linux 的 Windows 子系统分发:
podman-vm (默认)

C:\Users\用户名>podman machine start podman-vm
Starting machine "podman-vm"
API forwarding for Docker API clients is not available due to the following startup failures.
        could not start api proxy since expected pipe is not available: podman-vm

Podman clients are still able to connect.
Machine "podman-vm" started successfully

C:\Users\用户名>podman machine ssh podman-vm
Connecting to vm podman-vm. To close connection, use `~.` or `exit`
Last login: Mon May 20 18:15:03 2024 from ::1
[user@用户名 ~]$ uname -a
Linux 用户名 5.15.146.1-microsoft-standard-WSL2 #1 SMP Thu Jan 11 04:09:03 UTC 2024 x86_64 GNU/Linux

如此看来在WSL2中使用Linux系统也是路途多坎坷呀,建议还是要注意在准备系统休眠前,把正在进行的Linux相关操作保存好,避免后面系统休眠后无法进入WSL系统而导致数据。也可以将如上的解决方案做成批处理脚本,便于在休眠重启后一键快速恢复。

2024-08-08 更新:可以尝试直接使用命令podman manchine stop podman-vm停止虚拟服务,然后使用podman machine start podman-vm 启动虚拟服务,这样便省去上述那些复杂的操作步骤。

引用参考:

  1. 如何在死掉后彻底重启wsl2
  2. wsl卡住解决办法