📖 推荐阅读:《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 升级原理

  1. 固定分区表(出厂阶段):

    • EFI 分区(内核/DTB/extlinux.conf)
    • ROOTFS_A
    • ROOTFS_B
    • 可选数据分区
  2. 生成更新包(构建阶段):

    • Yocto + meta-rauc 构建 .raucb(包含 rootfs 镜像、manifest、签名)
  3. 设备端安装(运行时):

    • RAUC 校验 .raucb 签名
    • 写入 非当前槽位 rootfs
    • 调用槽位切换脚本 → nvbootctrl set-active-boot-slot
  4. 重启 + 健康检查

    • 从新槽位启动
    • 健康检查成功 → 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. 实战经验

  1. 不要在 OTA 中改分区表,A/B 分区布局应在出厂阶段固定。
  2. 公私钥分离:公钥证书放设备端,私钥保存在 CI/CD 或 HSM。
  3. 健康检查必须可靠,要能检测应用、网络等关键指标。
  4. 调试 OTA 流程:先用 U 盘 / 本地文件跑通 RAUC 流程,再接入网络分发平台。
  5. 引导器更新:rootfs OTA 与 Bootloader OTA 分开,Bootloader 用 UEFI Capsule 或 nv_update_engine

6. 总结

RAUC + meta-rauc 在 Jetson 上的 OTA 升级方案核心是:

  • 出厂阶段用 Yocto 固定好分区布局
  • OTA 时 RAUC 只更新备用槽位内容,不动分区表
  • 通过 nvbootctrl 控制 Jetson UEFI 引导槽位
  • 健康检查确保升级可回滚

这种方式安全、可控,适合量产和长期维护的嵌入式 AI 项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94895.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94895.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94895.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 主备(Master-Slave)复制 的搭建

一、主备架构简介 Master(主库):负责处理所有写操作(INSERT/UPDATE/DELETE),并记录二进制日志(binlog)。Slave(备库):从主库拉取 binlog&#xff…

【三个数绝对值排序】2022-10-10

缘由绝对值比较&#xff0c;总是跑不过怎么办-编程语言-CSDN问答 template <class 形参> inline void 算交换(形参& a, 形参& b){ 形参 ab a - b; a - ab; b ab; } template <class 形参> void 三个升序(形参& a, 形参& b, 形参& c) {if (a…

【LoRA模型训练】Stable Diffusion LoRA 模型秋叶训练器详细教程

一、工具简介与安装指南 1.1 秋叶 LoRA 训练器概述 秋叶 LoRA 训练器&#xff08;基于 Akegarasu/lora-scripts 项目&#xff09;是针对 Stable Diffusion 模型的轻量化微调工具&#xff0c;通过低秩适应&#xff08;LoRA&#xff09;技术实现高效参数微调。其核心优势在于&a…

C++2024 年一级

1 单选题 (每题 2 分,共 30 分) 12 ⽉ 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 C C D B B D B C C C D C D B D 第 1 题 2024年10⽉8⽇ &#xff0c;诺贝尔物理学奖“意外地”颁给了两位计算机科学家约翰霍普菲尔德&#xff08;John J. Hopfield&#xff09;和杰 弗⾥⾟…

react-window

下面&#xff0c;我们来系统的梳理关于 React 虚拟化列表&#xff1a;react-window 的基本知识点&#xff1a;一、虚拟化列表核心概念 1.1 什么是虚拟化列表&#xff1f; 虚拟化列表&#xff08;也称为窗口化&#xff09;是一种只渲染当前可见区域列表项的技术&#xff0c;而不…

2025AI颠覆认知!解锁智能新纪元

清晨的城市还裹着薄雾时&#xff0c;通勤族的手机已经自动规划好最优路线——避开施工路段、实时更新交通状况&#xff0c;连早餐店排队人数都能精准预测。这不是科幻电影里的片段&#xff0c;而是2025年AI深度融入生活的寻常场景。当数字化与智能化浪潮席卷而来&#xff0c;我…

实用Shell高级视频课程

实用Shell高级视频课程 Shell三剑客sed我网盘给你分享了「实用Shell高级视频课程」&#xff0c;点击链接或复制整段内容&#xff0c;打开「APP」即可获取。/bc3b37jg8i:/链接&#xff1a;http://t.cn/A6swtV7u提取码&#xff1a;ePV4 ​​​

hive-日期拆分为多行

hive-日期拆分为多行 代码 SELECT begin_date,date_add(begin_date, tmp.pos),end_date,d_days,tmp.pos,tmp.val FROM (SELECT begin_date,end_date,DATEDIFF(end_date, begin_date) AS d_daysFROM (SELECT 2025-08-01 AS begin_date,2025-08-10 AS end_date) a) b LA…

全志MPP学习(1)-全志MPP概念理清

文章目录1、全志MPP1.1、MPP-Framework1.2、MPP-Middleware1.3、MPP-Framework和MPP-Middleware之间的关系2、总结1、全志MPP 全志MPP&#xff08;Media Process Platform&#xff09;媒体处理软件平台&#xff0c;分为 mpp-middleware 和 mpp-framework 两部分。 mpp-middlew…

Linux操作系统启动项相关研究与总结

Linux操作系统启动项相关研究与总结 一、Linux Systemd 服务创建与管理研究 1. Systemd 服务基础 1.1 Systemd 服务文件位置 1.2 服务文件基本结构 2. 创建自定义 Systemd 服务 2.1 基本服务文件示例 2.2 服务文件详细配置选项 [Unit] 部分常用指令: [Service] 部分常用指令:…

Go map 的性能革命:深入解析从链表到 Swiss Table 的优化之路

你好&#xff0c;Gopher&#xff01;map 作为 Go 语言中最核心、最常用的数据结构之一&#xff0c;其性能直接影响着我们程序的效率。在 Go 1.24 版本中&#xff0c;map的底层实现迎来了一次意义深远的变革&#xff0c;从沿用多年的“哈希桶链表”结构&#xff0c;悄然升级为了…

化工厂安全升级:分布式光纤传感的 “实时监测 + 精准预警” 方案

分布式光纤传感技术凭借长距离连续监测、抗电磁干扰、耐腐蚀、高灵敏度、实时响应等特性&#xff0c;非常适配化工领域中化学原料及化学制品工厂的复杂环境&#xff0c;如高温、高压、腐蚀性介质、强电磁干扰等&#xff0c;在安全生产、设备维护、风险预警等方面发挥着关键作用…

供应链需求预测项目如何设定合理的KPI、准确率指标(十四)

本篇文章适合希望优化供应链管理的读者&#xff0c;尤其是对KPI的选择与应用有兴趣的人。文章的亮点在于揭示了不当KPI使用可能导致的风险&#xff0c;如狭隘的关注、协作减少和与业务目标不一致等&#xff0c;同时提供了如何选择合适KPI的最佳实践。 本文整合自文章&#xff…

【线性代数】线性方程组与矩阵——(1)线性方程组与矩阵初步

上一节&#xff1a;无 总目录&#xff1a;【线性代数】目录 文章目录1. 线性方程组2. 矩阵的引入2.1. 矩阵的定义2.2. 常见的矩阵2.3. 线性方程组中常用的矩阵2.4. 线性变换与矩阵3. 矩阵的运算3.1. 矩阵的加法3.2. 矩阵的数乘3.3. 矩阵的乘法3.4. 矩阵的转置3.5. 方阵的行列式…

【工具变量】地市人力资本水平数据集(2003-2023年)

数据简介&#xff1a;普通本专科在校学生数作为人力资本的代理变量&#xff0c;能够直观反映区域教育投入与人才储备规模。通过与户籍人口数比值计算&#xff0c;可消除人口基数差异&#xff0c;实现跨区域人力资本水平的横向比较。 人力资本水平是个体价值创造能力与国家竞争…

轻量化阅读应用实践:21MB无广告电子书阅读器测评

还在为广告满天飞的阅读软件烦恼吗&#xff1f;今天阿灿给大家推荐一款纯净好用的阅读神器&#xff0c;安读&#xff01;这款app只有21MB大小&#xff0c;但功能真的很贴心。最棒的是完全没广告&#xff0c;让你能静下心来好好看书。支持各种电子书格式&#xff0c;打开就能读&…

嵌入式硬件篇---OpenMV存储

OpenMV存储部分OpenMV 开发板的存储部分可以简单理解为 “不同用途的存储器”&#xff0c;就像我们的电脑有硬盘&#xff08;存文件&#xff09;、内存&#xff08;临时运行程序&#xff09;一样&#xff0c;OpenMV 也有几个不同的存储区域&#xff0c;各自分工明确。下面用通俗…

QT第二讲-信号和槽

文章目录 ⚙️ 一、基本概念与规则 1. 信号(Signal) 2. 槽(Slot) 🔌 二、连接函数 connect() 详解 函数原型: 参数说明 类型 行为 场景 🧩 三、实际场景示例 场景1:按钮点击关闭窗口 场景2:实时验证输入框文本 ⚡️ 四、高级技巧 1. Lambda表达式作为槽 2. 处理信号…

如何用OpenAI SDK调用Ollama LLM

Ollama目前内置了OpenAI Chat Completions API 的兼容端点&#xff0c;用户可以用OpenAI SDK访问本地Ollama模型&#xff0c;这里示例整个访问过程。 假设Ollama已安装&#xff0c;过程参考 在mac m1基于ollama运行deepseek r1_mac m1 ollama-CSDN博客 1 下载OpenAI SDK和模型…

如何解决用阿里云效流水线持续集成部署Nuxt静态应用时流程卡住,进行不下去的问题

我有一个用Nuxt搭建的前端应用&#xff0c;部署时是用npm run generate命令生成静态页&#xff0c;然后上传到服务器上的指定目录来完成部署。之前是写了一个shell脚本&#xff0c;用rsync命令实现的上传&#xff0c;个人用起来倒也比较方便&#xff0c;但是因为涉及到服务器登…