本帖最后由 CacheRivulet 于 2026-2-19 21:00 编辑
OpenWrt 交叉编译 mongoose-web-server实战记录
背景
本次实验的主要目标是测试 OpenCode 配合 MiniMax2.5 模型的代理能力。通过让 AI 自主完成一个完整的嵌入式开发任务——在 OpenWrt 路由器上交叉编译并部署 Web 服务器,来验证其远程操作、多步骤任务处理和问题排查能力。
测试项目:https://github.com/createskyblue/mongoose-web-server-demo
用户预先创建了 MEMORY.md 文件,其中包含了:
- 远程编译服务器的 SSH 连接信息(IP、端口、用户名、密码)
- 开发板的 SSH 连接信息
- 使用 sudo 时需要通过管道注入密码的注意事项
AI 需要首先读取记忆文件获取环境信息,然后自主完成交叉编译环境搭建、代码编译、部署调试等全流程工作。
人类领航员角色
本次实验的核心价值不仅在于验证 AI 的能力,更在于展示如何有效地使用 AI 作为生产力工具。
在整个任务过程中,用户(人类领航员)扮演了以下关键角色:
- 任务规划者:在开始前创建 MEMORY.md,预先准备好所有必要的连接信息、注意事项和任务目标
- 环境准备者:提前准备好编译服务器(虚拟机)和开发板,确保网络可达
- 审批者:每次 AI 提交执行的指令都需要用户手动批准,确保操作安全可控
- 方向引导者:当 AI 遇到困难或走错方向时,及时给予提示(如:引导使用 agent-browser 工具解决网络问题)
- 质量把控者:监控任务进展,在关键节点进行验证(如检查编译结果、测试服务运行)
- 终点把舵者:任务完成后,引导 AI 编写完整的项目文档和复盘总结
这类似于自动驾驶中的 L2/L3 级别辅助驾驶——人可以离开方向盘,但必须时刻监视路面,随时准备接管。AI 负责执行具体的操作步骤,而人类负责确认方向是否正确。
介入统计:整个任务中,人类仅在以下时机介入:
- 工具链下载失败时,引导使用本地浏览器工具
- 资源文件路径错误时,指出需要修正
- 任务完成后,引导生成项目文档
测试日志
以下是用户在测试过程中的时间记录:
- 00:00 - 开始测试 AI 智能体独立安装 OpenWrt 交叉编译工具链
- 00:07 - AI 成功完成任务,耗时 不到7分钟
- 00:07 ~ 00:10 - 完成 mongoose-web-server-demo 的交叉编译,耗时 不到3分钟
- 00:50 - 开发板准备就绪,开始部署
- 00:55 - 部署完成(程序运行成功),但忘记复制前端资源文件
- 01:03 - 修复资源文件问题,人工介入修正路径,最终成功
一、环境准备1.1 远程编译服务器(虚拟机)- IP: ***.***.***.205
- SSH端口: ****
- 用户: mint
- 密码: 123456
- 系统: Linux Mint 22.3 (Ubuntu 24.04)
- 内核: 6.14.0-37-generic
- 内存: 7.7GB
- 架构: x86_64
1.2 开发板信息(测试/开发用途)- 设备: Xiaomi Mini (MT7620A)
- IP: 192.168.31.14
- 系统: OpenWrt 6.6.73
- 架构: mipsel (MIPS)
- libc: musl
二、交叉编译环境搭建2.1 下载工具链
目标是为 MT7620A 芯片编译程序,该芯片属于 ramips/mt7620 系列。
网络问题:
由于编译服务器 global internet 网络环境不佳,AI 多次尝试从 OpenWrt 官网下载工具链均失败。最终在用户的引导下,使用本地电脑的 agent-browser 工具(有网络加速器)访问 OpenWrt 官网,成功找到了 24.10.0 版本的可下载链接:
https://downloads.openwrt.org/re ... inux-x86_64.tar.zst
2.2 安装步骤
# 创建目录并下载工具链
sudo mkdir -p /opt
cd /opt
wget https://downloads.openwrt.org/re ... inux-x86_64.tar.zst
# 解压
tar -xf openwrt-toolchain-24.10.0-ramips-mt7620_gcc-13.3.0_musl.Linux-x86_64.tar.zst
2.3 配置环境变量
export PATH=/opt/openwrt-toolchain-24.10.0-ramips-mt7620_gcc-13.3.0_musl.Linux-x86_64/toolchain-mipsel_24kc_gcc-13.3.0_musl/bin PATH
验证安装成功:
mipsel-openwrt-linux-gcc --version
# 输出: mipsel-openwrt-linux-musl-gcc.bin (OpenWrt GCC 13.3.0) 13.3.0
三、编译项目3.1 克隆源码
cd /tmp
git clone https://github.com/createskyblue/mongoose-web-server-demo.git
3.2 首次编译(动态链接)
cd mongoose-web-server-demo
cmake -B build -DCMAKE_C_COMPILER=mipsel-openwrt-linux-gcc
cmake --build build
编译成功,但后续部署时发现问题。
3.3 构建前端资源
cd public
npm install
npm run build
生成的文件在 public/dist 目录。
四、部署与调试
4.1 文件传输
由于开发板只能从内网访问,需要通过跳板机中转:
# 从编译服务器下载到本地
scp -P 6626 mint@***.***.***.205:/tmp/mongoose-web-server-demo/build/mongoose-web-server ./
# 上传到开发板
scp mongoose-web-server root@192.168.31.14:/tmp/
4.2 第一个坑:动态链接失败
第一次编译的程序是动态链接的:
ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked,
interpreter /lib/ld-uClibc.so.0
上传到开发板后运行报错:
ash: /tmp/mongoose-web-server: not found
4.3 解决:静态编译
问题根源是开发板使用 musl libc,而编译时链接了 uClibc。解决方案是使用静态链接:
cmake -B build -DCMAKE_C_COMPILER=mipsel-openwrt-linux-gcc \
-DCMAKE_C_FLAGS="-static -O2"
cmake --build build
静态编译后验证:
ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), statically linked
4.4 第二个坑:资源文件路径
程序代码中指定静态资源路径为 public/dist,需要将构建好的前端资源上传到开发板的正确位置:
# 创建项目目录
mkdir -p /tmp/app
# 上传程序和资源
mv mongoose-web-server /tmp/app/
mkdir -p /tmp/app/public
# 上传 dist 目录内容到 /tmp/app/public/dist/
4.5 启动服务
[C] 纯文本查看 复制代码 cd /tmp/app
./mongoose-web-server & 验证服务运行:
[C] 纯文本查看 复制代码 netstat -tlnp | grep 8000
# tcp 0.0.0.0:8000 LISTEN 访问 http://192.168.31.14:8000 即可看到 Web 界面。
五、总结
5.1 关键点- 工具链选择:MT7620A 对应 ramips/mt7620 目标,OpenWrt 24.10.0 提供了预编译工具链
- 静态链接:OpenWrt 路由器通常使用 musl libc,必须静态编译才能直接运行
- 路径注意:Web 服务器的静态资源路径要与程序中的配置匹配(public/dist)
- 文件传输:开发板在内网,需要通过跳板机或本地中转
5.2 最终目录结构
六、相关命令速查
[C] 纯文本查看 复制代码 # 编译命令
export PATH=/opt/openwrt-toolchain-24.10.0-ramips-mt7620_gcc-13.3.0_musl.Linux-x86_64/toolchain-mipsel_24kc_gcc-13.3.0_musl/bin:$PATH
cmake -B build -DCMAKE_C_COMPILER=mipsel-openwrt-linux-gcc -DCMAKE_C_FLAGS="-static -O2"
cmake --build build
# 开发板操作
ssh [url=mailto:root@192.168.31.14]root@192.168.31.14[/url]
cd /tmp/app
./mongoose-web-server &
*2026年2月19日 UTC+8* 本文档由用户在任务完成后,引导 AI 编写完成。记录了完整的实验过程、踩坑经历和解决方案,可作为 OpenWrt 交叉编译入门的参考资料,也可作为展示 AI 代理能力的实践案例。
|