起因#
昨天重置了电脑的网络,然后今天启动 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 即可(其实就是将卸载的步骤倒过来进行一次):
在重新安装前先放一张流程图:
在控制面板->程序->程序和功能找到「启用或者关闭 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,不用重新配置环境等等。