WSL 2无法运行Ubuntu - 错误0x80370102

今天,我决定从WSL 1升级到WSL 2。在WSL 1上,我没有遇到任何问题,可以在WSL 1上运行Kali Linux或Ubuntu。但是当升级到WSL 2时,Kali和Ubuntu都无法升级到版本2。我看到有人说卸载并重新安装它们可以解决这个问题。 然而,在重新安装它们后,我的系统现在无法检测到任何已安装的发行版,尽管这些发行版已经安装好了。启动Kali或Ubuntu都会出现相同的错误。
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x80370102
Error: 0x80370102 The virtual machine could not be started because a required feature is not installed.

在研究此错误时,并从阅读微软官方的 WSL 2 安装指南中得知,这个错误似乎总是因为系统在 BIOS 中没有启用虚拟化。这真的很令人困惑,因为我已经检查了超过 4 次,看是否错过了 BIOS 中的任何虚拟化设置,并确认所有设置都已启用。我还确认我也已启用了 NX 功能。即使 HWiNFO 也检测到我已启用虚拟化:

Screenshot of HWiNFO's results

我还确保了“虚拟机平台”、“Windows子系统Linux”和“Windows Hypervisor平台”功能都已启用。不仅如此,我还可以在VirtualBox中创建和运行任意数量的虚拟机,没有任何错误或问题。
我还尝试了其他故障排除步骤,包括重置WSL服务、多次重启我的计算机、更新WSL内核、验证我的Windows版本是否为19041或更高,并且等待启动后20分钟,以确定是否只是因为我太急躁。
系统信息: - 运行Windows 10版本10.0.19041.388(也称为SDK版本2004) - Ryzen 3900x CPU - 32GB DDR4 RAM - Asus Tuf Gaming X570-Plus主板,BIOS版本1407

我也是。在那之前,我参加了一个基于英特尔的会议。安装WSL(当时是1版)没有问题。 当然,你在BIOS/高级/ CPU 设置中检查过SVM模式是否已启用了吗? 希望有人能回答。 - mchko
我多次检查了我的BIOS,以确认设置是开启的。这绝对是一个奇怪的问题。我认为可能是WSL 2与某些AMD CPU存在的一个bug,但我找不到任何证据来验证这一点。 - Blu
我用的是Intel处理器,遇到了同样的问题。虚拟化已经在BIOS中开启了,但是还是出现了错误,肯定是Windows的一个bug。令人烦恼的是,之前我成功安装了Ubuntu,但由于其他一些问题,我卸载了它,现在重新安装时又遇到了这个错误。 - MMT
@MMT 你做的事情和我差不多!起初Ubuntu是可以使用的,但在我的故障排查过程中,我卸载了Ubuntu,然后重新安装以查看是否可能会起作用。 - Blu
1我的解决方法:我拥有一台HP Z4 G4工作站,不得不重新启动计算机并进入BIOS菜单以启用CPU的虚拟化。我建议在网上搜索“<您的计算机名称>启用虚拟化BIOS”并按照那些说明进行操作。重启计算机并运行此命令后,我成功地获得了“输入新用户名/密码”的提示。 - youngrrrr
1对我来说,以下是唯一的解决方案(以管理员身份在PowerShell中执行):wsl --set-default-version 1 - Herpes Free Engineer
感谢 @HerpesFreeEngineer。我尝试了所有的答案,只有这个有效。在Windows 11上使用相当新的AMD硬件。 - Samaursa
7个回答

首先,你需要确保在BIOS中启用了CPU虚拟化。具体的操作指南会根据你的硬件而有所不同。
对于AMD处理器,你需要寻找一个名为“AMD (AMD Secure Virtual Machine, AMD SVM)”的功能。
对于Intel处理器,你需要寻找一个名为“Intel (Intel Virtualization Technology, Intel VT-x)”的功能。
以下是我电脑上设置SVM的指南(注意:这是适用于MSI主板的):
0. 进入高级设置。 1. 进入超频设置。 2. 进入CPU特性设置。 3. 切换CPU特性“SVM Mode”,以启用CPU虚拟化。
其次,你需要启用Hyper-V Windows功能。
以下是我的指南(注意:你也可以单独使用DuckDuckGo/Google搜索):
1. 在任务栏中搜索“Windows Features”。 2. 找到“Hyper-V”,然后启用它。

在这个时候,你应该已经完成了,不再出现此错误。


3我遇到的问题是,所有这些步骤都已经完成,并且我已经四次检查了每个设置是否启用。我可以正常地通过Vbox和VMware运行常规虚拟机,没有任何问题。只有WSL拒绝工作,并表示我未启用VM功能。 - Blu
2很遗憾,这对我来说没有起作用。我仍然无法在Windows 10上运行Ubuntu 20.04。 - Ryan
4我没有一个叫做“Hyper-V”的功能,但是我有一个叫做“Windows Hypervisor Platform”的功能,它提到了虚拟化。我启用了它,对我来说有效。 - vallentin
2你真是个救命恩人 :) - Jeremy Belolo
1谢谢!这正是我所需要的,我没想到在BIOS的“CPU超频”部分会找到虚拟化设置! - Jeff Atwood
我非常确定在你发表回答时是这种情况,但现在绝对是真的。WSL不再在Hyper-V上运行,并且_不_需要Hyper-V。 - Nathan
这适用于我的技嘉主板。至少它还有一个可以打开的 SVM 模式。 - WesternGun
我启用了SVM和"Windows Hypervisor Platform",并成功在我的WSL2上启动了Ubuntu。 - Mark Watson

我已经修复了这个问题,运行以下代码并重新启动系统。

bcdedit /set hypervisorlaunchtype auto

8欢迎来到Ask Ubuntu,并感谢您的回答!在未来,更有帮助的回答应该提及您是如何了解到这个命令的(指向您找到它的文档),运行它的风险是什么,以及如何恢复(如果可能的话)。 - Ryan
2这个可以在装有Windows 11的电脑上修复。 - sainf
2这解决了我在Windows 11中的问题。对于WSL要求,我已经勾选了所有复选框。 - Sarthik Gupta
谢谢解决我的问题,我有一个快速的问题,如果我想要撤销这个更改,你怎么做? - Hossein
1这是修复 Windows 11 上的 WSL 和 Android 子系统的有效方法。 - spider623

我在以下步骤后解决了这个问题:

  • 禁用了"虚拟机平台"功能
  • 重启了Windows
  • 重新启用了"虚拟机平台"功能
  • 再次重启了Windows

这是来自2020年5月发布说明的内容:

我们注意到一个问题,即在运行2020年5月更新的系统上使用DISM(部署映像服务和管理)工具修复损坏时,不一定总是报告正确的状态。这个问题将在即将发布的维护版本中修复。

看起来Dism在确定一个功能是否真正启用时存在问题,所以你可能需要尝试几次直到它生效。

我在GitHub上找到了解决方案,本答案中的一些信息也来自那里。对于那些可能遇到相同问题的人,我将这些信息添加在这里,希望能帮到他们。


非常感谢您的贡献!请考虑编辑您的回答,并解释一下这个解决方案是什么,您是如何实施的,用户在浏览该链接时应该期待和尝试些什么。 - Pizza
1如果你想知道如何按照上述所描述的方法禁用(然后再启用)"虚拟机平台",请前往控制面板并搜索**"打开或关闭Windows功能"**,然后在打开的窗口中向下滚动至"虚拟机平台"。 - WebDevBooster
很遗憾,这对我来说没有起作用。我仍然无法在Windows 10上运行Ubuntu 20.04。 - Ryan
1+1 - 禁用和重新启用并重启解决了问题。不确定是否相关,但在禁用“VMP”后,我还在BIOS中启用了虚拟化功能,然后重新启用“VMP”并重启。 - Metro Smurf
我的方法类似。我禁用了“虚拟技术”功能;重新启动了Windows;重新启用了“虚拟技术”功能;再次重新启动了Windows。 - sirius

我也遇到了同样的错误,并且启用了虚拟化。在取消选中Windows子系统以及Linux、Windows Hypervisor平台和虚拟机平台后,重新启动电脑并再次启用它们后,错误消失了,我成功安装了WSL 2。

我花了几个月的时间努力让WSL 2正常工作。但是,将我现有的WSL 1上的"Ubuntu"升级到WSL 2从未成功过。
最后,我卸载了我已经从Microsoft商店安装的“Ubuntu”(不是“Ubuntu 20.04”)。 我从Microsoft商店安装了Ubuntu 20.04应用程序。 我确认了所有4个Hyper-V要求都显示为“是”。 我确认我的(ASRock)BIOS中的“Intel虚拟化技术”=启用和“无执行内存保护”=启用。 在Windows > 控制面板 > 程序 > “打开或关闭Windows功能”中,我确认我已经选中(启用)了“Hyper-V”、“Windows Hypervisor Platform”和“Windows子系统Linux”。 对我来说关键是取消选中“虚拟机平台”,这是因为这个答案。因为那个答案,我计划在重新启动后重新启用它(几个月前我已经尝试过但没有成功),但幸运的是我受到启发尝试打开Ubuntu 20.04应用程序,它成功了!(“虚拟机平台”仍然禁用。) 更新:糟糕,我过早地宣布成功。我遇到的下一个问题是我无法在WSL 2 Ubuntu 20.04中连接到互联网。所以我确实需要重新启用“虚拟机平台”。然后还需要更多步骤:sudo rm /etc/resolv.conf && sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf' && sudo chattr +i /etc/resolv.conf(来自https://github.com/microsoft/WSL/issues/4844#issuecomment-765248581)非常有帮助(因为https://github.com/microsoft/WSL/issues/5336#issuecomment-653881695不太起作用,那个文件一直被覆盖)。 Bryan的回答很相似,但需要卸载/取消更多的选项。

2取消选择"虚拟机平台"对我来说也解决了问题,经过数小时的尝试才弄清楚。非常感谢! - CasualDemon

你必须在BIOS中启用虚拟化。 没有其他办法。我和微软顾问花了2个小时来解决这个问题。我们尝试了一切,但最终没有成功。 后来我在某个地方看到了关于BIOS设置的建议。它起作用了!虚拟化被禁用了。一旦启用,Ubuntu就可以正常工作了。

1我实际上已经启用了那个设置。就像我在帖子中所说的那样,我已经检查过确保虚拟化在我的BIOS中启用,并且甚至有一款软件进行了三重检查以验证它可以检测到虚拟化已启用。 - Blu
这个对我解决了问题。点赞因为它不明显。 - Anakhand

哦!我找到了。在“添加/删除功能”中,你有Hyper-V和关于虚拟化的其他内容。那个确实缺失了。我只有这个功能的法语翻译,所以给你可能没有帮助。查找整个列表并仔细检查。实际上,不需要Hyper-V。 Debian已经启动运行。

1我尝试了你的方法,但它仍然无法正常工作。我只能看到两个选项,即Hyper-V功能和虚拟机平台功能。虚拟机平台功能是WSL正常运行所需的。奇怪的是,现在PowerShell告诉我需要在BIOS中启用虚拟化并启用虚拟机平台功能。这两个选项都已经启用了。 - Blu
我可以确认,WSL 2 不需要 Hyper-V。虽然对于一些人来说,添加Hyper-V可以解决问题,但我已经在没有启用Hyper-V的情况下多次重启了WSL。这似乎是Windows端的一个错误。 - haleonj