ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

WSL2启动报HCS_E_HYPERV_NOT_INSTALLED解决

WSL2启动报HCS_E_HYPERV_NOT_INSTALLED解决 1. 先把这个报错的底细摸清楚敲下wsl命令的那一刻屏幕没给你 Ubuntu 的欢迎信息反而甩回来一串红字Error code: Wsl/Service/CreateVm/HCS/HCS_E_HYPERV_NOT_INSTALLED。这个报错我第一次见到的时候也愣了一下因为这行信息拆开来看每个词都认识拼在一起就有点唬人。后来跟它打了几年交道我才慢慢摸清楚它的脾气。先把这串错误码拆开看。Wsl/Service/CreateVm说明问题出在 WSL 服务尝试创建虚拟机这一环HCS是 Host Compute Service 的缩写也就是 Windows 宿主机上的计算服务专门负责管理轻量级虚拟机和容器这类计算资源的生命周期最后那个HCS_E_HYPERV_NOT_INSTALLED才是真正的病根——Hyper-V 没装。翻译成人话就是WSL 想给你启动一个轻量虚拟机来跑 Linux 子系统结果跑到一半发现底层用来支撑虚拟化的 Hyper-V 平台压根不存在于是整个流程直接失败。这个错误之所以让人头疼是因为它的触发路径特别隐蔽。你可能是刚重装了系统可能是手贱在启用或关闭 Windows 功能里关掉了几个看起来没用的选项也可能是在公司电脑上受组策略限制Hyper-V 相关组件被禁用了。更麻烦的是WSL 1 时代根本不需要 Hyper-VWSL 1 走的是系统调用翻译的路子性能一般但兼容性好到了 WSL 2微软换了个思路直接把整个 Linux 内核塞进一个轻量虚拟机里跑这就对底层的虚拟化能力提出了硬性要求Hyper-V 从可选变成了必需。所以这篇文章要解决的就是一个很具体的问题当你的 Windows 上冒出HCS_E_HYPERV_NOT_INSTALLED这个报错导致 WSL 完全起不来的时候怎么一步步把它修好。我会把从根上理解虚拟化依赖、到具体开启哪些功能、再到各种边角料问题的排查都掰开揉碎讲一遍。适合的人群也很明确用 Windows 做开发、想在 WSL 里跑 Ubuntu 写代码、装 Docker、跑 CUDA 的兄弟尤其是系统刚重装或者公司电脑环境受管的人这篇可以直接拿去当操作手册用。需要提前说一句这个报错和网络环境、镜像源、下载速度这些常见 WSL 问题完全是两码事。很多人在wsl --install卡住或者慢的时候会去折腾网络配置但HCS_E_HYPERV_NOT_INSTALLED是本地虚拟化组件层面的问题跟网速、镜像、DNS 没有半毛钱关系方向搞错了会白折腾很久。2. 从根上理解 WSL 2 为什么离不开 Hyper-V2.1 WSL 1 和 WSL 2 的架构分野想彻底搞明白这个报错得先知道 WSL 1 和 WSL 2 在底层是两套完全不同的实现。WSL 1 的设计思路是翻译微软在 Windows 内核里实现了一套 Linux 系统调用的映射层Linux 程序发出的系统调用会被拦截并翻译成对应的 Windows 系统调用。这个方案的好处是启动快、占内存少、跟 Windows 文件系统互操作极其顺畅但缺点也很致命系统调用翻译不可能做到百分之百覆盖遇到稍微复杂一点的场景比如某些需要特定内核行为的程序、依赖完整 Linux 内核特性的容器工具就会翻车。WSL 2 彻底换了路子。微软直接在 Windows 里集成了一颗真正的 Linux 内核用轻量虚拟机的形式把它跑起来。这颗内核是微软自己维护编译的跑在一个基于 Hyper-V 技术的虚拟化层上。你在 WSL 2 里执行uname -r看到的那个版本号就是这颗定制内核的版本。因为是完整的 Linux 内核所以系统调用兼容性问题基本消失了Docker、systemd、各种需要内核能力的工具都能跑起来代价就是必须依赖虚拟化平台。Hyper-V 在这里扮演的角色就是提供虚拟化的地基。它本来是为服务器虚拟化设计的后来微软把其中一部分能力抽出来做成了轻量级的虚拟机管理接口也就是前面提到的 HCSHost Compute Service。WSL 2、Windows 沙盒、Docker Desktop 的 WSL 后端、Windows 容器这些功能全都共用这套 HCS 地基。所以当 Hyper-V 没安装或者被禁用HCS 就无从谈起WSL 2 想创建虚拟机自然就报HCS_E_HYPERV_NOT_INSTALLED。2.2 虚拟化平台和 Hyper-V 之间的关系这里有个概念很容易混淆需要单独拎出来讲清楚。很多人以为启用 WSL 2 就一定要勾选Hyper-V这个 Windows 功能其实不完全准确。在现代 Windows 10/11 上真正被 WSL 2 依赖的核心组件叫做虚拟机平台Virtual Machine Platform另一个是适用于 Linux 的 Windows 子系统Windows Subsystem for Linux。Hyper-V这个功能选项本身主要面向的是完整的 Hyper-V 虚拟机管理场景提供 Hyper-V 管理器图形界面那一套东西。但是这三个功能在实际运行的时候是共享底层虚拟化能力的。如果你只开了虚拟机平台和适用于 Linux 的 Windows 子系统理论上 WSL 2 是能跑的因为虚拟机平台已经提供了 HCS 需要的虚拟化支撑。反过来如果这些虚拟化相关的功能一个都没开或者被系统策略禁用了那 HCS 就找不到底层的 Hyper-V 能力报错就来了。微软这几年也在简化这个流程wsl --install这条命令会自动帮你把需要的功能都打开包括虚拟机平台和 WSL 功能本身然后让你重启。但问题在于自动化的东西一旦遇到环境干扰就容易出岔子——比如组策略限制、比如某些精简版系统删掉了相关组件、比如系统更新中断导致功能启用了一半这时候自动流程走不通你就得手动去补。2.3 报错出现的几种典型场景根据我这些年遇到的案例HCS_E_HYPERV_NOT_INSTALLED出现的场景大致能归成几类每一类的处理侧重点都不太一样第一类是全新安装或者重装系统之后直接用 WSL。这种情况下系统是干净的相关功能都没开老老实实把功能打开重启就能解决。第二类是系统更新或者大版本升级之后突然报错。Windows 的大版本更新有时候会重置一部分系统功能的状态或者更新了底层组件导致兼容性问题这时候可能需要在功能列表里重新确认勾选状态。第三类是公司或学校统一管理的设备。这种机器往往有组策略或者安全软件限制虚拟化功能普通用户甚至没有权限去启用 Hyper-V 相关组件处理起来会复杂很多。第四类是系统本身被优化过。市面上不少所谓的系统精简工具、优化脚本会把 Hyper-V、虚拟机平台这些看起来占资源的功能删掉等到你需要用的时候才发现组件缺失。注意判断自己属于哪一类场景比盲目跟着教程点鼠标更重要。尤其是受管理的企业设备如果发现功能列表里相关选项灰掉无法勾选先别急着折腾很可能需要联系设备管理员。2.4 为什么这个报错信息看起来这么技术流有人可能会问为什么微软不能把这个错误提示写得通俗一点直接说请启用虚拟机平台这个跟 HCS 在系统里的位置有关。HCS 是个底层服务层它报错的时候往往不知道上层到底是谁在调用它——可能是 WSL可能是 Docker可能是沙盒。它只能报告自己找不到底层的虚拟化能力至于调用方要拿去干什么它并不关心。所以错误信息就成了这种半成品状态既要包含足够的技术定位信息Wsl/Service/CreateVm/HCS又要包含底层的失败原因HCS_E_HYPERV_NOT_INSTALLED。理解了这一点你以后看到类似的HCS_E_开头的错误码基本都能往底层虚拟化组件这个方向去排查思路是相通的。比如 Docker Desktop 报WSL 2 需要更新其内核组件、Windows 沙盒启动失败背后往往也是同一套地基的问题。3. 手把手修复从检测到启用的完整流程3.1 第一步确认系统版本和虚拟化开关状态在动手开功能之前先做两个基础确认能省掉后面很多无用功。第一个确认是系统版本。WSL 2 要求 Windows 10 版本 1903 及以上内部版本 18362 以上或者 Windows 11。打开 PowerShell敲winver弹出来的窗口会显示当前系统版本。如果版本太老先考虑系统更新否则很多功能启用选项可能根本没有。第二个确认是 CPU 虚拟化在 BIOS/UEFI 层面有没有开。这是最底层的开关如果它在 BIOS 里是关的Windows 里的功能开再多也没用。查看方法倒不复杂打开任务管理器切到性能标签页看 CPU 那一栏右下角会显示虚拟化状态。如果显示已启用说明底层没问题如果显示已禁用那就得重启进 BIOS 把 Intel VT-x 或者 AMD-V 打开。# 也可以用这条命令从系统信息里查 systeminfo | findstr /i Hyper-V这条命令会输出 Hyper-V 相关的几行要求信息如果看到已检测到虚拟机监控程序之类的字样说明虚拟化已经启用。这一步千万别跳过我见过不止一个人折腾了大半天软件配置最后发现是 BIOS 里虚拟化压根没开。3.2 第二步通过命令行启用所需功能确认底层没问题之后开始开功能。命令行方式比图形界面更可靠因为图形界面有时候会因为组件状态不一致导致勾选无效而命令行是幂等的重复执行也不会有副作用。以管理员身份打开 PowerShell这一点很重要不是管理员权限执行会直接报权限不足执行# 启用虚拟机平台 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart # 启用适用于 Linux 的 Windows 子系统 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # 如果是需要完整 Hyper-V 的场景再加这一条 dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V-All /all /norestart这里解释一下参数含义。/online表示对当前运行的系统操作/enable-feature是启用指定功能/featurename后面跟功能的内部名称/all表示同时启用该功能的所有父级依赖/norestart是暂时不重启、等你自己决定什么时候重启。加上/all很关键因为虚拟化功能之间有依赖关系单独开一个可能开不起来。也有人说可以用Enable-WindowsOptionalFeature这个 PowerShell cmdlet效果等价Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -All -NoRestart Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -All -NoRestart两种方式选一种就行看个人习惯。我一般用 dism因为输出信息更清晰能直接看到操作成功还是失败。注意如果 dism 执行报错提示功能名称未知或者找不到元素往往说明系统组件缺失可能是精简系统删掉了功能包。这种情况需要更复杂的处理后面常见问题章节会讲。3.3 第三步重启并设置默认版本为 WSL 2功能启用之后必须重启这一步没有捷径。重启完成之后再以管理员身份打开 PowerShell把 WSL 的默认版本设置成 2wsl --set-default-version 2如果这一步报错说WSL 内核文件未找到或者类似提示说明还需要更新 WSL 2 的内核组件。去微软官方文档页面找 WSL2 Linux kernel update package下载那个 msi 包装上就行。这一步是很多人容易漏掉的功能开了、重启了但内核包没更新WSL 还是跑不起来。装完内核包之后执行wsl --update wsl --statuswsl --status会输出当前 WSL 的状态信息包括默认版本、内核版本等能帮你确认配置是不是生效了。如果这些命令都能正常输出基本就说明地基铺好了可以去装发行版了。3.4 第四步安装发行版并验证地基铺好之后安装 Ubuntu 就简单了# 列出可用的发行版 wsl --list --online # 安装 Ubuntu默认装最新 LTS wsl --install -d Ubuntu # 或者指定版本 wsl --install -d Ubuntu-22.04装完之后第一次启动会让你设置用户名和密码这个密码是 Linux 用户的密码跟 Windows 密码无关设置的时候输入不会显示字符这是正常的。验证环节直接敲wsl能进到 Ubuntu 的 shell 里然后uname -a能输出内核信息就说明整个链路通了。如果这时候还报HCS_E_HYPERV_NOT_INSTALLED那说明前面某个环节没生效需要回头逐步检查。3.5 一个容易被忽略的环节Windows 功能列表的实际状态图形界面和命令行的状态有时候会不一致尤其是经过多次更新或者优化工具处理过的系统。可以打开启用或关闭 Windows 功能在开始菜单搜 Windows 功能 就能找到重点看这么几项功能名称是否需要勾选作用说明适用于 Linux 的 Windows 子系统必须WSL 功能本体虚拟机平台必须提供 WSL 2 所需的虚拟化支撑Hyper-V视情况完整 Hyper-V 场景需要纯 WSL 可不选Windows 虚拟机监控程序平台建议提供底层 hypervisor 能力容器视情况需要 Windows 容器功能时勾选如果发现某项该勾的没勾勾上再重启一次。如果勾选框是灰的无法操作大概率是组策略限制这个得单独处理。提示这几项功能之间有依赖顺序不一定要一次全勾。纯 WSL 2 场景下适用于 Linux 的 Windows 子系统虚拟机平台通常就够了。Hyper-V 完整功能会占用较多资源非必要可以不装。4. 各类疑难杂症的排查思路4.1 功能勾选无效或者报错 0x800f080c有时候在启用功能的时候会遇到0x800f080c这个错误码提示功能名称未知。这个错误通常出现在精简版或者被深度优化过的系统上对应功能的组件包被删掉了所以即使命令写对了也找不到要启用的东西。处理这个问题的思路分几种情况。如果系统还能进行在线更新可以先跑一遍系统更新很多时候 Windows 更新会把缺失的组件补回来# 检查系统组件健康状态 dism /online /cleanup-image /checkhealth dism /online /cleanup-image /scanhealth dism /online /cleanup-image /restorehealth这三条命令逐条执行最后一条restorehealth会尝试从更新源修复损坏的组件对功能缺失类问题有一定效果。执行时间可能比较长耐心等。如果修复无效说明组件包确实是被彻底移除了这种情况最省事的做法是重装一个完整的官方系统镜像。我知道这话听起来像甩锅但精简系统删组件这个事儿后期的坑是无穷无尽的今天补上 WSL明天可能别的功能又缺了不如一次到位。4.2 虚拟化已启用但依然报错这种检查都过了但就是不工作的情况最磨人。常见的隐藏原因有这么几个一是 Hyper-V 相关服务被禁用了。虽然功能开关是开的但底层的服务可能被设成了禁用状态。打开服务管理器services.msc检查这几项服务的启动类型Hyper-V 主机计算服务vmcomputeHyper-V 虚拟机管理vmms虚拟机监控程序HvHost如果这些服务的状态是已禁用或者已停止右键改成自动并手动启动。这里要特别注意 vmcompute 这个服务它正是前面提到的 HCS 的宿主它不跑WSL 必然起不来。二是第三方虚拟化软件冲突。如果你装了 VMware、VirtualBox 这类第三方虚拟机软件它们和 Hyper-V 在底层虚拟化访问上会打架。较新版本的 VMware 和 VirtualBox 已经能通过 Windows Hypervisor Platform 接口共存但老版本会直接冲突。排查方法很简单临时卸载或者停用这些软件的服务再试 WSL如果好了就说明是冲突。三是安全软件拦截。某些安全软件会对虚拟化相关操作做限制尤其是企业管控环境下的软件。这种问题比较隐蔽可以尝试临时关闭安全软件进行测试但要记得测试完恢复不要长期关闭。4.3 企业管控设备上的特殊处理公司配发的电脑尤其是加入了域的设备经常会在虚拟化功能上锁死。这种情况的表现通常是功能列表里相关选项灰掉、dism 命令报权限或策略错误、服务无法启动。遇到这种情况首先要明确一点这不是技术问题能完全解决的而是权限和策略问题。可以尝试的操作顺序是先看自己有没有本地管理员权限。打开命令提示符执行whoami /groups看当前用户是否在 Administrators 组里注意即使显示是管理员也可能因为 UAC 或者域策略而受限。然后看组策略有没有针对虚拟化的限制。运行gpedit.msc检查计算机配置 - 管理模板 - 系统 - Device Guard和计算机配置 - 管理模板 - Windows 组件 - 应用程序兼容性这些路径下有没有相关的限制项。如果有而且无法修改那就真的得找 IT 管理员了。注意企业环境下擅自绕过管控策略是高风险行为不仅技术上很难绕过还可能违反公司规定。正确做法是带着具体需求去找管理员说清楚为什么需要 WSL很多时候是可以开特例的。4.4 常见问题速查表把上面这些坑整理成一张表出问题的时候可以按图索骥报错或现象最可能的原因优先排查方向HCS_E_HYPERV_NOT_INSTALLED虚拟化功能未启用启用虚拟机平台和 WSL 功能后重启0x800f080c 功能名称未知系统组件被删检查系统健康必要时重装系统虚拟化显示已启用但仍报错相关服务未运行检查 vmcompute、vmms 服务状态功能列表选项灰掉无法勾选组策略限制联系 IT 管理员WSL 内核文件未找到缺少内核更新包安装 WSL2 内核更新包功能开完重启后依然报错第三方虚拟化软件冲突检查 VMware、VirtualBox 共存情况5. 修复之后的验证和长效维护5.1 全链路验证清单修完之后别急着关电脑做一轮完整验证确认每个环节都踏实# 1. 确认 WSL 状态 wsl --status # 2. 确认已装发行版列表 wsl --list --verbose # 3. 进入发行版测试内核 wsl uname -a # 4. 测试一个实际命令 wsl echo wsl is working如果wsl --list --verbose里 VERSION 那一列显示的是 2说明用的是 WSL 2。如果显示 1可以用wsl --set-version 发行版名 2手动切换。验证的时候还要关注有没有WSL 2 需要更新内核之类的提示有的话就说明内核包版本落后更新一下。5.2 日常使用中的几个维护要点修好只是第一步想让它长期稳定有几个习惯值得养成。第一Windows 大版本更新之后主动检查一遍。前面说过系统更新有可能会重置虚拟化功能的状态所以每次大更新之后花两分钟跑一下wsl --status比出了问题再来排查省事得多。第二装了或卸载了虚拟化相关软件之后留意一下 WSL 是否正常。VMware、VirtualBox、Docker Desktop、Windows 沙盒这些都会跟底层虚拟化打交道它们的安装卸载有时会影响 HCS 的状态。第三定期清理 WSL 的磁盘占用。WSL 2 的虚拟磁盘会随着使用不断增长虽然删了文件但磁盘空间不一定马上释放。可以这样清理# 关闭 WSL wsl --shutdown # 对指定发行版执行磁盘压缩 # 这里需要先用 diskpart 找到对应的 vhdx 文件具体操作是找到发行版的 vhdx 文件一般在%LOCALAPPDATA%\Packages\下面然后用diskpart挂载并 compact。这个操作我一般一两个月做一次能回收不少空间。5.3 我在实际使用中印象最深的几个教训第一个教训是永远先看底层虚拟化状态再动上层功能。我早期遇到过一个问题折腾了半天 WSL 功能开关最后才发现是 BIOS 里 CPU 虚拟化没开。从那以后我养成了习惯任何虚拟化相关问题第一步永远是查任务管理器里的虚拟化状态。第二个教训是命令行启用比图形界面可靠。图形界面勾选功能的时候如果底层状态不一致有时候会静默失败你以为勾上了其实没生效。dism 命令会明确告诉你成功还是失败而且可以重复执行所以我现在基本都用命令行。第三个教训是受管控的设备别硬刚。有一次帮一个朋友处理 WSL 问题他用的公司电脑被禁用了虚拟化我试了各种方法都不行最后他去申请IT 部门十分钟就给开了特例。很多时候绕路的时间比直接沟通长得多。还有一个值得一提的细节关于在 VS Code 里用 WSL 的开发体验。修好 WSL 之后VS Code 安装 Remote - WSL 插件就能直接在 WSL 环境里编辑和运行代码Windows 的文件系统和 Linux 的文件系统通过 VS Code 的远程协议打通体验很接近原生 Linux 开发。字体方面等宽字体里我比较推荐选择对中文和符号支持好的方案具体选哪款看个人审美重点是保证在 WSL 终端里中文不出现乱码或者对齐错位。这套 WSL 2 的虚拟化机制修通之后后续跑 Docker、跑 CUDA、跑各种需要完整 Linux 内核能力的工作负载地基就都稳了。真正麻烦的从来不是 WSL 本身而是那层看不见的虚拟化地基有没有铺平。
返回列表