Codex 的沙箱配置是 sandbox = workspace-write、approval = on-request,改仓库里的普通文件也一直弹 approve。启动时还有这条报错:
Codex's Linux sandbox uses bubblewrap and needs access to create user namespaces排查过程
先看基础条件:
sysctl kernel.unprivileged_userns_clone
sysctl user.max_user_namespaces
which bwrap结果都正常:
kernel.unprivileged_userns_clone = 1user.max_user_namespaces是个大于 0 的值bwrap在/usr/bin/bwrap
条件看起来都满足,bubblewrap 也装了。但直接跑一下试试:
bwrap --ro-bind / / true报错:
bwrap: setting up uid map: Permission denied问题不在 Codex 配置,bubblewrap 本身就没跑起来。
再查 AppArmor 这边:
cat /proc/sys/kernel/apparmor_restrict_unprivileged_userns 2>/dev/null输出:
1问题根源
Codex 在 Linux 上靠 bubblewrap 实现 sandbox,bubblewrap 需要创建 user namespace。Ubuntu 默认开了这个限制:
kernel.apparmor_restrict_unprivileged_userns=1bubblewrap 被挡住,sandbox 建不起来,Codex 的行为就乱了——启动时报 user namespaces 错误,同时权限判断也变得异常保守,连 workspace 内的普通文件改动也会频繁要审批。
修复
先临时关掉验证一下:
sudo sysctl kernel.apparmor_restrict_unprivileged_userns=0
bwrap --ro-bind / / truebwrap 这次静默成功。重启 Codex,报错消失,编辑普通文件也不再弹 approve 了。
确认没问题后持久化:
printf 'kernel.apparmor_restrict_unprivileged_userns=0\n' | sudo tee /etc/sysctl.d/99-codex-userns.conf
sudo sysctl --system验证:
cat /proc/sys/kernel/apparmor_restrict_unprivileged_userns
bwrap --ro-bind / / true第一条输出 0,第二条静默,没问题。
最后
这个改动不是关闭 AppArmor,只是放开了其中一条和非特权 user namespace 相关的参数。
这是全局的,没法只对某个用户单独生效。个人开发机上这么做没什么问题;企业受管机器得结合安全基线自行判断要不要持久化。