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.xml
、flash_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 升级流程
- 下载新固件包;
- 将
system_b.img
写入备用分区; - 修改 Bootloader 启动项,指向 system_b;
- 重启设备进入新系统;
- 若启动成功,标记升级成功;
- 若失败,回退至 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