青蛙小白
博客 / 2026/04

AppArmor 限制 user namespace 导致 Codex sandbox 失效及修复

2026/04/23 · — 字 · 阅读约 — 分钟 ·
目录

Codex 的沙箱配置是 sandbox = workspace-writeapproval = 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 = 1
  • user.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=1

bubblewrap 被挡住,sandbox 建不起来,Codex 的行为就乱了——启动时报 user namespaces 错误,同时权限判断也变得异常保守,连 workspace 内的普通文件改动也会频繁要审批。

修复

先临时关掉验证一下:

sudo sysctl kernel.apparmor_restrict_unprivileged_userns=0
bwrap --ro-bind / / true

bwrap 这次静默成功。重启 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 相关的参数。

这是全局的,没法只对某个用户单独生效。个人开发机上这么做没什么问题;企业受管机器得结合安全基线自行判断要不要持久化。

参考

TAGS # codex
评论