实例是 Oracle Cloud Always Free VM.Standard.E2.1.Micro + Linux , /data 目录。
Codex CLI 官方支持用 npm 安装:npm i -g @openai/codex,首次运行需要登录 ChatGPT 或配置 API key;
建议:Codex 安装到
/data;bubblewrap 用系统包安装到/usr/bin/bwrap。因为 bubblewrap 涉及 Linux namespace / sandbox 权限,用发行版包最稳。
0. 检查 /data
df -h /data
mount | grep ' /data ' || true
更改权限
```bash
sudo chown -R "$USER:$USER" /data
chmod 755 /data
如果看到 /data 挂载参数里有 noexec,Codex 二进制可能无法执行,需要改成可执行挂载:
bash
sudo mount -o remount,exec /data
1. 安装基础依赖
Ubuntu / Debian 系
bash
sudo apt update
sudo apt install -y curl git tar gzip unzip xz-utils ca-certificates
2. 把 Node.js 装到 /data
Codex CLI 可通过 npm 全局安装;npm 包会安装 @openai/codex 并提供 codex 命令。 [developers...openai.com], [npmjs.com]
这里用 nvm 安装 Node.js 到 /data/.nvm,避免占用系统盘。
a,
bash
#设置一个名为 NVM_DIR 的环境变量。
export NVM_DIR=/data/nvm
mkdir -p "$NVM_DIR"
# "| bash":通过"管道"把下载的内容直接交给 Bash 解释器去运行。
# ? 这个脚本下载在当前目录吗?不是 .nvm 文件夹
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
其中,curl -o .../install.sh |bash 是 NVM 官方提供的标准安装脚本执行命令。
它的流程如下:
- 下载脚本:curl 会从 GitHub 的官方仓库地址下载 install.sh 安装脚本.
- 通过管道传递:中间的竖线符号 | 会将下载好的脚本内容直接"喂"给 bash 解释器。
- 自动执行安装:bash 会立即运行这些脚本内容,完成以下操作:
- 将 NVM 的核心源代码克隆(git clone)到你的 NVM_DIR 目录中。[2, 3]
- 尝试自动在你的配置文件(如 ~/.bashrc 或 ~/.zshrc)中添加加载 NVM 的环境变量代码。
因为在这条命令之前已经执行了 export NVM_DIR=/data/.nvm,
所以这个 install.sh 脚本在运行时会聪明地识别出这个变量,
并放弃默认的 ~/.nvm 路径,直接把所有东西安装到你指定的 /data/.nvm 下。
b,
让当前 shell 生效:
bash
export NVM_DIR=/data/nvm
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
这是用于在 Shell 环境中加载 NVM(Node Version Manager)的配置代码。它通常出现在 .bashrc、.zshrc 或脚本开头。
可以把它拆解成三个部分来理解:
aa. export NVM_DIR=/data/.nvm
- 作用:设置一个名为 NVM_DIR 的环境变量。
- 含义:告诉系统 NVM 的程序和管理的所有 Node.js 版本都存放在 /data/.nvm 这个目录下。
- 注意:默认通常是 $HOME/.nvm,这里显式指定到了 /data/.nvm(可能是为了节省系统盘空间或统一数据存放)。
bb. [ -s "$NVM_DIR/nvm.sh" ]
- 作用:这是一个条件判断。
- 含义:检查 $NVM_DIR/nvm.sh 这个文件是否存在,且其文件大小大于 0(即不是空文件)。
- 目的:确保 NVM 的核心脚本文件是有效的,避免后面执行时报错。
cc. && . "$NVM_DIR/nvm.sh"
- &&:逻辑"与"。只有当前面的判断(文件存在且非空)为真时,才会执行后面的命令。
- .:(\在这里是取消.在shell下的alias,因为很少人改.的意思,所以这里不加\也行)这是 source 命令的简写。前面的反斜杠 \ 是为了防止别名(alias)干扰,确保执行的是原生的 Shell 命令。
- 含义:运行(加载)nvm.sh 脚本。加载后,你的终端才能识别 nvm 这个命令,从而可以切换 Node 版本。
dd, 通俗总结
这段代码的意思是:
"先把 NVM 的家目录定在 /data/.nvm;如果发现这个目录里确实有 NVM 的启动脚本,就立刻运行它。"
执行完这一行后,你就可以在终端里愉快地使用 nvm install 或 nvm use 了。
c,
安装 Node.js LTS:
bash
nvm install --lts
nvm use --lts
node -v
npm -v
写入 ~/.bashrc:
bash
cat >> ~/.bashrc <<'EOF'
# Node.js via nvm under /data
export NVM_DIR=/data/nvm
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
EOF
3. 把 npm 全局包目录放到 /data
bash
mkdir -p /data/npm-global
npm config set prefix /data/npm-global
写入 PATH:
bash
cat >> ~/.bashrc <<'EOF'
# npm global binaries under /data
export PATH=/data/npm-global/bin:$PATH
EOF
export PATH=/data/npm-global/bin:$PATH
确认:
bash
npm config get prefix
echo "$PATH"
4. 安装 Codex CLI 到 /data
bash
npm install -g @openai/codex
验证:
bash
which codex
codex --version
正常情况下应该显示类似:
bash
/data/npm-global/bin/codex
运行:
bash
codex
首次运行会提示登录;官方文档说明可用 ChatGPT 账号登录,或使用 API key。 [developers...openai.com], [npmjs.com]
如果你想用 API key:
bash
cat >> ~/.bashrc <<'EOF'
# OpenAI API key for Codex
export OPENAI_API_KEY="你的_API_KEY"
EOF
export OPENAI_API_KEY="你的_API_KEY"
5. 把 Codex 配置也放到 /data,可选但推荐
Codex 默认配置一般在 ~/.codex。如果你的系统盘很小,可以软链到 /data:
bash
mkdir -p /data/codex-config
if [ -d ~/.codex ] && [ ! -L ~/.codex ]; then
mv ~/.codex /data/codex-config/home-codex-backup
fi
ln -sfn /data/codex-config ~/.codex
验证:
bash
ls -ld ~/.codex
6. 安装 bubblewrap
Bubblewrap 是 Linux 下常用的低层 sandbox 工具,命令通常是 bwrap;Oracle Linux 8 的官方 BaseOS 仓库提供 bubblewrap 包,安装后会有 /usr/bin/bwrap。 [github.com], [oraclelinux.pkgs.org]
Oracle Linux / RHEL 系
bash
sudo dnf install -y bubblewrap
验证:
bash
which bwrap
bwrap --version
Ubuntu / Debian 系
bash
sudo apt install -y bubblewrap
验证:
bash
which bwrap
bwrap --version
7. 测试 bubblewrap 是否可用
bash
bwrap \
--ro-bind /usr /usr \
--symlink usr/bin /bin \
--symlink usr/lib64 /lib64 \
--proc /proc \
--dev /dev \
--tmpfs /tmp \
--unshare-pid \
bash -lc 'echo "bwrap OK"; uname -a'
如果成功,会输出:
text
bwrap OK
Linux ...
8. 测试 Codex
进入一个项目目录,不建议直接在 $HOME 根目录运行:
bash
mkdir -p /data/projects/test-codex
cd /data/projects/test-codex
codex
或者非交互测试:
bash
codex exec "创建一个 hello.py,运行后打印 hello from codex"
9. 如果你强制想把 bubblewrap 也编译到 /data
一般不推荐,系统包更安全稳定。但如果你确实想放到 /data/local/bin/bwrap,可以这样做。Bubblewrap 官方源码使用 Meson 构建系统,也可以从源码安装。 [github.com], [deepwiki.com]
Oracle Linux / RHEL 系依赖
bash
sudo dnf install -y git gcc meson ninja-build pkgconf-pkg-config libcap-devel libselinux-devel
编译安装到 /data/local
bash
mkdir -p /data/src /data/local
cd /data/src
git clone https://github.com/containers/bubblewrap.git
cd bubblewrap
meson setup build --prefix=/data/local
meson compile -C build
meson install -C build
加入 PATH:
bash
cat >> ~/.bashrc <<'EOF'
# local binaries under /data
export PATH=/data/local/bin:$PATH
EOF
export PATH=/data/local/bin:$PATH
验证:
bash
which bwrap
bwrap --version
如果 Codex 或其他程序只找 /usr/bin/bwrap,可以建软链:
bash
sudo ln -sf /data/local/bin/bwrap /usr/local/bin/bwrap
10. 常见问题
1)codex: command not found
执行:
bash
source ~/.bashrc
export PATH=/data/npm-global/bin:$PATH
which codex
2)npm install -g @openai/codex 权限错误
确认 npm prefix:
bash
npm config get prefix
如果不是 /data/npm-global:
bash
npm config set prefix /data/npm-global
export PATH=/data/npm-global/bin:$PATH
npm install -g @openai/codex
3)bwrap 报 user namespace / permission 错误
先检查:
bash
sysctl user.max_user_namespaces 2>/dev/null || true
如果是 0,尝试:
bash
echo 'user.max_user_namespaces=15000' | sudo tee /etc/sysctl.d/99-userns.conf
sudo sysctl --system
然后重新测试:
bash
bwrap --dev-bind / / true
4)Oracle 免费小鸡内存小,npm 安装慢或失败
可以临时加 swap:
bash
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
free -h
永久启用:
bash
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
最小命令汇总版
如果你已经有 /data,直接跑这组:
bash
sudo mkdir -p /data
sudo chown -R "$USER:$USER" /data
sudo dnf update -y
sudo dnf install -y curl git tar gzip unzip xz which ca-certificates bubblewrap
export NVM_DIR=/data/nvm
mkdir -p "$NVM_DIR"
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
export NVM_DIR=/data/nvm
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
nvm install --lts
nvm use --lts
mkdir -p /data/npm-global
npm config set prefix /data/npm-global
export PATH=/data/npm-global/bin:$PATH
npm install -g @openai/codex
cat >> ~/.bashrc <<'EOF'
export NVM_DIR=/data/nvm
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
export PATH=/data/npm-global/bin:$PATH
EOF
codex --version
bwrap --version
如果实例是 Ubuntu 镜像 ,把 dnf 那行换成:
bash
sudo apt update
sudo apt install -y curl git tar gzip unzip xz-utils ca-certificates bubblewrap