Jetson Nano/TX1 更新和冗余

适用于: Jetson Nano 设备和 Jetson TX1
NVIDIA® Jetson™ Nano 和 NVIDIA Jetson TX1 平台使用 Debian 软件包工具来更新启动加载程序。启动加载程序更新过程安全地执行启动加载程序更新,并确保在更新期间始终存在可用的启动加载程序分区。
注意
在学习本主题之前,您必须熟悉以下主题
有关 Jetson 平台的信息,请访问 NVIDIA 开发者中心,网址为

TegraBoot 和分区布局

BCT 存储在名为 BCT 的分区中。NVIDIA 刷写实用程序 tegraflash.py 最多写入 64 个 BCT 实例,具体取决于为 BCT 分配的空间量。实例在连续的 16 KiB 边界上对齐。
NVIDIA® Tegra® BootROM 通过集成的校验和或 RSA 签名验证 BCT。如果计算出的校验和或签名与分区开头的 BCT 中的值不匹配,则 BootROM 会尝试验证 BCT 的下一个实例。如果校验和或签名再次不匹配,则 BootROM 会尝试验证下一个实例,依此类推,直到找到 BCT 的有效实例或耗尽可用实例。
在从 eMMC 内存启动的平台(Jetson TX1、Jetson Nano 4GB 生产模块以及与 SD 卡一起使用的 Jetson Nano 开发者套件模块)上,L4T 使用两组文件来实现冗余
boot-file-set (BFS) 是一组分区组中与启动相关的所有文件。TegraBoot 文件不是 BFS 的一部分,因为 BootROM 加载 TegraBoot,而 TegraBoot 加载 BFS。
kernel-file-set (KFS) 是一组分区组中与加载内核相关的所有文件。
BFS 和 KFS 中包含的分区在 冗余启动固件 部分列出。
BCT 可以包含两个条目,指示 TegraBoot、启动文件和内核文件的位置(偏移量和大小)以及校验和或签名。BootROM 计算并验证每个 TegraBoot 条目的校验和或签名。当它找到一组有效的校验和或签名时,它会将控制权转移到指定的 TegraBoot 实例。
TegraBoot 计算并验证第一个 BFS 和第一个 KFS 的校验和以及各个文件的签名。当校验和和签名经过验证后,TegraBoot 会加载适当的启动文件,例如
TegraBoot CPU 二进制文件
启动加载程序使用的 DTB 文件
内核使用的 DTB 文件
Warmboot 二进制文件
可信操作系统镜像
当所有必要的启动文件都已验证和加载后,TegraBoot 会将控制权转移到启动加载程序,例如 CBoot。启动加载程序验证并加载下一级软件组件,例如 Linux 内核或 U‑Boot。
如果 TegraBoot 无法验证第一个 BFS 和 KFS,它会覆盖自身并重置板卡,以便 BootROM 可以验证和加载下一组 TegraBoot、BFS 和 KFS。
注意
当 Jetson Nano 从 SD 卡启动时,它不使用冗余来加载 BFS 和 KFS。它仅使用冗余 TegraBoot 分区(分区 NVC)。由于启动加载程序使用的分区位于 SD 卡上,因此可以轻松更换 SD 卡以恢复损坏的启动加载程序。

冗余启动固件

分区配置文件包含 Tegra 分区表和 GPT 的分区信息。它们位于以下位置
对于 Jetson TX1:bootloader/t210ref/cfg/gnu_linux_fastboot_emmc_full.xml
对于 Jetson Nano 4GB 生产模块(具有 eMMC 存储):bootloader/t210ref/cfg/flash_l4t_t210_emmc_p3448.xml
对于 Jetson Nano 开发模块(具有 Micro SD 存储):bootloader/t210ref/cfg/flash_l4t_t210_spi_sd_p3448.xml
冗余布局必须按顺序包含以下分区
1. 启动分区,用于启动过程,并且仅对启动加载程序可见。
许多启动分区都有冗余副本分区。副本分区必须与其主分区具有相同的名称,后缀为“‑1”。例如,NVC 分区的副本必须命名为 NVC‑1
启动分区是
BCT,其中包含启动配置表的冗余实例。这必须是启动设备上的第一个分区。
NVC 包含 TegraBoot。这必须是第二个启动分区。以下启动分区 PTSPFBFS 的一部分。
PT 包含每个 BFS 的布局信息,并指示每个 BFS 的开始位置。它是 BFS 中的第一个分区。
TBC 包含 TegraBoot CPU 端二进制文件。
RP1 包含 TegraBoot DTB。
EBT 包含 CBoot。
WB0 包含 warm boot 二进制文件。
BPF 包含 BPMP 微码。
NVC‑1 包含 NVC 的副本。
PT‑1BPF‑1 是主分区 NVCBPF 的副本分区,构成 BFS 的副本,表示为 BFS‑1
PAD 是一个空分区,用于确保 VERVER_b 位于启动分区的末尾。
VER_b 包含用于冗余和版本检查的附加版本信息。
VER 包含版本信息。
2. GP1 包含 sdmmc_user 设备的主 GPT。在此之后定义的所有分区都在 Linux 内核中配置,并且可以通过标准分区工具(例如 gdiskparted)访问。
3. 用户分区,具有多种用途。其中一些可以删除,和/或可以挂载并用于存储应用程序文件。
以下分区构成 kernel-file-set (KFS),并具有冗余副本分区
DTB 包含内核 DTB。
TOS 包含可信操作系统二进制文件。
EKS 是可选的,保留供将来使用。
LNX 包含 Linux 内核或 U-Boot,具体取决于配置文件中 DFLT_KERNEL_IMAGE 的选择。
DTB‑1EKS‑1 构成主 KFS 的副本,表示为 KFS‑1
其他分区,例如 APPBMP,不在本文档的范围内。有关这些分区的更多信息,请参阅 默认分区概述 中适用于您的 Jetson 平台的相应小节。
总之,分区配置文件的总体布局是
BCT
NVC
启动文件集 (BFS):PTTBCRP1EBTWB0BPF
NVC-1
启动文件集副本 (BFS-1):PT-1TBC-1RP1-1EBT-1WB0-1BPF-1
PAD
VER_b
VER
GP1
APP(此处未描述)
内核文件集 (KFS):DTBTOSEKSLNX
内核文件集副本 (KFS-1):DTB-1TOS-1EKS-1LNX-1
BMP 和其他(此处未描述)
当内核启动时,启动分区在这些设备上受到写保护的约束
分区
设备名称
BCTNVCBFS
/dev/mmcblk0boot0
NVC‑1BFS‑1VER_bVER
/dev/mmcblk0boot1
与 BFS 不同,所有 KFS 分区都可以在这些设备上的 Linux 中看到
分区
设备名称
DTB
/dev/disk/by-partlabel/DTB
TOS
/dev/disk/by-partlabel/TOS
EKS
/dev/disk/by-partlabel/EKS
LNX
/dev/disk/by-partlabel/LNX
DTB-1
/dev/disk/by-partlabel/DTB-1
TOS-1
/dev/disk/by-partlabel/TOS
EKS-1
/dev/disk/by-partlabel/EKS-1
LNX-1
/dev/disk/by-partlabel/LNX-1

生成启动加载程序更新有效负载 (BUP)

启动加载程序更新有效负载 (BUP) 用于实现启动加载程序更新。它包含更新 Jetson 设备所需的每种类型的固件二进制文件。您可以在主机上使用 build_l4t_bup.sh 生成它,该脚本与 Linux for Jetson Board Support Package (BSP) 中的 flash.sh 一起打包。
本节介绍生成多规格 BUP 或单规格 BUP 的步骤。多规格 BUP 包括每种类型的多个固件二进制文件和 BCT 镜像,可用于更新任何受支持类型的 Jetson 设备。当您运行更新程序时,它会为您正在更新的设备使用每种类型的适当二进制文件。单规格 BUP 仅包含每种类型的一个二进制文件,并且仅可用于更新一种 Jetson 设备配置。
要生成多规格 BUP
输入命令
$ cd <top>
$ sudo ./l4t_generate_soc_bup.sh [-u <pkc_key_file>] [‑p <options>] [-d] <processor>
其中
<top> 是包含 PDK 安装包的目录的路径名。flash.sh 脚本位于此目录中。
<pkc_key_file> 是您的 Jetson 载板的 RSA 私钥文件。如果它是相对路径名,则相对于 <top>/bootloader 目录进行解释。
<options> 是一个字符串,其中包含要传递给 flash.sh 以生成 BUP 的命令行选项。如果字符串包含空格字符,则必须用引号括起来。
-d 使脚本以调试模式运行,该模式将所有启动固件 blob 镜像保存在 bootloader/signedbootloader/multi-signed 中。
<processor> 对于 Jetson Nano 设备或 Jetson TX1 设备为 t21x
该过程将 BUP 存储在文件
<top>/bootloader/<payload_dir>/bl_update_payload
其中 <payload_dir> 是适用于特定类型的 Jetson 或 Tegra 处理器的 BUP 的目录。有关更多信息,请参阅 BUP 文件的存储位置下文
要生成单规格 BUP
输入命令
$ sudo [env={value}, …] ./build_l4t_bup.sh [<options>] <board> <rootdev>
其中
<options> 是一个字符串,其中包含要传递给 flash.sh 以生成 BUP 的命令行选项。如果字符串包含空格字符,则必须用引号括起来。
<board> 是您的 Jetson 模块和配置的 $(BOARD) 值,如 快速入门 主题中的 快速入门 表格所示。
<rootdev> 是要刷写根文件系统的分区。
该过程将 BUP 存储在文件
<top>/bootloader/<payload_dir>/bl_update_payload
其中 <payload_dir> 是适用于特定类型的 Jetson 或 Tegra® 处理器的 BUP 的目录。有关更多信息,请参阅 BUP 文件的存储位置下文
BUP 文件的存储位置
这两个过程都将 BUP 文件存储在
<top>/bootloader/<payload_dir>/bl_update_payload
其中 Jetson Nano 和 Jetson TX1 设备的 <payload_dir>payloads_t21x
在运行更新引擎之前,您必须将 BUP 文件放置在目标系统上的此目录下
/opt/ota_package/
生成的 BUP 文件的位置和功能
该过程在目录 <top>/bootloader/payloads_t21x 中生成这些 BUP
bl_update_payload:包含所有必需的二进制文件。
xusb_only_payload:包含 xusb。
对于从 SD 卡启动的 Jetson Nano 设备,该过程会生成这些额外的 BUP
bl_only_payload:包含启动加载程序二进制文件。
kernel_only_payload:包含内核和内核 DTB。
porg_qspi_only_payload:包含存储在 QSPI 内存中的二进制文件。
porg_sd_only_payload:包含存储在 SD 卡上的二进制文件。
要使用新的启动加载程序固件生成 BUP
复制相应的启动加载程序固件二进制文件以替换 <top>/bootloader/t210ref/ 中的文件,然后运行 l4t_generate_soc_bup.sh 以生成新的 BUP。
要打印出 BUP 的标头信息和条目表
输入以下命令
$ cd <top>/bootloader
$ ./BUP_generator.py -c payloads_t21x/bl_update_payload

启动加载程序更新

更新工具是 /user/sbin/l4t_payload_updater_t210/。您可以使用它来更新 BUP 中包含的所有分区。
要更新 BUP
输入以下命令
$ sudo l4t_payload_updater_t210 payloads_t21x/bl_update_payload
该脚本将启动加载程序更新日志存储在 /opt/ota_package/bl_update_payload.log 中。
注意
启动加载程序 Debian 软件包 nvidia-l4t-bootloader_32.3.0-xxx_arm64.deb 使用此脚本自动执行启动加载程序更新。
要打印出设备的启动加载程序版本
输入以下命令
$ sudo l4t_payload_updater_t210 -v
该命令打印出类似以下内容的消息
# R32 , REVISION: 3.0

启动加载程序更新流程

脚本 /user/sbin/l4t_payload_updater_t210 实现了完整的启动加载程序更新过程。
下图显示了从 BootROM 到 BCT,到 NVC,到 BFS,再到 KFS 的启动加载程序更新流程。
1. 在更新之前,分区看起来像这样。
2. 更新 BCT_64、BFS‑1、KFS‑1 和 NVC‑1。
在正常的启动过程中,BootROM 从 BCT_1 开始向上搜索有效的 BCT。在启动加载程序更新过程中,更新程序不知道哪个 BCT 有效,因此为了保持良好的路径,它从 BCT_64 向下搜索。因此,任何分区上的更新失败都不会影响良好的路径,BootROM → BCT_1(或 BCT_xx) → NVC → BFS → KFS。
A diagram of a network Description automatically generated
3. 从 BCT_63 向下更新到 BCT_1。
A diagram of a network Description automatically generated
4. 更新 BFS 和 KFS。
A diagram of a computer Description automatically generated
5. 更新 NVC。
NVC 最后更新,以便在 BFS 路径准备就绪之前不启用 BCT_1 → NVC 和 BCT_2 → NVC 路径。
A diagram of a computer Description automatically generated

BFS/KFS 的 BUP 生成、启动和更新中的示例日志

本节包含常见 BUP 生成、启动和启动更新案例中的日志示例。它们可用于检查这些操作中是否发生错误。
BFS/KFS 的 BUP 生成中的示例日志
此日志显示 BUP 生成中使用的 BFS/KFS 信息,例如二进制文件名、大小和 BFS/KFS 校验和。
[ 0.2271 ] 正在更新 BCT 上的 BFS 信息
[ 0.2285 ] tegrabct --bct P2180_A00_LP4_DSC_204Mhz.bct --chip 0x21 0 --updatebfsinfo flash.xml.bin
[ 0.2294 ] BFS
[ 0.2311 ] 0: [PT ] flash.xml.bin (size=4626/16384)
[ 0.2333 ] 1: [TBC] nvtboot_cpu.bin.encrypt (size=65856/172032)
[ 0.2364 ] 2: [RP1] tegra210-jetson-tx1-p2597-2180-a01-devkit.dtb.encrypt (size=490480/1007616)
[ 0.2379 ] 3: [EBT] cboot.bin.encrypt (size=484304/999424)
[ 0.2383 ] 4: [WB0] warmboot.bin.encrypt (size=3952/8192)
[ 0.2387 ] 5: [BPF] sc7entry-firmware.bin.encrypt (size=3376/8192)
[ 0.2394 ] 6: [TOS] tos-mon-only.img.encrypt (size=54208/557056)
[ 0.2398 ] BFS0: 16384 @ 2784 SUM 7b64c63a over 2768896 bytes
[ 0.2402 ] BFS
[ 0.2403 ] 0: [PT-1] flash.xml.bin (size=4626/16384)
[ 0.2412 ] 1: [TBC-1] nvtboot_cpu.bin.encrypt (size=65856/172032)
[ 0.2418 ] 2: [RP1-1] tegra210-jetson-tx1-p2597-2180-a01-devkit.dtb.encrypt (size=490480/1007616)
[ 0.2425 ] 3: [EBT-1] cboot.bin.encrypt (size=484304/999424)
[ 0.2431 ] 4: [WB0-1] warmboot.bin.encrypt (size=3952/8192)
[ 0.2453 ] 5: [BPF-1] sc7entry-firmware.bin.encrypt (size=3376/8192)
[ 0.2458 ] 6: [TOS-1] tos-mon-only.img.encrypt (size=54208/557056)
[ 0.2463 ] BFS1: 16384 @ 8928 SUM 7b64c63a over 2768896 bytes
[ 0.2468 ] KFS
[ 0.2618 ] 0: [DTB] tegra210-jetson-tx1-p2597-2180-a01-devkit.dtb.encrypt (size=490480/503808)
[ 0.2626 ] 1: [LNX] boot.img.encrypt (size=495616/67092480)
[ 0.2631 ] KFS0: 503808 @ 29376546 SUM 22c0f1c4 over 999424 bytes
[ 0.2666 ] KFS
[ 0.2915 ] 0: [DTB-1] tegra210-jetson-tx1-p2597-2180-a01-devkit.dtb.encrypt (size=490480/503808)
[ 0.2923 ] 1: [LNX-1] boot.img.encrypt (size=495616/67092480)
[ 0.2928 ] KFS1: 503808 @ 29508730 SUM 22c0f1c4 over 999424 bytes
 
TegraBoot 中关于 BFS/KFS 的示例日志
此日志显示设备使用哪个 BFS/KFS 副本启动。
在正常情况下,设备从 BFS0 和 KFS0 启动
...
*** 正在启动 BFS0。
...
*** 正在启动 KFS0。
...
如果 BFS0 或 KFS0 启动失败,则切换为从 BFS1 和 KFS1 启动
示例 1
...
*** 故障转移到 BFS1。
...
*** 正在启动 BFS1。
*** 正在启动 KFS1。
...
示例 2
...
*** 故障转移到 KFS1。
...
*** 正在启动 BFS1。
*** 正在启动 KFS1。
...
启动加载程序更新的示例日志
此日志显示启动加载程序更新期间出现的消息,包括 BUP 标头、条目和更新序列。
BLOB 路径
/opt/payloads_t21x/bl_update_payload
 
[R]正在读取 /dev/mmcblk0boot1 的 65,536 字节,偏移量为 4,128,768
VER 编号:320300
[R]正在读取 /dev/mmcblk0boot1 的 65,536 字节,偏移量为 4,063,232
VER_b 编号:320300
blob 版本号:320300
[R]正在读取 /dev/mmcblk0boot0 的 376,832 字节,偏移量为 1,048,576
[R]正在读取 /dev/mmcblk0boot1 的 376,832 字节,偏移量为 0
BLOB 标头
Magic:NVIDIA__BLOB__V2
版本:0x00020000
Blob 大小:9,405,126 字节
标头大小:40 字节
条目计数:56 个分区
类型:0(0 表示更新,1 表示 BMP)
未压缩
Blob 大小:9,405,126 字节
附件:不存在
 
条目表
| part_name | offset | part_size | version | op_mode | tnspec |
| VER_b | 2393331 | 83 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
| BCT64 | 6760 | 10240 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
| NVC-1 | 2394006 | 173344 | 2 | 0 | |
| PT-1 | 2363832 | 4626 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
| TBC-1 | 2567350 | 65856 | 2 | 0 | |
| RP1-1 | 88680 | 490480 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
| EBT-1 | 2633206 | 484304 | 2 | 0 | |
| WB0-1 | 3117510 | 3952 | 2 | 0 | |
| BPF-1 | 3121462 | 3376 | 2 | 0 | |
| TOS-1 | 3124838 | 54208 | 2 | 0 | |
| DTB-1 | 3251062 | 490480 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
| LNX-1 | 5526214 | 495616 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
| EKS-1 | 3179046 | 1028 | 2 | 0 | |
| BCT63 | 6760 | 10240 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
....
| BCT2 | 6760 | 10240 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
| BCT | 6760 | 10240 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
| PT | 2363832 | 4626 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
| TBC | 2567350 | 65856 | 2 | 0 | |
| RP1 | 88680 | 490480 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
| EBT | 2633206 | 484304 | 2 | 0 | |
| WB0 | 3117510 | 3952 | 2 | 0 | |
| BPF | 3121462 | 3376 | 2 | 0 | |
| TOS | 3124838 | 54208 | 2 | 0 | |
| DTB | 3251062 | 490480 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
| LNX | 5526214 | 495616 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
| EKS | 3179046 | 1028 | 2 | 0 | |
| NVC | 2394006 | 173344 | 2 | 0 | |
| VER | 2393331 | 83 | 2 | 0 | 2180-100---1-0-jetson-tx1-mmcblk0p1 |
| BMP | 3180074 | 70988 | 2 | 0 | |
注意:仅显示此系统上可更新的分区,使用“-p”显示有效负载中的所有分区。
注意:分区按照上面显示的顺序从系统顶部到底部写入。
 
开始更新。
 
正在更新分区:VER_b
[R]正在读取 /dev/mmcblk0boot1 的 83 字节,偏移量为 4,063,232
[E]正在擦除 /dev/mmcblk0boot1 的 65,536 字节,偏移量为 4,063,232
[W]正在写入 /dev/mmcblk0boot1 的 83 字节,偏移量为 4,063,232
[R]正在读取 /dev/mmcblk0boot1 的 83 字节,偏移量为 4,063,232
验证成功。
 
…...(正在更新所有分区)……
 
系统可更新的总数据:89 个分区,5,261,054 字节。
写入系统的总数据:68 个分区,664,778 字节。
 
更新成功。