起因#
昨天重置了电脑的网络,然后今天启动 WSL 就连不上网络了,上网上找了一堆教程,结果后面直接无法启动 WSL 了。所以有了这一篇博客。
无法启动的表现#
尝试启动 WSL 时会直接卡着,如果是通过 Windows Terminal 启动就会一直是空白的;如果直接启动 Ubuntu22.04.5 LTS 也会一直是一个黑框。
如果想尝试使用 wsl 指令,例如wsl --shutdown、wsl -v、wsl --status等等指令也都会直接卡住。
修复过程#
大致过程其实就是先备份虚拟磁盘,然后重装 WSL,同时将虚拟磁盘放回去。非常的简单,对吧。
备份虚拟磁盘#
我们需要备份一下磁盘,防止后面重装 WSL 后数据丢失。
你可以先尝试使用使用 WSL 自带的磁盘导出指令:
# 先查询发行版的名称
wsl -l -v
# 再导出磁盘到你想要的路径
# 例如:wsl --export Ubuntu-22.04 E:\wsl-ubuntu22.04.tar
wsl --export <虚拟机名称> <保存路径>\<导出文件名>.tar
如果你和我一样这些都没法使用,那么你需要知道你的 WSL 的虚拟磁盘(ext4.vhdx)的位置,如果你没有移动过默认的位置就在%USERPROFILE%/AppData/Local/Packages/CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc/LocalState下。(复制到资源管理器地址栏回车可以直接打开)
如果你之前修改或者迁移过磁盘位置请在自己修改的位置下寻找,例如我存放在E:\WSL\Ubuntu-22.04\下。

将这个虚拟磁盘复制或者移动出来,存放在你想要的位置。
重装 WSL#
首先尝试完全卸载 WSL:
前往设置( +I)的应用->应用和功能中,找到你的发行版对应的 App,然后点击「卸载」。如果你有安装过 WSL 升级包「Windows Subsystem for Linux Update」也请一起卸载。

在控制面板->程序->程序和功能找到「启用或者关闭 Windows 功能」,找到「适用于 Linux 的 Windows 子系统」,取消勾选。接下来会提示你重启电脑,重启即可。

接下来我们在重启过后重新安装 WSL 即可(其实就是将卸载的步骤倒过来进行一次):
在重新安装前先放一张流程图:
graph TD
R1[重新启用 wsl 功能]
R2[安装需要的发行版]
S[wsl --shutdown]
I[导入磁盘]
J1{何种方式卸载}
E[wsl --import 导入]
J2{想要安装在什么地方}
D1[复制 ext4.vhdx 到默认路径]
D2[wsl --export]
D3[wsl --import]
D4[覆盖 ext4.vhdx]
A[设置默认账户]
R1 --> R2 --> S
S --> I
I --> J1
J1 -->|通过 wsl --export 重装| E
J1 -->|通过直接复制 ext4.vhdx| J2
J2 -->|安装到默认位置| D1
J2 -->|安装到其他位置| D2
D2 --> D3 --> D4
E --> A
D1 --> A
D4 --> A
在控制面板->程序->程序和功能找到「启用或者关闭 Windows 功能」,找到「适用于 Linux 的 Windows 子系统」,勾选。重启电脑。
前往 Microsoft Store 安装你想要的 WSL 发行版。此时先不急着启动 WSL(「Windows Subsystem for Linux Update」似乎不需要再安装,因为我在
wsl --version中发现没有安装我的 WSL 也是 WSL2)。
安装虚拟磁盘:
首先确认 WSL 关闭:
wsl --shutdown导入磁盘:
如果你是通过
wsl --export重装WSL:导入磁盘备份:
wsl --import <发行版名称> <目标文件夹> <备份磁盘路径>\<备份磁盘文件名>.tar,例如:wsl --import Ubuntu-22.04 E:\WSL\Ubuntu-22.04 E:\wsl-ubuntu22.04.tar.(如果你还是想安装在默认位置自己指定目标位置为默认的位置,在备份虚拟磁盘小节有提到);如果是直接复制虚拟磁盘(
ext4.vhdx)出来的话:先启动一次 WSL,再
wsl --shutdown想放在默认位置的话先启动 WSL,在wsl --shutdown后直接将你复制备份的ext4.vhdx覆盖到默认位置就不用下面的导出再导入的操作了(默认磁盘位置备份虚拟磁盘小节有提到),直接跳到下一步;如果想指定安装位置就先启动一次 WSL 将新生成的磁盘在导出到你想要的 WSL 磁盘位置# 先查询发行版的名称 wsl -l -v # 再导出磁盘到你想要的路径 # 例如:wsl --export Ubuntu-22.04 E:\wsl-ubuntu22.04.tar wsl --export <虚拟机名称> <保存路径>\<导出文件名>.tar # 导入到新位置 # 例如:wsl --import Ubuntu-22.04 E:\WSL\Ubuntu-22.04 E:\wsl-ubuntu22.04.tar wsl --import <发行版名称> <目标文件夹> <备份磁盘路径>\<备份磁盘文件名>.tar然后直接将你自己复制在外面的
ext4.vhdx覆盖到你的<目标文件夹>下。
启动后你会发现使用的是默认的用户是 root,可以通过
<发行版exe名> config --default-user <用户名>指定默认登录用户,例如:ubuntu2204 config --default-user he_tong
结语#
以上就是主要步骤了,重新启动 WSL 就会发现还是我们自己的 WSL,不用重新配置环境等等。

本文作者: 褐瞳さん
本文链接: https://www.hetong-re4per.com/posts/fixing-wsl-startup-issues/
版权声明: 本文文字在未特别注明下默认使用 CC BY-NC-SA 4.0 许可协议。




