> 技术文档 > 记一次WSL Ubuntu无法启动的补救方法_wsl突然启动不了

记一次WSL Ubuntu无法启动的补救方法_wsl突然启动不了


问题描述

从前几天开始,只要用WSL(从VSCode),整个电脑就卡卡的。昨天直接整个启动不了了(VSCode用本地Windows和连服务器都没事)。直接点开Ubuntu终端也是黑屏。咋整!赶紧求教GPT。

问题排查

以「管理员身份」打开 PowerShell,运行:

 wsl --list --verbose

输出STATE为“Stopped”。说明wsl没有被启动。

再运行:

wsl -d Ubuntu

直接卡死在启动过程中,接下来判定是整个 distro 无法运行,还是只是 shell 启动阶段出了问题。

运行:

wsl -d Ubuntu --exec echo hello

依旧卡住。根据ChatGPT,连最简单的 --exec echo 都挂住,说明问题出在 WSL 服务本身或底层虚拟化。接下来检查WSL服务状态,运行:

Get-Service LxssManager

报错。根据安装完wsl没有找到LxssManager这个服务 - Microsoft Q&A,再运行:

Get-Service WslService

显示Status为“Running”,说明 WSL 服务本身没问题。

检查WSL 配置和内核版本,运行:

wsl --status

操,还是卡住。

接下来把 WSL 的 Windows 功能彻底重置一下:

1. 以管理员身份打开 PowerShell,先关闭相关 Windows 可选功能:

dism.exe /online /disable-feature /featurename:Microsoft-Windows-Subsystem-Linux /norestartdism.exe /online /disable-feature /featurename:VirtualMachinePlatform /norestartdism.exe /online /disable-feature /featurename:HypervisorPlatform /norestart

2. 重启 Windows。重启后再次以管理员打开 PowerShell,修复系统映像,运行:

DISM /Online /Cleanup-Image /RestoreHealthsfc /scannow

这个时间稍久,然后再重启。

3. 再次以管理员 PowerShell 重新启用WSL相关功能:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartdism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestartdism.exe /online /enable-feature /featurename:HypervisorPlatform /all /norestart

4. 再次重启。

OK现在再试一遍:

wsl --list --verbosewsl --statuswsl -d Ubuntu --exec echo test

前两步都有输出,最后一步还是卡住!

。。。思路打开,测试另外一个发行版:

wsl --list --onlinewsl --install -d Debianwsl -d Debian --exec echo ok

输出正常!说明 WSL2 核心和虚拟化平台没问题,唯一出问题的是我的 Ubuntu 实例本身已经损坏。接下来需要备份虚拟磁盘文件,以便后续重装或者其他用途。

运行

wsl --export Ubuntu D:\\WSL-backups\\ubuntu-backup.tar

中途卡住,这也不能用。直接在系统中找到ext4.vhdx文件(一般在C:\\Users\\...\\AppData\\Local\\Packages\\…\\LocalState\\ext4.vhdx)复制粘贴,也失败。

根据ChatGPT,既然 Debian 下能正常挂载和执行,那就说明 WSL2 平台没问题,只是我的 Ubuntu 的 VHDX 文件里,现在连导出都卡死了——通常是因为 distro 本身有某些元数据或元件损坏,导致 wsl --exportwsl --set-version 整个流程都挂在底层 IO 上。

问题解决

接下来,借助 WSL 自身的 “挂载虚拟磁盘” 功能,把那块 ext4.vhdx 当作一个普通磁盘在 Debian 里挂载,然后从里面把文件打包(或拷出来)。输入

wsl --shutdownwsl --mount \"C:\\Users\\…\\AppData\\Local\\Packages\\…\\LocalState\\ext4.vhdx\" --type ext4

还是报错:无法将磁盘“C:\\Users\\...\\AppData\\Local\\Packages\\...\\LocalState\\ext4.vhdx”附加到 WSL2: The parameter is incorrect. 错误代码: Wsl/Service/AttachDisk/MountDisk/E_INVALIDARG

看样子 WSL 自带的 wsl --mount 对这块 VHDX 还是挂载失败。尝试另一种方法——在 Debian 里用 qemu-nbd (网络块设备)来映射这个 VHDX,再手动挂载 ext4 分区,然后把文件 rsync/打包出来。

wsl --shutdownwsl -d Debian

然后 

sudo apt updatesudo apt install -y qemu-utils# 把 Windows 的 VHDX 路径挂到 Debian 的 /dev/nbd0# 1. 加载 nbd 模块sudo modprobe nbd max_part=8# 2. 只读方式将 ext4.vhdx 映射到 /dev/nbd0sudo qemu-nbd -r -c /dev/nbd0 /mnt/c/Users/.../AppData/Local/Packages/.../LocalState/ext4.vhdxlsblk# 挂载 ext4 文件系统sudo mkdir -p /mnt/oldubuntu# 在只读模式下挂载带有 ext4 日志的文件系统时,内核会拒绝加载未清理的日志。加上 noload 选项来跳过日志回放,从而强制挂载。sudo mount -t ext4 -o ro,noload /dev/nbd0 /mnt/oldubuntu

没有输出,说明挂载成功了。接下来打包文件

sudo tar czpf /mnt/e/WSL-backups/ubuntu-backup.tar.gz \\ -C /mnt/oldubuntu .

打包中有一些错误都是因为只读挂载的 ext4 日志未清理、某些缓存文件或损坏文件导致 tar 无法正常读取。一般来说,这些报错都在系统缓存、snap 缓存、.cache、Anaconda 包等可重新生成或非关键目录,不会影响最关心的 /home 里用户数据。

然后卸载并断开网络块设备

sudo umount /mnt/oldubuntusudo qemu-nbd -d /dev/nbd0

最后退出Debian。

然后就可以在相应位置看到压缩包了,包中有之前Ubuntu系统中的文件,包括/home里的数据。

有了备份就可以后续重装系统和重新导入文件了。

后续

导入备份包

wsl --import Ubuntu C:\\WSL\\Ubuntu E:\\WSL-backups\\ubuntu-backup.tar.gz --version 2

结果各种失败。根据GPT描述:在之前我们用 rsynctar --ignore-failed-read 复制/打包时,一些底层损坏或挂载只读造成“读错”,导致基础的系统二进制被漏掉了。例如,tar 提示了大量 “Read error” 和 “File shrank by … padding with zeros”,说明在 /usr/bin/, /bin/ 等目录下的可执行文件没能完整读取出来。结果就是:导入的新实例里不再有 /bin/bash/bin/ls/usr/bin/apt 这些核心工具,它根本不是一个“完整”的 Ubuntu 了。

因此,既然基础系统文件缺失,最稳妥的做法是:首先,新安装一个干净的 Ubuntu(WSL 官方版);然后,把原来真正关心的用户目录(比如 /home/username)里的配置和文件复制过来。

安装发行版:

wsl --install -d Ubuntu-22.04

新创建一个目录,把备份包里的/home/内容解压到目录

mkdir C:\\WSL-backups\\backup-root

 在 WSL 里执行 tar 解压,因为可以带 --ignore-failed-read 忽略损坏文件:

wsl -d Debian# 在 Debian 里创建输出目录(对应 Windows 的 C:\\WSL-backups\\backup-root)sudo mkdir -p /mnt/c/WSL-backups/backup-root# 用 tar 只提取以 \"./home\" 开头的那一级目录及其所有子文件sudo tar --ignore-failed-read --warning=no-file-changed \\ -xzpf /mnt/e/WSL-backups/ubuntu-backup.tar.gz \\ -C /mnt/c/WSL-backups/backup-root \\ \"./home\"exit

然后启动新的 Ubuntu,把解压的/home/内容迁进去

# 启动新的 Ubuntu 并切换到 rootwsl -d Ubuntusudo -i# 确保有一个名叫 username 的用户,并清空它的home目录rm -rf /home/usernamemkdir -p /home/usernamechown username:username /home/username# 从 Windows 侧把备份/home/目录拷进来rsync -aHAX --numeric-ids /mnt/c/WSL-backups/backup-root/home/username/ /home/username/# 修正属主和权限,这样可以确保此后的登录和运行一切都是 username 用户权限chown -R username:username /home/usernameexit # 退出 root,回到 username(如果你当前还是 root)exit # 退出 WSL

然后就可以测试是否恢复成功。

原因分析

可能是电脑硬件老化影响了系统,笔记本已经用了6年了。

参考链接

记录一下修复 WSL 无法启动的过程 · 瞳のBlog

安装完wsl没有找到LxssManager这个服务 - Microsoft Q&A