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

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

·1857 字·4 分钟· loading · ·
褐瞳さん
作者
褐瞳さん
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,不用重新配置环境等等。

结果

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

相关文章