跳过正文

记录一下修复 WSL 无法启动的过程

·1857 字·4 分钟· loading... · ·
技术教程 WSL
褐瞳さん
作者
褐瞳さん
Everyone is mania in general
目录

起因
#

昨天重置了电脑的网络,然后今天启动 WSL 就连不上网络了,上网上找了一堆教程,结果后面直接无法启动 WSL 了。所以有了这一篇博客。

无法启动的表现
#

尝试启动 WSL 时会直接卡着,如果是通过 Windows Terminal 启动就会一直是空白的;如果直接启动 Ubuntu22.04.5 LTS 也会一直是一个黑框。

如果想尝试使用 wsl 指令,例如wsl --shutdownwsl -vwsl --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\下。

ext4.vhdx位置

将这个虚拟磁盘复制或者移动出来,存放在你想要的位置。

重装 WSL
#

首先尝试完全卸载 WSL:

  1. 前往设置( +I)的应用->应用和功能中,找到你的发行版对应的 App,然后点击「卸载」。如果你有安装过 WSL 升级包「Windows Subsystem for Linux Update」也请一起卸载。

    卸载发行版

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

    关闭 WSL

接下来我们在重启过后重新安装 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
  1. 在控制面板->程序->程序和功能找到「启用或者关闭 Windows 功能」,找到「适用于 Linux 的 Windows 子系统」,勾选。重启电脑。

  2. 前往 Microsoft Store 安装你想要的 WSL 发行版。此时先不急着启动 WSL(「Windows Subsystem for Linux Update」似乎不需要再安装,因为我在wsl --version中发现没有安装我的 WSL 也是 WSL2)。

    WSL 版本

  3. 安装虚拟磁盘:

    1. 首先确认 WSL 关闭:wsl --shutdown

    2. 导入磁盘:

      • 如果你是通过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覆盖到你的<目标文件夹>下。

    3. 启动后你会发现使用的是默认的用户是 root,可以通过<发行版exe名> config --default-user <用户名>指定默认登录用户,例如:ubuntu2204 config --default-user he_tong

结语
#

以上就是主要步骤了,重新启动 WSL 就会发现还是我们自己的 WSL,不用重新配置环境等等。

结果

相关文章

使用 WePE 重装 Windows 系统
·1902 字·4 分钟
技术教程 Windwos 系统重装 WePE
在你的 Linux 服务器上安装 SteamCMD 并搭建游戏服务器
·1127 字·3 分钟
技术教程 SteamCMD 游戏 服务器
校园网防止多设备检测指北
·2551 字·6 分钟
技术教程 校园网 OpenWrt 多设备检测