起因#
昨天重置了电脑的网络,然后今天启动 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,不用重新配置环境等等。