Notes›Articles›Codex Windows 沙箱启动失败:一次由 WSL 迁移导致的 Git 权限问题排查
ARTICLE · BLINKO

Codex Windows 沙箱启动失败:一次由 WSL 迁移导致的 Git 权限问题排查

最近我把一个原本在 WSL Ubuntu 中开发的 Git 项目迁移到了 Windows,随后遇到了一个比较隐蔽的问题:

Codex 的 Windows 沙箱无法初始化,本地命令无法正常执行,连浏览器控制也一起失效。

最开始看起来很像是 Codex 或浏览器控制本身出了问题,但最后发现,真正的根因其实是:

从 WSL 迁移到 Windows 后,项目 .git 目录的 Windows 所有权和 ACL 权限异常,导致 Codex Sandbox 无法重新配置目录权限。

这篇文章记录一下完整的定位过程和解决方法。

1. 故障现象

最早是在让 Codex 控制浏览器时遇到错误:

node_repl kernel exited unexpectedly

windows sandbox failed:
helper_unknown_error:
setup refresh had errors

重新初始化之后依旧失败:

trusted Node process exited unexpectedly

不仅浏览器控制不能使用,普通的 Codex 本地命令执行也受到影响。

这说明问题很可能并不在浏览器,而是在更底层的 Windows Sandbox 初始化阶段。

2. 从 Sandbox 日志找到真正错误

继续检查 Codex 的 Sandbox 日志:

C:\Users\<username>\.codex\.sandbox\

日志中出现了更关键的信息:

deny ACE failed
open deny ACL target for update

并且失败路径明确指向:

F:\work\mycode\.git

也就是说,Codex 在初始化 Windows Sandbox 时,尝试调整 Git 目录的 Windows ACL 权限,但无法修改 .git。

外层最终只显示了比较笼统的:

setup refresh had errors

真正的错误实际上发生在前面的 ACL 设置阶段。

3. 检查 .git 所有权

进一步检查项目目录:

Get-Acl F:\work\mycode
Get-Acl F:\work\mycode\.git

结果发现:

项目目录 Owner:
<Windows用户>

.git Owner:
CodexSandboxOffline

这明显不正常。

CodexSandboxOffline 本身并不是恶意账户,它是 Codex Windows Sandbox 使用的低权限本地账户之一。

问题在于:

项目属于当前 Windows 用户,而 .git 却被另一个 Sandbox 用户持有。

这会同时影响 Windows ACL、Git 的仓库安全检查以及 Codex Sandbox 的权限刷新。

4. 为什么会发生

这个项目之前是在 WSL Ubuntu 中开发的,后来直接迁移到了 Windows 文件系统。

Linux 与 Windows 的权限体系完全不同:

Linux 主要使用:

uid / gid
rwx

Windows 则使用:

Owner
ACL
ACE

两者并不能简单一一对应。

在 WSL 与 Windows 文件系统之间复制或移动项目时,尤其是包含 .git 这样的特殊目录,有可能最终形成异常的 NTFS Owner 或 ACL。

之后 Codex Sandbox 再尝试给 .git 设置保护权限,就触发了:

.git 权限异常
        ↓
Codex 设置 deny ACE 失败
        ↓
Sandbox refresh 失败
        ↓
Node / command runtime 无法启动
        ↓
浏览器控制一起失效

所以浏览器只是被连带影响,并不是浏览器本身坏了。

5. 普通修改 Owner 也失败

一开始尝试直接修改所有者:

icacls ".git" /setowner "$me" /T /C

结果整个 .git 都返回:

拒绝访问

包括:

.git\config
.git\HEAD
.git\index
.git\objects
.git\refs

这说明当前 Windows 用户甚至已经没有足够权限修改 .git 的 Owner。

这种情况下不能继续用普通 PowerShell,需要管理员权限。

6. 最终解决方法

首先完全退出 Codex。

然后打开:

PowerShell / Windows Terminal → 以管理员身份运行

确认当前终端具有管理员权限:

([Security.Principal.WindowsPrincipal] `
[Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
    [Security.Principal.WindowsBuiltInRole]::Administrator
)

应该返回:

True

进入仓库目录:

cd F:\work\mycode

第一步:夺回 .git 所有权

takeown /F ".git" /A /R /D Y

这会让本机 Administrators 组先接管 .git 及其子目录。

第二步:恢复当前用户权限

获取当前 Windows 用户:

$me = whoami

然后给当前用户完全控制权限:

icacls ".git" /grant:r "${me}:(OI)(CI)F" /T /C

其中:

F   = Full Control
OI  = 文件继承
CI  = 子目录继承

第三步:把 Owner 改回当前用户

icacls ".git" /setowner "$me" /T /C

最后验证:

(Get-Acl ".git").Owner

Owner 应该重新变成当前 Windows 用户。

再执行:

git status

确认 Git 仓库本身正常。

7. 修复结果

完成上述操作后重新启动 Codex。

结果:

  • Windows Sandbox 恢复正常
  • Codex 可以正常执行本地命令
  • Browser / Computer Use 恢复
  • 可以正常控制浏览器
  • Git 仓库也恢复正常

因此最终可以确认:

故障并不是 Codex 浏览器控制问题,而是 .git 目录异常的 NTFS Owner / ACL 导致整个 Codex Sandbox 初始化失败。

8. 不建议直接重置整个项目权限

排查过程中很容易想到执行:

icacls F:\work /reset /T

但不推荐这样做。

因为这会递归修改整个开发目录的 ACL,影响范围过大。

更安全的策略是:

先定位具体失败目录
        ↓
只处理 .git
        ↓
先 takeown
        ↓
恢复当前用户访问
        ↓
恢复 Owner

遵循最小修改原则,可以避免把原本正常的权限一起破坏。

9. WSL 项目迁移到 Windows 的建议

这次问题还有一个比较重要的经验:

不要直接把完整 Git 工作目录从 WSL 搬到 Windows。

特别是以下目录:

.git
.venv
node_modules
Docker Volume
PostgreSQL Data Directory

都不适合直接跨环境复制。

更推荐:

Git

WSL:

git add .
git commit
git push

Windows:

git clone ...

让 Windows 自己创建 .git。

Python

不要迁移:

.venv

在 Windows 重新创建:

python -m venv .venv
pip install -r requirements.txt

Node.js

不要复制:

node_modules

重新执行:

npm install

或者:

pnpm install

PostgreSQL

不要直接复制 PostgreSQL 数据目录。

使用:

pg_dump
pg_restore

进行迁移。

总结

这次问题表面上表现为:

Codex 无法执行命令
浏览器控制失败
Windows Sandbox 初始化失败

但真正的根因其实是:

WSL → Windows 项目迁移
        ↓
.git Owner / ACL 异常
        ↓
Codex Sandbox 无法更新 ACL
        ↓
setup refresh failed

最终通过管理员 PowerShell 执行:

takeown /F ".git" /A /R /D Y

$me = whoami

icacls ".git" /grant:r "${me}:(OI)(CI)F" /T /C

icacls ".git" /setowner "$me" /T /C

恢复 .git 的 Windows 权限后,整个 Codex Sandbox 和浏览器控制都恢复正常。

如果以后需要把开发环境从 WSL 切换到 Windows,最稳妥的原则其实很简单:

源代码可以迁移,但 Git 元数据、依赖环境和数据库数据尽量通过各自的标准方式重新生成或导入,而不是直接复制整个目录。