BY eHWRITTEN ON HALO6 MIN READ

用 PC 上的 Codex 远程开发 ARM 嵌入式 Linux

目标是让 Codex 运行在性能更强的 PC 上,但实际操作、编译和运行发生在 ARM 嵌入式 Linux 设备中。 整体结构: PC 上的 Codex -> 通过 SSH 向 ARM 发送命令 -> ARM 执行编译、测试和程序运行 -> stdout、stderr、退出码返回 PC -> Cod

目标是让 Codex 运行在性能更强的 PC 上,但实际操作、编译和运行发生在 ARM 嵌入式 Linux 设备中。

整体结构:

PC 上的 Codex
-> 通过 SSH 向 ARM 发送命令
-> ARM 执行编译、测试和程序运行
-> stdout、stderr、退出码返回 PC
-> Codex 根据结果继续修改代码

Codex 不需要真正安装在 ARM 设备上。只要 PC 能通过 SSH 控制 ARM,就可以完成大部分远程开发任务。

1. ARM 设备安装 SSH

在 ARM Linux 上执行:

sudo apt update
sudo apt install openssh-server rsync
sudo systemctl enable --now ssh

查看 ARM 的 IP 地址:

hostname -I

假设 ARM 设备信息为:

IP:192.168.1.50
用户名:user

在 PC 上测试连接:

ssh user@192.168.1.50

2. 配置免密登录

在 PC 上生成 SSH 密钥:

ssh-keygen -t ed25519

把公钥复制到 ARM:

ssh-copy-id user@192.168.1.50

之后再次连接:

ssh user@192.168.1.50

如果不再要求输入密码,说明配置成功。

可以在 PC 的 ~/.ssh/config 中添加别名:

Host arm-dev
    HostName 192.168.1.50
    User user
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 30

之后直接使用:

ssh arm-dev

3. 理解 SSH 命令和管道

下面这条命令中,管道在 ARM 上执行:

ssh arm-dev 'dmesg | grep -i error'

下面这条命令中,dmesg 在 ARM 上执行,grep 在 PC 上执行:

ssh arm-dev 'dmesg' | grep -i error

因此可以自由决定数据在哪一端处理。

SSH 会把远端程序的标准输出、错误输出和退出码返回 PC:

ssh arm-dev 'ls /not_exist'
echo $?

如果远程命令失败,SSH 通常也会返回非零退出码,Codex 可以据此判断任务是否成功。

4. 创建远程执行脚本

推荐不要让 Codex 每次拼接复杂 SSH 命令,而是在项目中准备固定脚本。

项目结构:

my_project/
├── src/
├── CMakeLists.txt
├── scripts/
│   ├── sync.sh
│   ├── build.sh
│   ├── run.sh
│   └── test.sh
└── AGENTS.md

同步代码

创建 scripts/sync.sh

#!/usr/bin/env bash
set -euo pipefail

REMOTE_HOST="arm-dev"
REMOTE_DIR="/home/user/projects/my_project"

ssh "$REMOTE_HOST" "mkdir -p '$REMOTE_DIR'"

rsync -az --delete \
    --exclude ".git/" \
    --exclude "build/" \
    ./ "$REMOTE_HOST:$REMOTE_DIR/"

远程编译

创建 scripts/build.sh

#!/usr/bin/env bash
set -euo pipefail

REMOTE_HOST="arm-dev"
REMOTE_DIR="/home/user/projects/my_project"

"$(dirname "$0")/sync.sh"

ssh "$REMOTE_HOST" "
    set -e
    cd '$REMOTE_DIR'
    cmake -S . -B build
    cmake --build build -j\$(nproc)
"

远程运行

创建 scripts/run.sh

#!/usr/bin/env bash
set -euo pipefail

REMOTE_HOST="arm-dev"
REMOTE_DIR="/home/user/projects/my_project"

ssh -t "$REMOTE_HOST" "
    cd '$REMOTE_DIR'
    ./build/my_program
"

远程测试

创建 scripts/test.sh

#!/usr/bin/env bash
set -euo pipefail

REMOTE_HOST="arm-dev"
REMOTE_DIR="/home/user/projects/my_project"

"$(dirname "$0")/build.sh"

ssh "$REMOTE_HOST" "
    cd '$REMOTE_DIR'
    ctest --test-dir build --output-on-failure
"

添加执行权限:

chmod +x scripts/*.sh

5. 配置 Codex 的项目规则

在项目根目录创建 AGENTS.md

# ARM remote development rules

This project targets an ARM64 embedded Linux device.

## Remote environment

- SSH host: arm-dev
- Remote directory: /home/user/projects/my_project
- The PC is only used for editing and orchestration.
- Final compilation and execution must happen on the ARM device.

## Required workflow

1. Modify source code locally.
2. Run `./scripts/sync.sh`.
3. Run `./scripts/build.sh`.
4. Run `./scripts/test.sh`.
5. Analyze the complete stdout, stderr and exit code.
6. Continue fixing the project until tests pass.

## Safety restrictions

- Do not run destructive commands.
- Do not modify files outside the remote project directory.
- Do not use sudo unless explicitly authorized.
- Do not reboot or power off the ARM device.

然后在 PC 项目目录中启动 Codex:

cd my_project
codex

可以直接给 Codex 下达任务:

检查并修复这个项目。所有编译和测试必须在 ARM 设备上完成。
使用 ./scripts/build.sh 编译,使用 ./scripts/test.sh 测试。
根据远程返回的完整错误输出持续修改,直到测试通过。

6. 查看远程日志

查看最近的系统日志:

ssh arm-dev 'journalctl -n 100 --no-pager'

持续查看某个服务:

ssh arm-dev 'journalctl -fu my-service'

查看内核日志:

ssh arm-dev 'dmesg | tail -n 100'

将远程日志保存到 PC:

ssh arm-dev 'journalctl -u my-service --no-pager' > service.log

7. 传输二进制文件

SSH 不只能传输文本,也可以传输二进制数据。

从 ARM 获取文件:

ssh arm-dev 'cat /tmp/frame.raw' > frame.raw

把本地固件传到 ARM:

cat firmware.bin | ssh arm-dev 'cat > /tmp/firmware.bin'

实际项目中,普通文件传输更推荐使用:

scp firmware.bin arm-dev:/tmp/

或者:

rsync -av firmware.bin arm-dev:/tmp/

8. 什么时候需要自己写服务

多数情况下,SSH 加固定脚本已经足够。

只有出现以下需求时,才有必要在 ARM 上编写额外服务:

  • 任务需要断开 SSH 后继续运行
  • 需要任务队列和任务编号
  • 需要结构化 JSON 返回
  • 需要管理多台 ARM 设备
  • 需要限制 Codex 只能执行白名单操作
  • 需要保存历史日志
  • 需要远程烧录、重启服务或控制硬件

可以设计类似接口:

POST /build
POST /run
POST /test
GET /status
GET /logs

但第一阶段不建议直接写服务。先使用:

SSH直接执行
-> SSH调用固定脚本
-> 有明确需求后再开发远程Agent服务

结论

最实用的方案是:

PC 保存源码并运行 Codex
-> rsync 同步代码
-> SSH 在 ARM 上编译和运行
-> 输出和退出码返回 PC
-> Codex继续分析和修改

从 Codex 的角度看,ARM 设备相当于一个远程命令执行后端。只要命令、文件、标准输入输出和退出码能够稳定传输,就没有必要强行在 ARM 上安装 Codex。