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。这必须是第二个启动分区。以下启动分区 PT 到 SPF 是 BFS 的一部分。
• PT 包含每个 BFS 的布局信息,并指示每个 BFS 的开始位置。它是 BFS 中的第一个分区。
• TBC 包含 TegraBoot CPU 端二进制文件。
• RP1 包含 TegraBoot DTB。
• EBT 包含 CBoot。
• WB0 包含 warm boot 二进制文件。
• BPF 包含 BPMP 微码。
• NVC‑1 包含 NVC 的副本。
• PT‑1 到 BPF‑1 是主分区 NVC 到 BPF 的副本分区,构成 BFS 的副本,表示为 BFS‑1。
• PAD 是一个空分区,用于确保 VER 和 VER_b 位于启动分区的末尾。
• VER_b 包含用于冗余和版本检查的附加版本信息。
• VER 包含版本信息。
2. GP1 包含 sdmmc_user 设备的主 GPT。在此之后定义的所有分区都在 Linux 内核中配置,并且可以通过标准分区工具(例如 gdisk 和 parted)访问。
3. 用户分区,具有多种用途。其中一些可以删除,和/或可以挂载并用于存储应用程序文件。
以下分区构成 kernel-file-set (KFS),并具有冗余副本分区
• DTB 包含内核 DTB。
• TOS 包含可信操作系统二进制文件。
• EKS 是可选的,保留供将来使用。
• LNX 包含 Linux 内核或 U-Boot,具体取决于配置文件中 DFLT_KERNEL_IMAGE 的选择。
• DTB‑1 到 EKS‑1 构成主 KFS 的副本,表示为 KFS‑1。
• 其他分区,例如
APP 和
BMP,不在本文档的范围内。有关这些分区的更多信息,请参阅
默认分区概述 中适用于您的 Jetson 平台的相应小节。
总之,分区配置文件的总体布局是
BCT
NVC
启动文件集 (BFS):PT、TBC、RP1、EBT、WB0、BPF
NVC-1
启动文件集副本 (BFS-1):PT-1、TBC-1、RP1-1、EBT-1、WB0-1、BPF-1
PAD
VER_b
VER
GP1
APP(此处未描述)
内核文件集 (KFS):DTB、TOS、EKS、LNX
内核文件集副本 (KFS-1):DTB-1、TOS-1、EKS-1、LNX-1
BMP 和其他(此处未描述)
当内核启动时,启动分区在这些设备上受到写保护的约束
分区 | 设备名称 |
---|
BCT、NVC 和 BFS | /dev/mmcblk0boot0 |
NVC‑1、BFS‑1、VER_b 和 VER | /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/signed 和 bootloader/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。
3. 从 BCT_63 向下更新到 BCT_1。
4. 更新 BFS 和 KFS。
5. 更新 NVC。
NVC 最后更新,以便在 BFS 路径准备就绪之前不启用 BCT_1 → NVC 和 BCT_2 → NVC 路径。
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 字节。
更新成功。