先说个我自己的经历:在 Windows 终端里codex --version敲下去,版本号正常弹出来,但一打开 VS Code 想调用 Codex CLI,直接给我甩一句unable to locate the codex cli binary or required runtime components。当时我还以为是安装路径问题,折腾了半天环境变量才发现,根子出在 Windows 原生环境跑这套工具天生就有一堆坑,而 WSL 才是真正省心的解法。
这篇文章就是围绕Windows + WSL + Codex CLI这套组合来写的,目标是帮你把 Codex CLI 在 WSL 里完整跑起来,并说清楚:为什么要绕道 WSL、WSL 本身怎么装、Codex CLI 依赖哪些运行时组件、常见的 "unable to locate" 到底怎么排查,以及 VS Code / Windows Terminal 怎么和 WSL 里的 Codex 无缝配合。如果你正卡在安装、登录、环境识别这一类问题上,这篇应该能直接帮你省掉半天搜索时间。
1. 为什么我放弃 Windows 原生环境,转头投向 WSL
1.1 Windows 原生跑 Codex CLI 的典型痛点
先说个反直觉的事:Codex CLI 本身是个跨平台工具,理论上 Windows 原生也能装,但实际用起来很别扭。
我第一次在 Windows 上装 Codex CLI,走的是 npm 全局安装,装完后codex命令在 CMD 和 PowerShell 里都能正常执行。但问题很快就来了——Codex CLI 的核心能力不是单靠一个二进制文件完成的,它需要和代码沙箱、运行时组件、登录态管理这些周边模块配合。Windows 的文件系统权限模型、路径分隔符、符号链接行为,和 macOS/Linux 那一套差别很大,导致很多周边组件在 Windows 上要么跑得慢,要么干脆跑不起来。
最典型的例子就是热词里那个报错:chatgpt failed to start. unable to locate the codex cli binary or required runtime components。我查了 Codex CLI 的 issue 区,不少 Windows 用户都栽在这条错误上。原因很简单:Codex CLI 在启动时会去固定的几个路径寻找自己的辅助运行时(runtime components),而 Windows 上的 npm 全局目录、AppData 路径和它默认的查找位置经常对不上,再加上杀毒软件拦截、终端权限不够这些因素,就会导致刚装完能--version,一启动干活就找不到组件。
1.2 WSL 解决了什么本质问题
WSL(Windows Subsystem for Linux)的第二个版本 WSL2 不是一个简单的"Linux 模拟器",它是一个跑在 Hyper-V 虚拟机里的完整 Linux 内核。这意味着你在 WSL 里敲命令、装软件、跑服务,行为表现和一个真实的 Ubuntu 服务器几乎一模一样。
这带来三个实打实的好处:
- 路径和权限模型一致。Codex CLI 在 Linux 环境下查找运行时组件,遵循的是 FHS(文件系统层次标准),不会出现 Windows 那种 C 盘 D 盘路径混乱导致找不到文件的问题。
- npm 生态兼容性更好。Codex CLI 依赖的不少 npm 原生模块需要在安装时编译二进制,Windows 上经常缺 Python、C++ 构建工具链,而 Ubuntu 里只需要
build-essential一个包就能解决。 - 和 VS Code 的集成天然顺畅。VS Code 有官方 Remote-WSL 插件,可以把整个编辑器的工作环境切换到 WSL 里,终端、调试器、语言服务都是直接跑在 Linux 环境中的,Codex CLI 作为命令行工具在这种情况下才是最舒服的。
1.3 什么情况下不需要 WSL
当然,不是所有人都必须走 WSL。如果你只是想在 Windows 上简单调用一下 Codex CLI 的基础问答功能,不涉及本地文件读写、不打算把它接入编辑器、也不准备跑沙箱环境,那 Windows 原生 npm 安装也能用。但只要你打算把 Codex 接入 VS Code、或者让它扫描本地代码仓库、或者跑 agent 模式,那我建议你直接上 WSL,省得后面一遍遍踩环境问题。
2. WSL 安装全流程,以及版本确认的细节
2.1 开启 WSL 功能:从控制面板到一条命令
以前装 WSL 需要手动去控制面板勾选"适用于 Linux 的 Windows 子系统"和"虚拟机平台"两个选项,还要重启两遍系统。现在微软把整个流程压缩成了一条命令。
用管理员身份打开 PowerShell 或 Windows Terminal(管理员),执行:
wsl --install这条命令会自动做四件事:
- 开启 WSL 和虚拟机平台两个 Windows 功能
- 下载安装 WSL2 内核
- 将默认版本设置为 WSL2
- 下载并安装默认发行版(通常是 Ubuntu)
装完会提示你重启电脑。重启后第一次启动 Ubuntu,会让你设置用户名和密码,这个用户会自动加入 sudo 组,后面装软件就靠它了。
2.2 如何确认你用的是 WSL2 而不是 WSL1
重启之后,在 PowerShell 里执行:
wsl -l -v输出结果长这样:
NAME STATE VERSION * Ubuntu Running 2VERSION 列显示 2,说明跑的是 WSL2。如果显示 1,执行:
wsl --set-version Ubuntu 2把发行版转换到 WSL2。转换过程可能需要几分钟,期间不要动终端。
这里多说一句为什么必须 WSL2:WSL1 是系统调用翻译层,没有真正的 Linux 内核,很多需要内核模块的工具跑不了,Codex CLI 的沙箱组件对内核版本有要求,WSL1 会直接导致运行时组件起不来,而且报错信息不一定明确,容易让你误以为是 Codex 本身的问题。
2.3 镜像网络模式:解决 WSL 网络兼容性
WSL2 默认使用 NAT 网络模式,这个模式在绝大多数情况下没问题,但有几个场景会踩坑:公司网络有代理认证、校园网需要网页登录、某些防火墙策略限制内部虚拟机通信。
如果你碰到 WSL 里apt update慢、npm 下载超时、或者 Codex CLI 登录时无法访问认证服务器,可以在C:\Users\<你的用户名>\.wslconfig文件里配置镜像网络模式:
[wsl2] networkingMode=mirrored这个模式让 WSL2 直接共享 Windows 主机的网络接口,虚拟机和宿主机在网络层面更像同一台机器,代理、防火墙的兼容性会好很多。配置完成后执行wsl --shutdown再重新进 WSL 生效。
提示:
.wslconfig文件如果不存在就手动创建一个,文件编码保存为 UTF-8,别用带 BOM 的格式,否则 WSL 读取配置会报错。
3. WSL 内配置 Linux 环境,Codex CLI 的运行基座
3.1 更新软件源与基础工具链
进入 WSL 终端后,先把 Ubuntu 的软件源和基础工具链更新到最新:
sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential git curl wgetbuild-essential这个包很可能被很多人忽略,但它里面包含了 gcc、g++、make 等 C/C++ 编译工具链。如果跳过这一步,后续某些 npm 原生模块在安装时可能会报编译失败,而且报错信息五花八门,什么node-gyp错误、python找不到、g++版本不兼容,排查起来相当头大。
3.2 Node.js 版本管理:nvm 是必须的
Codex CLI 是 npm 包,需要 Node.js 环境。我推荐用 nvm(Node Version Manager)安装,而不是直接apt install nodejs。
原因很现实:apt 源里的 Node.js 版本一般偏老,而 Codex CLI 对 Node.js 版本有最低要求。用 nvm 可以随时切换版本,遇到 Codex CLI 升级要求新版本时,一条命令就能切换,不用重新折腾环境变量。
安装 nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash安装完成后重新加载 shell 配置:
export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"然后安装 Node.js 的 LTS 版本:
nvm install --lts nvm use --lts验证版本:
node -v npm -v3.3 配置 npm 镜像:不要小看这一步骤
如果你在国内网络环境下,直接用官方 npm 源安装 Codex CLI 会遇到两个问题:一是下载速度慢到怀疑人生,二是某些依赖包容易下载失败。
配置 npm 镜像:
npm config set registry https://registry.npmmirror.com注意,镜像源只是解决下载速度和稳定性,npm 包的校验逻辑不会被篡改,安全上没有问题。担心的话,装完后可以随时切回官方源:
npm config set registry https://registry.npmjs.org/3.4 安装 Codex CLI
环境准备好之后,安装 Codex CLI 本身其实很简单:
sudo npm install -g @openai/codex安装完成后查看版本:
codex --version如果你能看到版本号输出,恭喜你,WSL 这一侧的基础安装已经完成了。但注意,这距离"完全可用"还有两步要走——登录和运行时组件校验。
4. 登录流程与运行时组件:从 "unable to locate" 到彻底跑通
4.1 那个著名的报错是怎么来的
很多人在 Windows 原生环境装完 Codex CLI 后,在 VS Code 里启动 Codex 面板,会看到:
chatgpt failed to start. unable to locate the codex cli binary or required runtime components.这个报错的本质是 Codex CLI 在启动时按预设路径查找自己的可执行文件和配套运行时,没找到就退出。Windows 原生环境里之所以容易触发,是因为:
- npm 的全局 bin 目录在 Windows 上通常不是 Codex CLI 默认会去查找的位置
- 部分运行时组件被安全软件当作可疑文件隔离了
- Windows 的符号链接机制导致路径解析失败
而在 WSL 里,npm install -g会把可执行文件放到/usr/local/bin或/usr/bin,这就是 Linux 系统的标准 PATH 目录,Codex CLI 的查找逻辑天然就能命中。
4.2 Codex CLI 登录:CLI 先登录,编辑器才不会下岗
在 WSL 终端里先执行:
codex login它会让你选择登录方式,走浏览器或 token 验证。登录成功后,凭证会存放在 WSL 内的用户配置目录(一般是~/.codex或~/.config/codex)。
这一步骤非常关键——如果你跳过 WSL 里的登录,直接打开 VS Code 的 Codex 插件,插件会通过 WSL 调用 CLI,但 CLI 发现没有登录凭证,就会表现为"起不来",而且报错信息不一定直接说"你没登录",反而可能丢给你一个找不到组件的错误。我第一次遇到这个报错时,第一反应是重装 CLI,浪费了不少时间。
4.3 验证运行时组件和沙箱
登录后,执行:
codex status这个命令会检查代码沙箱、运行时组件等各个子模块的状态。如果某个模块显示异常,可以根据提示信息定位。常见的异常有两类:
- 沙箱组件与内核不兼容:检查 WSL 内核版本,执行
uname -r,如果内核版本太老,运行wsl --update更新。 - 权限不足:确保运行 Codex 的用户对配置目录有读写权限,一般不会出问题,但如果你用的是 root 账号装的 npm 包,切换到普通用户时可能因为目录归属导致权限报错。
4.4 从 VS Code 启动 Codex:验证完整链路
完成上面几步后,回到 VS Code:
- 确保安装了 Remote-WSL 插件
- 在 VS Code 左下角点击绿色远程按钮,选择 "Connect to WSL"
- 进入 WSL 环境后,再打开 Codex 插件
这个时候 Codex 面板应该能正常启动。检验标准是:你随意输入一句指令,它能正常调用沙箱、返回结果。
注意:如果你在 Windows 一侧的 VS Code 里直接打开 Codex,而不是通过 Remote-WSL 进入 WSL 环境,那 Codex 插件会去找 Windows 本机的 CLI。所以,如果决定使用 WSL 方案,就养成习惯:每次打开 VS Code 都先连 WSL,不连 WSL 不开 Codex。
5. 日常使用中的路径与集成:Windows 和 WSL 双向互访
5.1 WSL 里访问 Windows 文件
在 WSL 中,你的 Windows 硬盘都挂载在/mnt/下。比如 C 盘对应:
ls /mnt/c/Users/你的用户名/Desktop这意味着你可以让 Codex CLI 扫描 Windows 项目目录里的文件。但这里有个性能陷阱:不要把大型项目放在/mnt/c下让 Codex 做全仓扫描。WSL2 访问 Windows 文件系统的 IO 性能相比原生 Linux 文件系统差很多,跨文件系统读写会有明显的延迟,尤其是大量小文件时,速度可以慢好几倍。我实测过,一个几万文件的仓库,放在/home下扫描几秒钟完成,放在/mnt/c下要等上半分钟。
所以实际使用建议是:项目文件放在 WSL 的/home/<用户名>目录下,用 VS Code Remote-WSL 打开,日常 Git 操作、Codex 分析都在 Linux 文件系统内完成。
5.2 Windows 里访问 WSL 文件
Windows 侧可以直接通过\\wsl$\Ubuntu\home\用户名\这个路径访问 WSL 里的文件。这个路径在资源管理器里可以直接粘贴跳转,也可以用wslpath命令做路径转换。
比如在 WSL 里获取当前目录的 Windows 路径格式:
wslpath -w $(pwd)反过来,在 Windows 侧转换 WSL 路径:
wsl wslpath -u 'C:\Users\用户名\Desktop'这个能力在日常使用中很实用,比如你截图存在 Windows 桌面,想在 WSL 里引用它,就可以用wslpath转出路径再喂给 Codex 做多模态分析。
5.3 Windows Terminal 深度整合
Windows Terminal 默认会检测 WSL 发行版并自动生成配置文件,但有几个可以优化的点:
- 默认 Shell 设为 WSL:在 Windows Terminal 设置里把默认配置文件改为 Ubuntu,这样每次打开终端直接进入 WSL。
- 固定常用发行版:如果你有多个发行版,给每个发行版单独配置快捷键。
- 自定义标题与配色:这个纯粹看个人喜好,重点提一下,因为新版 Windows Terminal 支持在配置文件里设置
"startingDirectory": "\\\\wsl$\\Ubuntu\\home\\用户名",可以让你启动 WSL 标签页时直接落到常用工作目录,省去每次 cd 的麻烦。
5.4 环境变量与代理配置:最常见的偷懒方式
WSL 和 Windows 环境变量默认不互通,这既是优点(隔离性好),也是麻烦(每次要配 proxy、PATH 等)。
如果你在 Windows 上用了代理,需要让 WSL 里的 Codex CLI 也能走代理,可以在~/.bashrc或~/.zshrc里加:
export https_proxy=http://宿主机IP:代理端口 export http_proxy=http://宿主机IP:代理端口注意是宿主机 IP,不是localhost。WSL2 的 NAT 模式下,WSL 里的localhost指的是虚拟机自己,不是 Windows。要拿宿主机 IP,可以在 WSL 里执行:
ip route show | grep -i default | awk '{print $3}'但在镜像网络模式下,宿主机 IP 可能直接就是localhost,因为网络栈共享了。这一块建议根据自己的.wslconfig配置实测,先试curl http://localhost:端口能不能通,再试宿主机 IP,哪个能用哪个。
提示:如果只是临时需要代理,可以在执行命令时前缀环境变量,比如
https_proxy=http://localhost:7890 codex,这样不会污染全局环境。
6. 高频踩坑排查:从定位思路到具体修复
6.1 坑点一:VS Code 报 "unable to locate the codex cli binary"
这是被搜索最多的一个问题,排查思路按顺序来:
- 确认 WSL 内 CLI 可用:在 WSL 终端执行
codex --version,如果不行,先解决 WSL 内的安装问题。 - 确认 VS Code 已连接 WSL:看左下角是否显示 "WSL: Ubuntu" 字样。如果在本地模式,Codex 插件找的是 Windows 本机的 CLI。
- 确认插件设置里的 CLI 路径:VS Code 的 Codex 插件设置里有一个可执行文件路径选项。设置为
bash -lc "codex"或者直接设置为 WSL 内的绝对路径,比如/usr/local/bin/codex。 - 查看插件输出日志:VS Code 的输出面板里有 Codex 相关日志,能看到插件定位 CLI 的确切命令行,从而判断路径解析问题出在哪一步。
6.2 坑点二:WSL 内codex login浏览器弹不出来
这通常是 WSL 内没有默认浏览器导致。两种解决方式:一是配置 WSL 把默认浏览器指到 Windows 的浏览器:
sudo update-alternatives --config x-www-browser选择指向/mnt/c/Program Files/.../chrome.exe的选项。二是在 WSL 里用 token 方式,把认证链接复制到 Windows 浏览器里手动打开,然后把回调地址或 token 粘贴回终端。
6.3 坑点三:npm 安装速度无法忍受
除了配置镜像源,还有一个小技巧:WSL 里 npm 安装时可以临时用--registry参数指定源,不用改全局配置:
npm install -g @openai/codex --registry=https://registry.npmmirror.com如果 node 模块安装卡在一个地方长时间不动,先 Ctrl+C 中断,然后清理缓存重试:
npm cache clean --force6.4 坑点四:WSL 网络无法访问外网
先测试基础连通性:
ping 8.8.8.8 curl -I https://www.google.com如果 ping 不通但 curl 能通,说明 DNS 解析有问题,检查/etc/resolv.conf,或者使用 114.114.114.114、8.8.8.8 这类公共 DNS。如果完全没网,大概率是防火墙、公司网络策略,或者wsl --update后内核版本和网络模块不匹配,可以执行wsl --shutdown重启 WSL 再试。
6.5 坑点五:Codex 能启动但响应极慢
优先检查项目文件是否在/mnt/c下,如果是,先把项目 migration 到 WSL 文件系统,路径转换方法见 5.1 节。这个问题不影响功能,但严重影响体验,很多时候你以为 Codex 死机了,其实是在跨文件系统慢慢爬。
7. 几条能直接复制的使用习惯
最后分享几个我实际操作下来很顺手的习惯,不涉及复杂配置,但能明显提升使用体验。
习惯一:给 WSL 设置磁盘内存上限
在.wslconfig里限制 WSL2 的磁盘和内存占用,避免 WSL 吃满 Windows 资源:
[wsl2] memory=8GB processors=4 swap=0这个配置在 Windows 内存不大、需要同时跑其他应用的机器上尤其有用。我同事的电脑 16GB 内存,默认配置下 WSL 能吃掉一半,开了这个限制后明显改善。
习惯二:为常用项目建立符号链接
如果有些项目必须放 Windows 盘(比如公司统一的代码目录),你可以在 WSL 里建一个软链接,缩短路径、方便记忆:
ln -s /mnt/c/Company/Projects ~/company-projects这样在 WSL 里通过~/company-projects就能访问,不用每次敲一长串路径。但记住前面说的性能问题,这只是方便,不是性能优化方案。
习惯三:VS Code 窗口自动记住 WSL 工作区
VS Code 的 Remote-WSL 模式支持直接打开 WSL 内的文件夹:
code ~/company-projects/my-project在 WSL 终端里执行上面命令,会直接打开一个连接到当前 WSL 的 VS Code 窗口,并且工作目录就是你指定的项目。这个操作比反复点远程连接再选文件夹快很多,我已经完全离不开了。
习惯四:定期更新 WSL 内核和 Codex CLI
WSL 内核更新:
wsl --updateCodex CLI 更新:
sudo npm update -g @openai/codex这两个更新尽量养成习惯。Codex CLI 的迭代速度很快,新版本往往修掉了旧的运行时组件兼容问题,很多莫名其妙的问题在升级后自己就消失了。我很长一段时间里懒得更新,结果每次遇到问题排查半天,后来发现一个升级解决全部,从那以后都是定期主动更新,排查效率高了不少。
最后分享一个经验:如果你哪天在 WSL 里怎么都没法解决 Codex 运行时组件的问题,不妨用排除法先跑一下wsl --version看内核版本,再到codex status看具体哪个模块报错。千万别一上来就重装 WSL 或者重装系统,那基本都是最后一招。先确认 WSL2 内核是最新的,再确认 npm 装了@openai/codex而不是其他同名包,最后看登录态是否已建立——这三个层级依次排查,95% 的问题都能定位到原因。