一、简介:为什么 AI 边缘盒必须双分区 OTA?

  • 场景:工业视觉质检、车载摄像头、智慧路灯网关,现场 7×24 h 运行,不能停机。

  • 痛点

    • 传统单分区 dd 写镜像,断电必变砖,出差成本 > 2 万元/次。

    • AI 模型 200 MB,TFTP 传输 70% 概率掉包,启动后缺少校验直接 SIGSEGV。

  • 方案:A/B 双分区 + RAUC/SWUpdate,升级过程“0 停机”,失败自动回滚,满足 IEC 61508 对“安全更新”的 SIL 2 要求。

  • 价值:掌握后可在任何嵌入式 Linux 平台(Yocto、Buildroot、OpenWrt)落地,产品溢价 20%,售后工单下降 60%。


二、核心概念:5 个关键词速览

关键词 一句话 本文对应
A/B 分区 两份 identical rootfs / model,一份运行,一份升级 分区表 & 脚本
RAUC 开源嵌入式更新框架,支持签名、回滚、流式升级 主方案
Bundle RAUC 升级包 = 镜像 + 描述文件 + 签名 .raucb
Bootloader 环境变量 告诉 U-Boot 下一次启动谁 bootpart
原子性 写成功→切换;写失败→继续原分区 RAUC 保证

三、环境准备:10 分钟搭好“OTA 实验室”

1. 硬件

  • Raspberry Pi 4B(4 GB)或 RK3568 开发板 ≥1 块

  • SD 卡 ≥32 GB(模拟大容量 AI 模型)

2. 软件

组件 版本 一键安装
Yocto kirkstone 4.0 下文 repo 脚本
RAUC 1.10 已集成到 meta-rauc
U-Boot 2023.07 支持 bootcount
交叉工具链 aarch64-linux-gnu apt 安装

3. 一键拉取 Yocto + RAUC 层

mkdir ~/ota-lab && cd ~/ota-lab
repo init -u https://github.com/rauc/meta-rauc-community -b kirkstone -m rpi64.xml
repo sync

4. 创建双分区 A/B 描述

编辑 wic/rpi-sd-a-b.wks

part /boot --source bootimg-partition --ondisk mmcblk0 --label boot --active --align 4 --fixed-size 128
part / --source rootfs --ondisk mmcblk0 --label root_a --align 4 --fixed-size 1500
part / --source rootfs --ondisk mmcblk0 --label root_b --align 4 --fixed-size 1500

四、应用场景 300 字:AI 视觉质检盒实例

某饮料厂灌装线,每台设备搭载 RK3568 + 4 TOPS NPU,运行 YOLOv5 检测瓶身缺陷。

  • 模型迭代周期 2 周,传统人工升级需停机 15 min,产线损失 3000 元。

  • 采用本文双分区方案:
    ① 夜班低峰期后台下载 .raucb(含 rootfs + 200 MB 模型)。
    ② RAUC 校验签名 → 写入 B 分区 → 重启 → 新模型 3 s 启动。
    ③ 若 NPU 加载失败 → bootcount 增加 → U-Boot 自动回滚到 A 分区,现场人员零干预。
    实施后升级停机时间降为 8 s,0 次返厂,客户满意度 +30%。


五、实际案例与步骤:0→1 落地 RAUC 双分区 OTA

5.1 配置 RAUC 系统证书

mkdir -p keys/private
rauc-keygen --key keys/private/rauc.key  --cert keys/rauc.cert

5.2 添加 RAUC 到镜像

conf/local.conf

IMAGE_INSTALL:append = " rauc"
RAUC_KEY_FILE = "${TOPDIR}/keys/private/rauc.key"
RAUC_CERT_FILE = "${TOPDIR}/keys/rauc.cert"

5.3 构建 A/B 镜像

bitbake core-image-minimal
# 生成 rootfs_a.ext4  rootfs_b.ext4

5.4 制作 Bundle(含 AI 模型)

编辑 bundle.raucm

[update]
compatible= raspberry-pi4-64
version= 1.2.0

[image.rootfs]
sha256= 8f8c8f8f...
filename= rootfs_b.ext4

[image.model]
sha256= 12345678...
filename= yolov5n.rknn

生成升级包:

rauc bundle --cert keys/rauc.cert --key keys/private/rauc.key bundle.raucm update-1.2.0.raucb

5.5 下发与升级(本地模拟)

scp update-1.2.0.raucb pi@192.168.1.100:/tmp
ssh pi@192.168.1.100 "sudo rauc install /tmp/update-1.2.0.raucb"

5.6 重启并验证

sudo reboot
# 查看当前分区
rauc status

输出示例:

slot boot.1.1 (root_a) mounted
slot boot.1.2 (root_b) installed good

5.7 失败回滚演示

手动破坏 B 分区模型:

bash

复制

sudo dd if=/dev/zero of=/usr/share/model.rknn bs=1M count=10
sudo reboot

U-Boot 检测到 bootcount=2 > threshold=1,自动切换回 A 分区,系统继续运行。


六、常见问题与解答(FAQ)

问题 现象 解决
rauc install 报“incompatible” bundle 与硬件不匹配 检查 compatible= 与 /etc/rauc/system.conf 一致
升级后 kernel panic 设备树未更新 bundle 里追加 devicetree.dtb 并声明 [image.dtb]
bootcount 不增加 回滚不触发 确保 U-Boot env 含 bootlimit=1 且启用 bootcount 支持
网络慢,OTA 超时 100 MB 镜像 30 min 启用 RAUC 流式 + zstd 压缩,速度提升 3×
签名证书过期 烧录失败 使用 RAUC 的“PKCS11 软 HSM”延长证书生命周期

七、实践建议与最佳实践

  1. 模型与系统分离 bundle
    模型单独 <EMAIL_ADDRESS>,避免 200 MB 模型每次 rootfs 重打。

  2. 差分升级(delta update)
    rdiff 生成 patch,减少 70% 流量,适合 4G 场景。

  3. 双重签名
    开发密钥 + 生产密钥,工厂烧录后开发密钥失效,防泄露。

  4. 灰度发布
    现场 100 台设备,先 5% → 30% → 100%,RAUC 支持 rauc installslot 参数指定分组。

  5. 监控对接 Prometheus
    RAUC 提供 rauc-hawkbit + MQTT,node-exporter 收集 rauc_slot_good 指标,Grafana 看板实时显示升级成功率。

  6. CI 自动化
    GitLab Runner 构建完镜像 → 自动生成 bundle → 调用 hawkBit API → 设备 OTA,全流程无人工。


八、总结:一张脑图带走全部要点

嵌入式 Linux A/B OTA
├─ 分区:A/B rootfs + model
├─ 工具:RAUC + U-Boot bootcount
├─ 流程:build → bundle → sign → deploy → verify → rollback
├─ 安全:签名 + 灰度 + 监控
└─ 场景:AI 模型热更新、零停机、零返厂

掌握本文流程,你就拥有:

  • 一键打包脚本 → 10 分钟生成 .raucb

  • 自动回滚机制 → 现场零维护成本

  • 标准合规路径 → 满足 IEC 61508 对“安全更新”的 SIL 2 要求

下次升级,不再需要“拎着笔记本爬梯子”,让 AI 模型在云端一键下发,设备永不下线!祝你 OTA 顺利,证书早日上墙。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐