1. 为什么要把 Codex 装到 /data 挂载点
Codex CLI 是 OpenAI 推出的命令行编码代理工具,能在终端里直接读写项目文件、执行命令、跑测试,适合习惯在 Linux 服务器上做开发的工程师。它默认通过 npm 全局安装,配置和缓存都落在用户主目录~/.codex下。问题在于,很多云主机(尤其是 Oracle Cloud Always Free 那类小盘实例)系统盘只有几十 GB,Node.js 全局包、npm 缓存、Codex 的会话历史一起堆上去,很快就告急。这时候如果机器上挂了一块独立磁盘到/data,把 Codex 的安装路径、Node 运行时、配置目录全部迁过去,是最省心的做法。
这篇聚焦的场景很具体:Linux 新磁盘挂载点/data上部署 Codex,从挂载点权限、目录规划到安装路径选择,重点演示怎么把auth.json的 endpoint 与鉴权配置改到 TaoToken 统一 Key/API 通道。适合手里有一台小盘 VPS、想把开发环境数据盘化的读者。核心检索词就是 codex、磁盘挂载点、安装,下面每一步都给可复制的命令和配置片段。
先说清楚一个前提:Codex 的鉴权有两种方式,一种是 ChatGPT 账号登录,一种是 API key。如果你走 API key 路线,就需要一个稳定的 API 通道。TaoToken 提供统一的 Key 和 endpoint,把 Codex 的auth.json指过去,就能用同一套凭证管理多个模型调用。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api ,后面配置里会反复用到。
目录规划上,我建议把四类东西都放到/data下:Node 运行时放/data/nvm,npm 全局包放/data/npm-global,Codex 配置放/data/codex-config,项目代码放/data/projects。这样系统盘只保留系统本身,数据盘承担所有开发负载。下面从挂载点检查开始,一步步走完。
2. 挂载点权限与目录规划:codex 安装前的磁盘准备
第一步永远是确认/data真的挂上了,而且挂载参数允许执行二进制。很多云厂商默认挂载会带noexec,这会导致 Codex 装完却跑不起来,报Permission denied。先看挂载状态:
df -h /data mount | grep ' /data ' || true如果mount输出里出现noexec,需要重新挂载成可执行:
sudo mount -o remount,exec /data想永久生效,得改/etc/fstab,把对应行的defaults换成defaults,exec,否则重启后又变回去。这一步踩过的坑最多,因为报错信息不会直接告诉你noexec,只会说命令找不到或无法执行。
接着处理权限。新挂载的磁盘通常归 root 所有,普通用户写不进去。把所有权交给自己:
sudo chown -R "$USER:$USER" /data chmod 755 /data然后建好目录骨架。我习惯一次性把后面要用的目录都建出来,省得来回补:
mkdir -p /data/nvm mkdir -p /data/npm-global mkdir -p /data/codex-config mkdir -p /data/projects目录职责对照如下,方便你按需调整:
| 目录 | 用途 | 对应环境变量 |
|---|---|---|
| /data/nvm | Node 版本管理器与 Node 运行时 | NVM_DIR |
| /data/npm-global | npm 全局包与 codex 可执行文件 | npm prefix / PATH |
| /data/codex-config | Codex 配置、auth.json、会话历史 | 软链到 ~/.codex |
| /data/projects | 你的项目代码 | 无 |
安装基础依赖。Debian/Ubuntu 系和 RHEL/Oracle Linux 系命令不同,按你的发行版选一组:
# Ubuntu / Debian sudo apt update sudo apt install -y curl git tar gzip unzip xz-utils ca-certificates bubblewrap # Oracle Linux / RHEL sudo dnf update -y sudo dnf install -y curl git tar gzip unzip xz which ca-certificates bubblewrap这里特意把bubblewrap一起装了。Codex 在 Linux 下用 bubblewrap(命令名bwrap)做沙箱隔离,涉及 namespace 权限,用发行版包安装最稳,别自己编译。装完验证一下:
which bwrap bwrap --version正常应该输出/usr/bin/bwrap和版本号。到这一步,磁盘和依赖就绪,可以开始装 Node 了。
3. 把 Node 与 Codex 装进 /data:auth.json 配置到 TaoToken
Node 用 nvm 装到/data/nvm,避免污染系统盘。先设环境变量再跑官方安装脚本:
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,安装脚本会识别这个变量,把 nvm 核心代码克隆到/data/nvm而不是默认的~/.nvm。让当前 shell 立即生效:
export NVM_DIR=/data/nvm [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"装 LTS 版 Node 并确认:
nvm install --lts nvm use --lts node -v npm -v把 npm 全局包目录也挪到/data,这样codex可执行文件就落在数据盘:
mkdir -p /data/npm-global npm config set prefix /data/npm-global export PATH=/data/npm-global/bin:$PATH写入~/.bashrc让新终端自动加载:
cat >> ~/.bashrc <<'EOF' # Node.js via nvm under /data export NVM_DIR=/data/nvm [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # npm global binaries under /data export PATH=/data/npm-global/bin:$PATH EOF现在安装 Codex CLI:
npm install -g @openai/codex which codex codex --versionwhich codex应该显示/data/npm-global/bin/codex,说明装到了数据盘。接下来是重点:把 Codex 配置目录软链到/data,并写auth.json指向 TaoToken。
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 ls -ld ~/.codexauth.json放在~/.codex/auth.json(实际指向/data/codex-config/auth.json)。下面这段是接入 TaoToken 的关键配置,把 endpoint 和 key 都指过去:
{ "OPENAI_API_KEY": "你的_TaoToken_Key", "OPENAI_BASE_URL": "https://taotoken.net/api", "model": "gpt-5-codex" }如果你更习惯用环境变量而不是写进文件,也可以在~/.bashrc里加:
cat >> ~/.bashrc <<'EOF' # TaoToken unified API channel for Codex export OPENAI_API_KEY="你的_TaoToken_Key" export OPENAI_BASE_URL="https://taotoken.net/api" EOF export OPENAI_API_KEY="你的_TaoToken_Key" export OPENAI_BASE_URL="https://taotoken.net/api"三件套要记牢:Base URL 填https://taotoken.net/api,Key 填你在控制台生成的 TaoToken Key,Model ID 填你要用的模型名(比如gpt-5-codex)。这三个值缺一不可,后面排障也围绕它们展开。Key 的获取入口在 https://taotoken.net/api-keys ,接入文档在 https://taotoken.net/doc 。
4. 验证请求:确认 Codex 在新挂载点正常读写与鉴权
配置写完,先验证 bubblewrap 沙箱能不能跑,这是 Codex 执行命令的前提:
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'成功会输出bwrap OK加一行内核信息。如果这里就报 namespace 错误,先看第 5 节的排障。
接着进项目目录测试 Codex。不建议在$HOME根目录直接跑,容易让它扫描一堆无关文件:
mkdir -p /data/projects/test-codex cd /data/projects/test-codex codex exec "创建一个 hello.py,运行后打印 hello from codex"codex exec是非交互模式,适合脚本化验证。如果鉴权和 endpoint 都配对了,它会调用模型、生成文件、执行命令,最后把结果打印出来。你也可以直接进交互模式:
codex首次运行如果提示登录,选择 API key 方式,它会读取auth.json或环境变量里的OPENAI_API_KEY和OPENAI_BASE_URL。验证配置是否被正确读取:
cat ~/.codex/auth.json echo "$OPENAI_BASE_URL"确认OPENAI_BASE_URL是https://taotoken.net/api,没有多余斜杠或拼写错误。再确认 Codex 的读写落在数据盘:
ls -la /data/codex-config/ du -sh /data/codex-config/会话历史和配置应该都在这里增长,而不是在系统盘的~/.codex。如果~/.codex是个软链,ls -ld ~/.codex会显示指向/data/codex-config。到这一步,安装、鉴权、读写三项都验证完毕。
5. 常见报错排查:401、local proxy failed 与 bwrap 权限
排障先记住三件套的检查顺序:Base URL、Key、Model ID。下面按真实报错逐条对照。
401 Unauthorized:最常见。先确认 Key 没写错、没过期:
echo "$OPENAI_API_KEY" cat ~/.codex/auth.json如果 Key 正确但仍 401,检查OPENAI_BASE_URL是不是https://taotoken.net/api,末尾不要带/v1或多余斜杠。有些工具会自动拼/v1/chat/completions,Base URL 写错就会 401 或 404。重新生成 Key 的入口在 https://taotoken.net/api-keys 。
local proxy failed / connection refused:通常是 endpoint 不可达或本地网络配置问题。先直接测连通性:
curl -sS -o /dev/null -w "%{http_code}\n" https://taotoken.net/api返回 401 或 200 都说明网络通,返回 000 说明连不上。检查是否有本地代理环境变量干扰:
env | grep -i proxy如果有HTTP_PROXY、HTTPS_PROXY指向一个已经关掉的本地端口,就会报 local proxy failed。临时清掉:
unset HTTP_PROXY HTTPS_PROXY http_proxy https_proxyreading choices 相关报错:一般是响应体不是预期的 JSON 结构,多半是 Base URL 指到了错误路径,或者 Model ID 写了个不存在的模型。确认model字段填的是 TaoToken 支持的模型名,别照抄别家的名字。
bwrap user namespace / permission 错误:先查内核参数:
sysctl user.max_user_namespaces 2>/dev/null || true如果是 0,开启它:
echo 'user.max_user_namespaces=15000' | sudo tee /etc/sysctl.d/99-userns.conf sudo sysctl --system bwrap --dev-bind / / truecodex: command not found:PATH 没生效。执行:
source ~/.bashrc export PATH=/data/npm-global/bin:$PATH which codexnpm install 权限错误:确认 prefix 指向/data/npm-global:
npm config get prefix npm config set prefix /data/npm-global export PATH=/data/npm-global/bin:$PATH npm install -g @openai/codex小内存实例 npm 安装慢或失败:Oracle 免费实例内存小,编译或下载容易 OOM。临时加 swap:
sudo fallocate -l 1G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile free -h永久启用写进 fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabOAuth 登录卡住:如果你选了 ChatGPT 账号登录而不是 API key,浏览器回调可能因为服务器无图形界面而失败。这种场景直接改用 API key 方式,把auth.json配成 TaoToken 通道更省事,也便于统一管理。
6. 长期编码与 Agent 场景的接入建议
把 Codex 装到/data只是第一步,真正长期跑编码任务或 Agent 工作流,还要考虑几个点。第一是配置的持久性:~/.codex软链到/data/codex-config后,重装系统或换实例只要重新挂载数据盘、重建软链,配置和会话历史都还在。第二是 Key 的管理:如果你同时用多个工具(Codex、Cline、Claude Code 等),统一走 TaoToken 的 Key 和 endpoint,能省去到处配凭证的麻烦,Base URL 都是https://taotoken.net/api,Model ID 按工具要求填。
对于需要长时间运行的编码任务,建议用 Coding Plan 而不是按次调用,成本更可控,入口在 https://taotoken.net/coding-plan 。如果你只是想先验证模型对话效果,可以用模型对话页面快速试:https://taotoken.net/chat 。控制台在 https://taotoken.net/console ,接入文档在 https://taotoken.net/doc ,API Keys 管理在 https://taotoken.net/api-keys 。
最后给一个最小命令汇总,如果你已经有/data且权限正常,可以直接跑这组把环境搭起来:
sudo mkdir -p /data sudo chown -R "$USER:$USER" /data 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 mkdir -p /data/codex-config ln -sfn /data/codex-config ~/.codex codex --version bwrap --versionUbuntu 镜像把dnf那行换成sudo apt update && sudo apt install -y curl git tar gzip unzip xz-utils ca-certificates bubblewrap即可。装完记得把auth.json里的OPENAI_BASE_URL写成https://taotoken.net/api,Key 用 TaoToken 控制台生成的,Model ID 按需填。这样一套下来,Codex 在新挂载点下读写和鉴权都能正常工作,系统盘也不会被撑爆。