为什么 WSL
类似 Codex 的各种 CLI 式的 AI 编程工具,不擅长在 Powershell 中运行命令来精确的编辑文件,一方面是因为其训练时可能更熟悉 Unix 类的语法,另一方面则是 Powershell 缺少精确编辑文件内容的工具。因此安装 WSL,然后把 Codex 安装进 WSL 是更好的选择,也是 OpenAI 的推荐做法。
要理解其原因,我们需要对比两种环境在处理文件和命令时的差异。
AI Agent 修改代码时,能生成 sed、awk、diff、patch 这类命令,它们像外科手术刀一样,能对文件进行精确到行、列、模式的流式编辑(Stream Editing)。而 PowerShell 的常规操作是“读取-修改-写回”:Get-Content 将文件读入内存,修改元素,再用 Set-Content 将文件写回。这个过程不仅更繁琐,在处理大文件时性能也较差。AI Agent 需要花费更多精力来稳定地生成复杂的 PowerShell 代码块去完成修改。
WSL2 允许利用 Linux 内核原生的命名空间技术创建一个安全的沙箱。这意味着 AI Agent 可以在一个被隔离的环境中运行,其文件访问被严格限制在项目目录内,并且可以禁用网络,这极大地提升了自动化代码修改的安全性。
提示不支持 WSL2
即使已经在 BIOS 里打开了虚拟化,按网上的教程在 Windows 功能中勾选了 Hyper-V(其实是不必要的),但安装过程中仍然会报错,提示系统不支持 WSL2,虚拟化错误,以及 Hyper-V 没有安装。
Wsl/InstallDistro/Service/RegisterDistro/CreateVm/HCS/HCS_E_HYPERV_NOT_INSTALLED
网络上解决该问题的方法多为使用命令行手动检查与打开 Hyper-V,或者使用 systeminfo 查看是否支持了 Hyper-V,但不能解决我的问题。
隐形的 Hyper-V
实际上,运行 wsl --install 命令时,自动就会开启 Hyper-V 等有关内容,如微软的网页中所说:
wsl --install 的功能如下:
- 启用可选的 WSL 和虚拟机平台组件
- 下载并安装最新 Linux 内核
- 将 WSL 2 设置为默认值
- 下载并安装 Ubuntu Linux 发行版
这可能是由于一些“隐藏的” Hyper-V 功能没有开启,在启用或关闭 Windows 功能的 GUI 里看到 Hyper-V 相关内容都勾选了,但这可能是假象。
我们使用命令行查看全部功能,dism 不区分大小写:
dism /online /get-features
这些一般显示为已启用,它们和 GUI 中的那些 Hyper-V 选项对应。
- Microsoft-Hyper-V-All
- Microsoft-Hyper-V
- Microsoft-Hyper-V-Tools-All
- Microsoft-Hyper-V-Management-PowerShell
- Microsoft-Hyper-V-Hypervisor
- Microsoft-Hyper-V-Services
- Microsoft-Hyper-V-Management-Clients
另外,还有两个名字里带着 Hyper-V 的功能,却没有出现在 GUI(也可能是因为微软的翻译问题)或 wsl --install 附带的命令中,可能是导致失败的主要原因。
- HyperV-KernelInt-VirtualDevice
- HyperV-Guest-KernelInt
使用命令行将这两个设置为启用,然后重启系统。
dism /online /enable-feature /featurename:HyperV-KernelInt-VirtualDevice /all /norestart
dism /online /enable-feature /featurename:HyperV-Guest-KernelInt /all /norestart
重启后,再次尝试安装。为避免重复下载发行版(在大陆网络环境非常浪费时间),我们可以先用不带参数的 wsl 命令或 wsl --status 来检查核心组件是否正常工作。如果不再报错,再执行 wsl --install -d <DistroName> 来安装你需要的发行版。
总而言之
这只是一次非常罕见的问题,我以前从来没有用 wsl --install 安装失败过,但它确实发生了。也许下一次更新 wsl 的时候,就会把这两个可能是更新导致的新功能一并开启。把这种疑难杂症记录下来,既能水一篇博客,或许也能在另一个同样倒霉的人安装不成功的时候,有机会给予帮助。正如小时候经常意外的在贴吧里解决各种疑难杂症一样。