当前位置: 首页 > news >正文

Jetson 分区知识全解与 OTA 升级实战


📖 推荐博主书籍:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry


Jetson 分区知识全解与 OTA 升级实战

在嵌入式系统中,分区(Partition) 是理解启动流程、存储布局以及 OTA 升级机制的关键环节。NVIDIA Jetson 平台(如 Jetson AGX Orin、Orin NX、Orin Nano)在存储分区设计上提供了高度灵活性和扩展性,既能满足引导加载程序、固件、内核的独立存储需求,也支持用户数据和系统根文件系统的动态管理。本文将带你从分区架构入手,逐步讲解如何在 Jetson 平台上实现 OTA 升级方案,并给出实战示例与逻辑图。


在这里插入图片描述

1. Jetson 分区的整体理解

Jetson 的存储介质通常包括:

  • QSPI-NOR:存放 Bootloader、UEFI、早期启动代码等关键组件;
  • eMMC/SD/USB/NVMe:存放操作系统映像(system.img)、内核(boot.img)、设备树、用户数据等。

分区文件(如 flash_t234_qspi_sdmmc.xmlflash_t234_qspi_sd.xml)采用 XML 格式,描述了完整的分区布局。刷机脚本 flash.sh 会读取该配置文件,并调用 tegraflash.py 将数据写入对应的存储区域。


2. 分区配置文件结构

分区配置文件以 XML 形式存在,核心结构如下:

<partition_layout version="01.00.0000"><device type="sdmmc_user" instance="3"><partition name="APP" type="data"><allocation_policy>sequential</allocation_policy><filesystem_type>basic</filesystem_type><size>30064771072</size> <!-- 约 28GB --><filename>system.img</filename></partition></device>
</partition_layout>

其中:

  • device:存储类型(sdmmc、nvme、spi 等);
  • partition:每个分区的名称、大小、文件系统类型;
  • filename:刷入分区的镜像文件。

3. Jetson 分区逻辑图

下面是典型 Jetson Orin 分区布局逻辑图:

+-------------------------------------------------------+
| QSPI-NOR (Boot)                                       |
|  MB1  |  UEFI  |  DTB  |  TOS  |  Recovery Kernel     |
+-------------------------------------------------------+
| eMMC / NVMe / SD 用户存储                             |
|  GPT -> | boot.img | kernel dtb | system.img | data   |
+-------------------------------------------------------+

这一布局为 OTA 升级方案的实现提供了基础:引导区独立,根文件系统和数据区可动态替换或扩展。


4. OTA 升级中的分区策略

在 Jetson 上实现 OTA 升级,通常有三种分区策略:

4.1 单根文件系统方案

  • 结构:只有一个 system.img(根文件系统)分区。
  • 特点:升级时直接覆盖该分区,简单高效。
  • 缺点:若升级失败,设备可能无法启动。

4.2 A/B 分区冗余方案

  • 结构:system_a 与 system_b 两个根文件系统分区,Bootloader 控制启动分区。
  • 特点:升级在备用分区完成,重启后切换启动。失败时可回滚。
  • 常见实现:Google Android A/B OTA 机制,Mender、RAUC。

4.3 数据与系统分离方案

  • 结构:根文件系统只存放系统文件,用户数据存放在独立 data 分区。
  • 特点:升级时仅替换 system.img,用户数据不受影响。

5. 实战:构建 A/B OTA 分区方案

Jetson Orin NX 为例,我们构建一个双根文件系统(A/B 分区)的 OTA 升级方案。

5.1 修改分区配置文件

编辑 flash_t234_qspi_sdmmc.xml

<device type="sdmmc_user" instance="3"><!-- system_a 分区 --><partition name="APP_A" type="data"><size>0x400000000</size> <!-- 16GB --><filename>system_a.img</filename></partition><!-- system_b 分区 --><partition name="APP_B" type="data"><size>0x400000000</size> <!-- 16GB --><filename>system_b.img</filename></partition><!-- 用户数据分区 --><partition name="DATA" type="data"><size>0x200000000</size> <!-- 8GB --><filename/></partition>
</device>

5.2 引导加载程序配置

在 Bootloader 中加入启动控制逻辑:

# /boot/extlinux/extlinux.conf
LABEL system_aMENU LABEL primary systemLINUX /boot/ImageAPPEND root=/dev/mmcblk0p1 rwLABEL system_bMENU LABEL backup systemLINUX /boot/ImageAPPEND root=/dev/mmcblk0p2 rw

5.3 OTA 升级流程

  1. 下载新固件包;
  2. system_b.img 写入备用分区;
  3. 修改 Bootloader 启动项,指向 system_b;
  4. 重启设备进入新系统;
  5. 若启动成功,标记升级成功;
  6. 若失败,回退至 system_a。

6. OTA 升级逻辑图

          +----------------+| 下载升级包     |+--------+-------+|v+--------+-------+| 写入 system_b |+--------+-------+|v+--------+-------+| Bootloader 切换|+--------+-------+|成功? ----+-----> 失败回滚至 system_a|v+--------+-------+| 标记升级成功   |+----------------+

7. 实战代码示例

在 OTA 客户端(如基于 Mender/自研脚本)中,可以这样实现:

#!/bin/bash
set -eIMAGE=new_system.img
TARGET_DEV=/dev/mmcblk0p2  # system_b 分区# 写入镜像
dd if=$IMAGE of=$TARGET_DEV bs=1M status=progress# 修改 Bootloader 配置
sed -i 's/APPEND root=\/dev\/mmcblk0p1/APPEND root=\/dev\/mmcblk0p2/' /boot/extlinux/extlinux.conf# 重启进入新系统
reboot

8. 总结

  • Jetson 分区文件 提供了灵活的存储布局管理;
  • OTA 升级 可通过单分区、A/B 分区、数据/系统分离等方式实现;
  • 实战推荐:A/B 分区是最安全可靠的方案,尤其适合无人值守设备。

通过理解 Jetson 的分区配置和刷机机制,我们能够为嵌入式 AI 设备构建更加稳健的 OTA 升级方案,让系统升级更安全、更高效。



📖 推荐博主书籍:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry


http://www.dtcms.com/a/353380.html

相关文章:

  • Containerd 安装与配置指南
  • 如何验证二叉搜索树:两种高效方法详解
  • 光伏设计平台:按组件数量铺设光伏板,精准控制投资成本
  • 推荐系统王树森(四)特征交叉+行为序列
  • 智能体前沿-主动信息获取理论基础
  • 汇川SV660A 伺服EMC电源滤波的安装要求及使用方法
  • Swift 解法详解 LeetCode 364:嵌套列表加权和 II
  • 【ConcurrentHashMap】实现原理和HashMap、Redis哈希的区别
  • 【Linux网络】网络基础
  • 如何高效地学习:从“死记硬背”到“内化创新”
  • 第二章从事件驱动到信号
  • ESP32使用场景及大规模物联网IoT
  • 【高级机器学习】3. Convex Optimisation
  • 海康相机的 HB 模式功能详解
  • 深入解析 OpenGL 着色器:顶点着色器与片段着色器
  • 无人驾驶叉车的核心作用:技术赋能下如何重塑工业物流的运作逻辑
  • Chrome插件学习笔记(四)
  • 豆包分析linux top
  • 李飞飞谈 AI 世界模型:技术内涵与应用前景
  • 深度学习——卷积神经网络CNN(原理:基本结构流程、卷积层、池化层、全连接层等)
  • 编程算法实例-算法学习网站
  • [Mysql数据库] 知识点总结4
  • LeetCode热题 100——48. 旋转图像
  • CB1-3-面向对象
  • 琼脂糖凝胶核酸电泳条带异常问题及解决方案汇总
  • Day29 基于fork+exec的minishell实现与pthread多线程
  • 【Linux】基本指令学习3
  • IBMS集成管理系统与3D数字孪生智能服务系统的应用
  • Linux驱动 — 导出proc虚拟文件系统属性信息
  • LabVIEW 音频信号处理