📖 推薦閱讀:《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 項目。