处理一个WSL1崩溃的问题
一觉醒来,我电脑上的Linux子系统(windows subsystem of Linux)WSL1崩了。
一、问题描述
我的电脑是win10 64位家庭版22H2的系统,为了开发方便,我开启了WSL1的功能,并安装了Ubuntu 22.04发行版。昨天的时候,我的WSL1突然在毫无征兆的情况下崩溃了,终端输出如下:
1 | (base) cyclin@DESKTOP-23BCT60:source$ Error: 0xd00002fe |
当我按下回车键以后,终端开始进入WSL升级的进度条
1 | 正在将适用于 Linux 的 Windows 子系统更新到版本: 2.4.12。 |
进度条走完以后,终端进入了WSL的界面,似乎一切正常。但是当我使用wsl指令启动另一个WSL终端实例时(调用 bash.exe
),相似的错误又出现了:
1 | wsl: WSL 安装似乎已损坏 (错误代码: Bash/CallMsi/Install/REGDB_E_CLASSNOTREG)。 |
wsl.exe
指令也崩了:
当我启动另一个终端实例 ubuntu2204.exe
时(即,直接调用发行版的启动指令),报错如下:
心态有点崩溃。因为我有许多要在WSL上跑的任务,WSL一崩溃,这些任务都完不成。
二、探索问题的可能原因和解决途径
首先查到的是一篇文章 《WSL使用常见问题记录》 - 1379号观察员的文章 - 知乎 。但是文章并没有提供排查问题的方法,只说“wsl 常常不知道什么原因就损坏不能使用了,这个时候最直接有效的解决方法就是完全卸载后重新安装”。
此外,还找到了一些文章或帖子,如下:
- 未注册类。WSL 安装似乎已损坏。WslRegisterDistribution failed with error: 0x8007019e
- 解决问题:WSL升级后无法运行:错误代码: wsl/callmsi/install/error install failure
- WSL 安装似乎已损坏,无法启动
- 如何解决win11安装wsl出现“没有注册类 错误代码: Wsl/CallMsi/Install/REGDB E CLASSNOTREG”的问题?
差不多可以归纳为,系统静默升级过程中不小心弄坏了WSL1的某些组件,导致WSL1注册表出问题。但这个问题似乎没有什么很好的解决方法,只能从头重装。
三、问题的解决:重装系统
如题。
(一)备份重要文件
因为我们的WSL版本为WSL1,可以通过 /mnt/
目录实现跨文件系统访问Windows上的文件(WSL2不行,它是个虚拟机),因此我们在Windows文件系统上备份一些数据(以H盘为例)。
前面提到,当我按下回车键以后,终端开始进入WSL升级的进度条
1 | 正在将适用于 Linux 的 Windows 子系统更新到版本: 2.4.12。 |
进度条走完以后,终端能够进入WSL的界面,因此我们也用这种方法进入WSL实例,然后在实例内部进行操作。
1 | mkdir /mnt/h/wsl_bkp # 在电脑的H盘新建一个文件夹,用作备份文件夹。 |
(二)卸载WSL
去控制面板里关闭下图中的这两项windows功能(控制面板→程序→启用或关闭Windows功能)
然后重启电脑。
(三)重新安装WSL
仍然是下面这个位置,去控制面板里重新打开下图中的这两项windows功能(控制面板→程序→启用或关闭Windows功能)。
然后再次重启电脑。
重启完成后,命令行输入 wsl
应该会有反应
下面我们使用指令安装WSL1(注意,默认WSL版本为WSL2。关于WSL1和WSL2的区别,参考官方文档 《比较 WSL 版本》 。要安装WSL1,需要一些额外的步骤)。
1 | wsl --list --online # 列出当前可用的Linux发行版 |
注意,上面的最后一条指令,如果没有--enable-wsl1
,安装会失败:
1 | C:\Windows\system32>wsl.exe --install Ubuntu-22.04 |
如果安装成功,系统会提示重启一次电脑。重启之后,运行wsl
或bash
,就可以成功进入WSL了。
(四)一些文件的恢复
1 | cp -r /mnt/h/wsl_bkp/* . # 把备份的文件复制回来 |
以上。