1. 为什么要在 Luckfox 上折腾 NullClaw如果你手里有一块 Luckfox Pico Plus又想让它在本地跑一个 AI Agent而不是把数据全丢到云端那 NullClaw 是目前嵌入式圈子里最值得试的方案之一。它用 Zig 从零实现单个静态二进制只有 600 多 KB峰值内存 1MB 左右启动时间在 0.8GHz 的板子上不到 8ms零运行时依赖不需要 Node.js、Python 或 JVM。对于只有 256MB 内存的 RV1103 板子来说这个体量几乎是唯一能舒服跑起来的 AI Agent 基础设施。但问题也很直接Luckfox Pico Plus 是 ARMv7l 32 位架构而 NullClaw 官方 Release 只提供 ARM64 预编译包。你没法直接下载一个二进制扔上去就跑必须自己在 PC 上交叉编译出 ARMv7 版本。好消息是 Zig 的交叉编译体验非常顺不需要额外装一整套 ARM 工具链一条zig build -Dtargetarm-linux-musleabihf就能出静态二进制。这篇内容我会把整条链路走一遍从 Zig 0.15.2 环境准备、交叉编译 ARMv7 产物、传到板子、配置网络到用 TaoToken 统一 Key/API 通道接入模型最后给出可复制的config.toml与settings.json骨架并做一次连通性验证。目标是一次性跑通端侧部署而不是停在“编译成功”那一步。适合谁看手里有 Luckfox 或其他 ARMv7 嵌入式 Linux 板子、想跑本地 AI Agent、对交叉编译不熟但愿意照着敲命令的人。下面所有命令都可以直接复制遇到报错我在第 5 节集中排。2. TaoToken 前置统一 Key 与 API 通道在板子上直接写死某个厂商的 API Key 有个现实问题换模型、换供应商、做多模型对比时你得反复改配置、重新传文件。TaoToken 在这里的作用是提供一个统一的 Key 和 API 通道让 NullClaw 只认一个base_url和一个 Key后端接哪个模型由通道侧决定。对嵌入式设备来说少改一次配置就少一次 SCP 传文件省事很多。你需要先拿到两样东西一个 API Key以及确认接入地址。API 端点是https://taotoken.net/api注意这个地址不带任何查询参数直接作为 OpenAI 兼容的base_url使用。Key 在控制台的 API Keys 页面创建建议单独建一个给板子用的 Key方便后续按设备排查调用量。创建 Key 的入口在这里控制台 API Keyshttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite如果你还没决定用哪个模型可以先在模型对话页面手动发一条消息确认通道本身是通的再去配板子模型对话https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite接入文档里有完整的 OpenAI 兼容说明包括chat/completions的请求格式和返回结构配 NullClaw 之前扫一眼能省不少调试时间接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite有一点要提前说清楚TaoToken 在这里扮演的是统一 API 通道不是让你绕过什么限制也不是灰色中转。它的价值在于把多供应商的 Key 管理收敛成一个入口板子侧只维护一份配置。这一点在嵌入式场景里尤其重要因为每次改配置都要重新走一遍传输和权限流程。3. 可复制配置交叉编译 config.toml settings.json3.1 准备 Zig 0.15.2 并交叉编译 ARMv7NullClaw 对 Zig 版本有强制要求必须是 0.15.2其他版本大概率编译失败。先在 PC 上装好# Linux x86_64 wget https://ziglang.org/download/0.15.2/zig-linux-x86_64-0.15.2.tar.xz tar -xf zig-linux-x86_64-0.15.2.tar.xz export PATH$PWD/zig-linux-x86_64-0.15.2:$PATH # 验证必须输出 0.15.2 zig versionmacOS ARM 换对应的包名即可Windows 下载 zip 解压后加进系统 PATH。版本确认无误后克隆仓库并交叉编译git clone https://github.com/nullclaw/nullclaw.git cd nullclaw # ARMv7 musl 硬浮点适合 Cortex-A7 zig build -DoptimizeReleaseSmall -Dtargetarm-linux-musleabihf ls -lh zig-out/bin/nullclaw file zig-out/bin/nullclawfile的输出应该是ELF 32-bit LSB executable, ARM, EABI5 ... statically linked。看到statically linked就说明板子上不需要任何动态库直接扔上去就能跑。编译目标参数对照如下参数含义适用场景arm-linux-musleabihfARMv7 musl 硬浮点Cortex-A7性能更好arm-linux-musleabiARMv7 musl 软浮点兼容性更广aarch64-linux-muslARM64 musl64 位板子Luckfox Pico Plus 的 Cortex-A7 支持 NEON 和 VFPv4用musleabihf性能更优。3.2 传输到板子并赋权用 MobaXterm 或 scp 把nullclaw传到板子比如/home/pico/nullclaw/然后赋执行权限chmod x /home/pico/nullclaw/nullclaw cd /home/pico/nullclaw ./nullclaw --version能打印版本号就说明二进制架构匹配、静态链接没问题。3.3 config.toml 骨架NullClaw 支持 TOML 配置下面这份骨架把 provider 指向 TaoToken 的统一通道模型名按你实际要用的填。注意base_url用https://taotoken.net/api不要加多余路径# ~/.nullclaw/config.toml default_temperature 0.7 [models.providers.taotoken] api_key sk-你的TaoToken Key base_url https://taotoken.net/api [agents.defaults] model { primary taotoken/你的模型名 } system_prompt You are an embedded Linux assistant running on a Luckfox Pico Plus. Rules: 1. Reply only in Chinese. 2. Do not use Markdown headings, bold markers, or code blocks. 3. Do what you can; say no if you cannot. 4. Do not expose the thought process. 5. Reply concisely with results and steps only. [autonomy] level full workspace_only false max_actions_per_hour 100 require_approval_for_medium_risk false block_high_risk_commands false allowed_commands [*] allowed_paths [*] [runtime] kind native [memory] profile markdown_only backend markdown auto_save true [security.sandbox] enabled false [security.resources] max_memory_mb 512 max_cpu_time_seconds 60 max_subprocesses 10 [security.audit] enabled true log_path audit.log max_size_mb 100 [tools.shell] enabled true allowed_commands [*] allowed_paths [*] [tools.filesystem] enabled true workspace_only false allowed_paths [*] [gateway] port 3000 host 127.0.0.1 require_pairing true allow_public_bind false几个关键字段为什么这么设autonomy.level full让 Agent 不经确认直接执行操作适合端侧自动化block_high_risk_commands false是因为写/sys、控制 GPIO 这类操作容易被误判为高危allowed_paths [*]是为了让 Agent 能访问/sys/class/leds/这类系统路径。如果你更看重安全把level降到supervised并收紧allowed_paths。3.4 settings.json 骨架如果你的 NullClaw 版本走 JSON 配置用下面这份等价骨架字段名与 TOML 一一对应{ default_temperature: 0.7, models: { providers: { taotoken: { api_key: sk-你的TaoToken Key, base_url: https://taotoken.net/api } } }, agents: { defaults: { model: { primary: taotoken/你的模型名 }, system_prompt: You are an embedded Linux assistant. Reply only in Chinese. Do not use Markdown headings or code blocks. Do what you can, say no if you cannot. Do not show the thought process. Reply concisely. } }, autonomy: { level: full, workspace_only: false, max_actions_per_hour: 100, require_approval_for_medium_risk: false, block_high_risk_commands: false, allowed_commands: [*], allowed_paths: [*] }, runtime: { kind: native }, memory: { profile: markdown_only, backend: markdown, auto_save: true }, security: { sandbox: { enabled: false }, resources: { max_memory_mb: 512, max_cpu_time_seconds: 60, max_subprocesses: 10 }, audit: { enabled: true, log_path: audit.log, max_size_mb: 100 } }, tools: { shell: { enabled: true, allowed_commands: [*], allowed_paths: [*] }, filesystem: { enabled: true, workspace_only: false, allowed_paths: [*] } }, gateway: { port: 3000, host: 127.0.0.1, require_pairing: true, allow_public_bind: false } }两份配置选一份用即可不要同时存在否则容易出现字段覆盖顺序不明确的问题。改完配置后建议用./nullclaw doctor做一次自检。4. 验证请求与成功结果配置写好后先别急着上 Telegram 或网关直接用单条消息模式验证通道是否通cd /home/pico/nullclaw ./nullclaw agent -m 查看当前系统架构和内核版本如果 TaoToken 通道和 Key 都正确你会看到 Agent 返回类似armv7l和5.10.110的信息。这一步成功说明三件事二进制能跑、配置被正确读取、API 通道连通。接着验证工具调用能力让它读一下板载 LED 路径./nullclaw agent -m 列出 /sys/class/leds/ 下的目录预期能看到work之类的 LED 节点。再进一步让它尝试控制 LED./nullclaw agent -m 把 /sys/class/leds/work/brightness 写成 1然后读回来确认如果返回写入成功且读回值为 1说明 shell 工具和文件系统权限都打通了。这时候你可以进交互模式连续对话./nullclaw agent在交互模式里发一条查看系统状态观察响应延迟和内存占用。可以在另一个 SSH 窗口跑top或free -m正常情况下 NullClaw 进程 RSS 在 1MB 到几 MB 之间对 256MB 内存的板子毫无压力。如果你打算长期跑编码类或 Agent 类任务建议了解一下 Coding Plan它更适合持续性的编码和自动化场景比按次调用更划算Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite5. 本篇常见错排查编译报 Zig 版本不匹配最常见。zig version必须输出 0.15.20.14 或 0.16 都会失败。删掉旧版本重新下载对应包并确认 PATH 指向正确目录。file显示 dynamically linked说明编译目标没带 musl或者你误用了系统工具链。确认命令里是arm-linux-musleabihf而不是arm-linux-gnueabihf。前者用 musl 静态链接后者依赖 glibc 动态库。板子上运行报No such file or directory二进制架构不对或者虽然架构对但动态链接器缺失。用file再确认一次必须是 32 位 ARM 且 statically linked。API 请求返回 401 或 403Key 写错、Key 被禁用或者base_url多写了/v1。TaoToken 的接入地址就是https://taotoken.net/api不要自行拼接路径。检查配置文件里有没有多余空格或换行。请求超时或连不上先在板子上ping一下确认基础网络再确认 DNS 能解析。如果板子走 USB 网络共享注意默认 IP 段和路由是否正确。网络层不通的话任何 API 配置都白搭。Agent 能对话但执行命令失败检查tools.shell.enabled是否为 trueallowed_commands和allowed_paths是否放开了需要的范围。如果开了沙箱security.sandbox.enabled设成 false 再试确认是沙箱拦截还是权限问题。内存被 OOM kill把security.resources.max_memory_mb调到 256 以下同时确认没有开启向量搜索等重内存功能。NullClaw 本身很轻OOM 通常是配置里开了额外后端。开机自启服务起不来用journalctl -u nullclaw -f看日志。常见原因是WorkingDirectory路径写错或者ExecStart指向的二进制没有执行权限。systemd 单元里Userroot要确认存在。6. 接入后的下一步与统一入口端侧跑通只是第一步。接下来你可以把 NullClaw 的 gateway 模式打开让它常驻后台配合 Telegram 或其他频道做远程控制也可以把config.toml里的模型换成更适合代码或更适合中文对话的版本通过 TaoToken 通道切换时只改一个模型名不用动 Key 和地址。如果你要接 Claude Code 这类编码工具Anthropic 兼容入口在这里配置方式和本文的 OpenAI 兼容通道类似都是统一 Key 加统一地址ClaudeCodeAnthropichttps://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite需要新建或轮换 Key 的时候回到控制台API Keyshttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite整个链路里我踩过的坑基本都写在上面了最耗时间的其实不是编译而是网络和权限这两块。交叉编译只要 Zig 版本对基本一次过真正卡人的是板子网络不通、或者 Agent 有权限读文件但写不了/sys。建议你按第 4 节的顺序一步步验证每步都确认结果再往下走比一次性配完再排查要快得多。
