前言
不知何时,我的wsl环境又坏了。
其实wsl我不怎么用,但是今天突然想用一下docker,但是没有启动成功。
于是乎我试了一下wsl,发现是wsl完全坏了。
之前卸载过wsl的某个子系统,比如ubuntu22,当初想着换24,之后很长一段时间没用过wsl。
尽管我怀疑是这个操作造成的问题,但是我想想这并不合理,于是没必要深究缘由了,我想不起来了。
症状
使用任何有关wsl的命令,他都提示wsl不可用,仿佛从未安装过wsl。
我反复禁用和启动windows功能多次,并没有什么用,禁用这个功能并不会删除wsl。
wsl: WSL 安装似乎已损坏 (错误代码: Wsl/CallMsi/Install/ERROR_SERVICE_DOES_NOT_EXIST)。
按任意键修复 WSL,或 CTRL-C 取消。
此提示将在 60 秒后超时。
可能的解决方法
还有类似下面的错误提示。我现在无法复现,但是我确实遇到了这个问题。
未注册类
Wsl/CallMsi/Install/REGDB_E_CLASSNOTREG
找到类似的问题如下
https://github.com/microsoft/WSL/issues/8268
我按照他们所说的去找windows subsystem之类的字样并没有找到,因此我以为我的wsl存在某种识别问题(比如已经安装上了但是系统认为没安装),但是实际上,这只是因为英文用户和中文用户的wsl的应用名称不同。
win+i打开设置,点击应用
,然后到如下的页面搜索linux,下面那个企鹅一样的头像就是wsl。
按照他们的说法,选中下面这个,然后点高级选项
,
划到下面点击修复即可。
但是正如我前面所说,我尝试的时候以为没有这个应用,于是并没有试过这个方法,也许他是有用的。
以上这些报错提示我都见到了,使用各种方法都没有用,因此我判断我的wsl几乎完全损坏了,需要重新安装。
解决
先尝试
你可以先试试前面那个从应用中修复,或者卸载的方法。
后面这个方法虽然也很简单,但是我写得太详细了有些啰嗦。
后面所做的一切努力,只是为了卸载wsl
废话
我查到了类似的问题,可能的解决方案,于是转向原贴。
https://github.com/microsoft/WSL/issues/11697
这个方法其实就是删除了注册表的几个目录,只不过因为删除无法找回于是采用重命名的温和方式。
我采用了这个issue中的方案,无论是重命名还是改权限,都没有成功,类似下面这张图。
于是乎,线索断了。
过程中,我尝试过使用winget去安装或者卸载wsl,但是似乎不太起作用。
我时常看到用安装包修复的字样,于是我从github下载了安装包,但是他提示版本相同无法安装。
https://github.com/microsoft/WSL/releases
于是,现在需要卸载wsl。
我之前使用everything搜索过wsl.exe,发现wsl.exe有很多个。
看到这个消息后,我发现有个目录的名称和这个完全一致,于是我便尝试去删除这个目录。
正文
进入下面这个路径,找到类似MicrosoftCorporationII.WindowsSubsystemForLinux_2.4.11.0_x64__8wekyb3d8bbwe
的目录。
C:\Program Files\WindowsApps
权限不足无法直接删除,提示你需要来自system的权限才能删除
。
右键属性
更改
高级,点击查找
然后找到自己用户名,双击
再点确认。此时还不行,因为虽然我们拥有了该目录,但是只有读取权限。
此时所有者已经是我们了,但是还是无法修改权限,需要先关闭这个窗口,再次右键属性。
点击确认或者x都无所谓。
确定,出来后再点确定(或者应用)
出来后发现删除的前面已经没有盾牌标志了,可以成功删除了。
然后用前面那个github的安装包直接安装即可。
安装完后,我输入wsl,他提示损坏,等他修复。
这次修复后,wsl可以正常使用了。
其他
之后我一看注册表(前面issue中提到的),WSL目录消失了,不过这都不重要了。