基于 RAUC 的 Jetson OTA 升级全攻略
📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry
基于 RAUC 的 Jetson OTA 升级全攻略
0. 引子:常见问题
在 Jetson 平台做 OTA 升级时,你可能会问:
- RAUC 是什么?它和 meta-rauc 的关系?
- Jetson 的 Bootloader 如何配合 OTA?
- OTA 会不会刷新分区表?
- 如何在 Yocto + meta-tegra 中集成 RAUC?
- 健康检查与回滚机制怎么做?
本文将结合实战经验,从原理、关键技术到落地过程,完整讲清 RAUC 在 Jetson 上的 OTA 升级方案。
1. 核心概念
1.1 RAUC
RAUC(Robust Auto-Update Controller)是一个嵌入式 Linux 的安全升级框架,支持:
- A/B 分区更新(冗余槽位,失败可回滚)
- 签名校验(保证镜像来源和完整性)
- 健康检查(启动验证,失败自动回滚)
- 多槽位类型(不仅可更新 rootfs,还可更新内核、应用、Bootloader)
1.2 meta-rauc
-
Yocto Project 的一个 Layer,用来把 RAUC 集成进 Yocto 构建系统。
-
提供:
- RAUC 客户端的交叉编译与打包
- 生成
.raucb
更新包的bundle.bbclass
- 示例配置与 keyring 支持
1.3 Jetson Bootloader(UEFI + nvbootctrl)
-
Jetson Linux 使用 UEFI 固件作为 Bootloader,支持 A/B 引导槽位。
-
通过
nvbootctrl
工具可:- 设置下一次启动的引导槽位
- 标记启动成功 / 不可用
-
OTA 时,RAUC 会调用槽位切换脚本,脚本内部用
nvbootctrl
完成切换。
2. OTA 升级原理
-
固定分区表(出厂阶段):
- EFI 分区(内核/DTB/extlinux.conf)
- ROOTFS_A
- ROOTFS_B
- 可选数据分区
-
生成更新包(构建阶段):
- Yocto + meta-rauc 构建
.raucb
(包含 rootfs 镜像、manifest、签名)
- Yocto + meta-rauc 构建
-
设备端安装(运行时):
- RAUC 校验
.raucb
签名 - 写入 非当前槽位 rootfs
- 调用槽位切换脚本 →
nvbootctrl set-active-boot-slot
- RAUC 校验
-
重启 + 健康检查:
- 从新槽位启动
- 健康检查成功 →
rauc status mark-good
- 失败 / 超时 → Bootloader 回滚到旧槽位
3. Yocto 集成 RAUC(Jetson 示例)
3.1 添加 Layer
BBLAYERS += " \${TOPDIR}/sources/meta-tegra \${TOPDIR}/sources/meta-openembedded/meta-oe \${TOPDIR}/sources/meta-rauc \${TOPDIR}/sources/meta-myboard \
"
3.2 配置 local.conf
MACHINE = "jetson-orin-nano-devkit"
IMAGE_FSTYPES = "wic.bmap wic"
WKS_FILE = "jetson-ab.wks"INHERIT += "rauc"
IMAGE_INSTALL:append = " rauc rauc-service"RAUC_KEY_FILE = "${LAYERDIR_myboard}/recipes-core/rauc/files/dev.key.pem"
RAUC_CERT_FILE = "${LAYERDIR_myboard}/recipes-core/rauc/files/dev.cert.pem"
3.3 分区布局(WIC)
part EFI --source bootimg-efi --label EFI --fstype=vfat --size 256
part / --source rootfs --label ROOTFS_A --fstype=ext4 --fixed-size 2048
part / --source rootfs --label ROOTFS_B --fstype=ext4 --fixed-size 2048
3.4 RAUC system.conf
[system]
compatible=mycompany-jetson
bootloader=bootchooser
mountprefix=/mnt/rauc[keyring]
path=/etc/rauc/dev.cert.pem[slot.rootfs.0]
device=PARTLABEL=ROOTFS_A
type=ext4
bootname=A[slot.rootfs.1]
device=PARTLABEL=ROOTFS_B
type=ext4
bootname=B
4. 健康检查与回滚
4.1 健康检查服务(示例)
#!/bin/sh
# /usr/local/bin/check_health.sh
if systemctl is-active myapp; thenrauc status mark-good
elseecho "Health check failed"
fi
- 启动后运行该脚本,如果失败,Bootloader 会回滚到上一个槽位。
4.2 槽位切换脚本
#!/bin/sh
SLOT="$1" # A 或 B
if [ "$SLOT" = "A" ]; thennvbootctrl set-active-boot-slot 0
elsenvbootctrl set-active-boot-slot 1
fi
5. 实战经验
- 不要在 OTA 中改分区表,A/B 分区布局应在出厂阶段固定。
- 公私钥分离:公钥证书放设备端,私钥保存在 CI/CD 或 HSM。
- 健康检查必须可靠,要能检测应用、网络等关键指标。
- 调试 OTA 流程:先用 U 盘 / 本地文件跑通 RAUC 流程,再接入网络分发平台。
- 引导器更新:rootfs OTA 与 Bootloader OTA 分开,Bootloader 用 UEFI Capsule 或
nv_update_engine
。
6. 总结
RAUC + meta-rauc 在 Jetson 上的 OTA 升级方案核心是:
- 出厂阶段用 Yocto 固定好分区布局
- OTA 时 RAUC 只更新备用槽位内容,不动分区表
- 通过
nvbootctrl
控制 Jetson UEFI 引导槽位 - 健康检查确保升级可回滚
这种方式安全、可控,适合量产和长期维护的嵌入式 AI 项目。