Jetson Xavier NX / AGX Xavier / TX2 更新和冗余

适用于:Jetson Xavier NX 系列、Jetson AGX Xavier 系列和 Jetson TX2 系列
引导加载程序更新过程提供安全的引导加载程序更新,并确保在更新期间,启动存储器上始终保留可用的引导加载程序分区。它通过 A/B 更新来实现这一点,A/B 更新是一种维护两组引导加载程序分区(插槽 A 和插槽 B)的功能,其中一个插槽是一组包含启动镜像的分区。
A/B 冗余是在 A/B 更新之上添加的一项功能。它自动在两个引导加载程序插槽上维护相同的引导加载程序镜像,从而允许系统在当前插槽损坏时从未使用的插槽启动。
A/B 更新和 A/B 冗余降低了引导加载程序更新后以及当前引导加载程序插槽上的镜像损坏时启动失败的风险。
默认情况下,A/B 冗余处于禁用状态。要启用它,请参阅 启用 A/B 冗余

A/B 插槽布局

影子副本的原理允许多个占位符。所有占位符(但一个除外)都保存备份副本。每个副本都构成一个潜在的启动候选对象。但是,根据运行时决策,会加载正确的二进制副本以继续启动过程。这两个影子副本通常被称为插槽 A 和插槽 B。这种双插槽实现如下:
下图给出了插槽实现的概念性示例。
A picture containing text, screenshot, font, number Description automatically generated

A/B 系统更新

A/B 插槽系统更新影响以下组件:
分区选择
A/B 系统更新使用两组分区,称为 插槽。每个插槽都有几个属性:
当前插槽是系统(如果正在运行)从中启动的插槽。另一个插槽称为未使用插槽。系统可能会在更新过程中或当插槽在从当前插槽启动期间或紧随其后反复失败时交换当前插槽和未使用插槽的角色。
活动插槽是下一次启动操作将尝试从中启动的插槽。在正常状态下,活动插槽与可启动插槽相同。当系统正在更新时,它可能会有所不同。
可启动属性指示插槽是否包含可用于启动设备的正确系统。当系统运行时,当前插槽是可启动的;未使用插槽可能具有较旧、相同或较新版本的系统,并且可能是或可能不是可启动的。
成功属性指示系统已尝试从该插槽启动,并且最近一次尝试成功。它由用户空间更新引擎 (UE) 在新更新的插槽首次成功启动到内核时设置。当插槽更新或启动尝试失败时,它会被重置。这通常在系统更新后立即发生,当更新的软件包含错误时。
如果可启动插槽启动失败一定次数,引导加载程序会重置其可启动属性,并交换当前插槽和未使用插槽的角色。以前未使用的、现在是当前插槽的插槽通常是上次更新之前的当前插槽,并且包含用于最近一次成功启动的与启动相关的软件。
插槽状态详细信息在存储在 插槽元数据 (SMD) 分区中的结构中定义:
A screenshot of a cell phone Description automatically generated
其中:
magic 是标识 SMD 分区的固定值。
version 指定插槽中软件的版本号。
num_slots 指定插槽的数量,应为 2。
slot_info 是结构数组,其中包含有关插槽的信息。在每个插槽中:
priority 是此插槽的优先级。
suffix 是一个字符串,可以是“_a”或“_b”,它附加到 A/B 分区的名称以使其唯一。
retry_count 是在引导加载程序重置当前插槽的成功和可启动属性并尝试从未使用插槽启动之前剩余的启动重试次数。
boot_successful 是插槽的成功属性。
可启动插槽是 priorityretry_count 都大于 0 的插槽。
当前插槽是优先级最高且 retry_count 大于 0 的插槽。此插槽在下次电源循环时启动。
更新引擎
A/B 系统更新使用更新引擎来更新 A/B 插槽,并准备系统以启动更新版本的引导加载程序。更新引擎执行以下操作:
1. 读取 bl_update_payload,并按照有效负载的指示将数据写入未使用插槽的分区
2. 在预定义的工作流程中调用 boot_control 接口
3. 切换当前插槽和未使用插槽的角色
4. 重启系统
5. 更新未使用插槽(以前的当前插槽)上的镜像,以确保两个插槽都包含更新
有关更多信息,请参阅:

引导加载程序实现

A/B 系统使用启动插槽元数据来存储插槽状态。它在更新引擎和引导加载程序之间进行通信。引导加载程序运行状态机来选择启动插槽。它按如下方式处理更新失败的情况:
A screenshot of a cell phone Description automatically generated
MB1 使用插槽元数据来查找当前插槽。它将当前插槽号(0(插槽 A)或 1(插槽 B))以及“有效”标志缓存在暂存寄存器 99 中,供 MB2、CBoot 或后续阶段的加载程序使用。
暂存寄存器 99 布局
31-30
29-26
25-22
21-19
18-16
15-0
标志
插槽 A
重试计数
插槽 B
重试计数
最大插槽数
当前插槽号
魔术模式 café
如果 MB1 找不到当前插槽,设备将挂起。
正在加载的分区的名称按如下方式派生:
partition_name = <base_name>_<slot_value>”
插槽值 = “”(对于插槽 0)
插槽值 = “_b”(对于插槽 1)
分区设置
所有 A/B 分区都必须按如下方式命名:
mb1
mb1_b
mb2
mb2_b
cboot
cboot_b
etc
插槽 A 的空后缀是为了确保向后兼容传统的不感知 A/B 的分区加载机制。
更新引擎状态
更新引擎 (UE) nv_update_engine 使用插槽元数据来指示引导加载程序从哪个插槽启动。以下场景标识了所有 UE 状态。
正常状态
系统已从当前插槽启动,当前插槽可能是插槽 A 或插槽 B。
尚未应用任何更新。
当前插槽是可启动且成功的,并且是活动插槽。
下表显示了系统在正常状态下(插槽 B 为当前插槽)的状态。插槽 A 是未使用插槽,因为其优先级低于插槽 B。
插槽
优先级
重试计数
成功
插槽 A
14
7
1
插槽 B
15
7
1
正在更新
系统已从当前插槽启动。它正在更新未使用插槽。
当前插槽是可启动且成功的,并且是活动插槽。
未使用插槽不可启动,因为它正在更新,并且更新尚未完成。
下表显示了系统在插槽 B 为当前插槽且正在更新插槽 A 的状态。如果系统必须在此状态下重启,它将从插槽 B 重启。
插槽
优先级
重试计数
成功
插槽 A
0
0
0
插槽 B
15
7
1
更新已应用,重启挂起
即将切换现在的当前插槽和未使用插槽的角色。因此,系统将尝试从现在的未使用插槽启动。
现在的未使用插槽被标记为可启动,并成为活动插槽,但尚未标记为成功。
引导加载程序会尝试从新更新的插槽启动若干次。
下表显示了系统在插槽 A 上应用了更新并且重启挂起(从插槽 A 重启)的状态。
插槽
优先级
重试计数
成功
插槽 A
15
7
0
插槽 B
14
7
1
系统重启进入新的更新
系统首次从新更新的、现在的当前插槽启动。
以前的当前插槽(现在的未使用插槽)仍然是可启动且成功的,而现在的当前插槽是可启动的并且是活动插槽,但不是成功的。
更新引擎在成功启动和一些系统检查后,将现在的当前插槽标记为成功。
下表显示了系统正在从插槽 A 上的新更新启动的状态。
插槽
优先级
重试计数
成功
插槽 A
15
6
0
插槽 B
14
7
1
插槽复制正在进行中
系统首次从新更新的插槽启动。
以前的当前插槽(现在的未使用插槽)被标记为不可启动,因为它正在更新。
如果系统必须在此状态下重启,它将从新更新的、现在的当前插槽启动。
下表显示了系统正在进行从插槽 A 到插槽 B 的插槽复制的状态。
插槽
优先级
重试计数
成功
插槽 A
15
6
0
插槽 B
0
0
0
插槽复制完成
系统首次从当前插槽启动,并将当前插槽复制到未使用插槽。
当前插槽被标记为可启动且成功。未使用的新复制插槽被标记为可启动且成功,但优先级较低。
下表显示了系统已完成从插槽 A 到插槽 B 的插槽复制的状态。
插槽
优先级
重试计数
成功
插槽 A
15
7
1
插槽 B
14
7
1
启动失败和恢复
由于数据损坏或 I/O 错误,系统无法从当前插槽启动。
在尝试从当前插槽启动失败若干次后,引导加载程序将当前插槽标记为不可启动,并从未使用插槽启动。
下表显示了系统从插槽 A 启动失败并通过从插槽 B 启动恢复的状态。
插槽
优先级
重试计数
成功
插槽 A
0
0
0
插槽 B
14
7
1
在此状态下,不允许更新引擎复制插槽。在系统更新现在的未使用插槽并从中成功启动之前,不允许复制。更新引擎也不允许修改分区表或未分配给插槽 A 或 B 的分区的内容。

何时启动更新引擎

更新引擎在以下情况下启动:
6. 用户显式启动以使用较新版本更新分区,命令为:
$ sudo nv_update_engine --install
更新引擎在更新期间应用引导加载程序更新有效负载 (BUP)。BUP 必须命名为 bl_update_payload,并且必须放置在:
/opt/ota_package
7. 在系统启动期间,启动服务启动更新引擎,命令为:
$ sudo nv_update_engine --verify
更新引擎加载插槽元数据,评估当前状态,并运行预定义的工作流程。在正常启动中,更新引擎处于正常启动状态,其中未应用更新,也不需要复制。更新引擎只是退出。

启用 A/B 冗余

有两种启用 A/B 冗余的方法:
创建 SMD 镜像并设置冗余设置。
使用 nv_update_engine 工具启用冗余。
Jetson Linux 可以使用单个文件系统分区启用 A/B 冗余,即无需 rootfs 冗余。但是,要获得 A/B 冗余的全部优势,您还必须启用 root 文件系统冗余。有关更多信息,请参阅 设置文件系统 部分中的主题 设置文件系统
要通过创建 SMD 镜像来启用冗余:
1. 修改 SMD 配置文件 smd_info.cfg 以启用 A/B 插槽。
2. 在 x86 系统上运行主机工具 nv_smd_generator,以使用更新的 SMD 配置文件生成 SMD 镜像。
有关生成 SMD 镜像的说明,请查阅 SMD 镜像生成器
3. 运行 flash.sh 脚本以对设备执行包含所有分区的全新闪存。
要使用 nv_update_engine 启用冗余:
在目标系统上,启动 nv_update_engine 工具,以对使用禁用了 A/B 的 SMD 镜像刷写的设备启用 A/B。
有关说明,请查阅 运行更新引擎

引导加载程序工具

NVIDIA 提供了以下工具,以便于使用引导加载程序更新过程。
启动控制
nvbootctrl 工具旨在用于调试目的,以加载 SMD 镜像并转储插槽信息。它还可用于设置活动插槽,以强制更改下次启动时的启动插槽。
要显示命令用法:
输入命令:
$ sudo nvbootctrl
引导加载程序更新有效负载生成器
引导加载程序更新有效负载 (BUP) 是更新引擎在更新期间应用的有效负载。BUP 由主机脚本 build_l4t_bup.sh 生成,该脚本与 Jetson 板级支持包 (BSP) 的 Linux 中的 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 目录进行解释。
-p <options> 指定一个字符串,其中包含要传递给 flash.sh 以生成 BUP 的命令行选项。如果该字符串包含空格字符,则必须用引号括起来。
-d 使脚本在调试模式下运行,这会将所有启动固件 blob 镜像保存在 bootloader/signedbootloader/multi-signed
<processor> 对于 Jetson AGX Xavier 系列设备为 t19x,对于 Jetson TX2 系列设备为 t18x
该过程将 BUP 存储在文件:
<top>/bootloader/<payload_dir>/bl_update_payload
其中 <payload_dir> 是适用于特定类型的 Jetson 或 Tegra® 处理器的 BUP 目录。有关更多信息,请参阅BUP 文件存储位置下方
有关生成 BUP 的更多信息,请参阅 生成引导加载程序更新有效负载 (BUP)
要生成单规范 BUP:
输入命令:
$ sudo [env={value}, …] ./build_l4t_bup.sh [options] <board> <rootdev>
其中:
<board> 是您的 Jetson 模块和配置的 $(BOARD) 值,如主题 快速入门 中的表 Jetson 模块和配置 中所示。
<rootdev> 是要刷写 root 文件系统的分区。
该过程将 BUP 存储在文件:
<top>/bootloader/<payload_dir>/bl_update_payload
其中 <payload_dir> 是适用于特定类型的 Jetson 或 Tegra 处理器的 BUP 目录。有关更多信息,请参阅BUP 文件存储位置下方
有关生成 BUP 的更多信息,请参阅 生成引导加载程序更新有效负载 (BUP)
BUP 文件存储位置
这两个过程都将 BUP 文件存储在:
<top>/bootloader/<payload_dir>/bl_update_payload
其中 <payload_dir> 是:
对于 Jetson Xavier NX 系列和 Jetson AGX Xavier 系列设备:payloads_t19x
对于 Jetson TX2 系列设备:payloads_t18x
对于 Jetson Nano 和 Jetson TX1 设备:payloads_t21x
多规范过程在这些位置中的每一个位置为相应的处理器组存储一个 BUP。单规范过程仅在一个位置为相应类型的处理器存储一个 BUP。
您必须在运行更新引擎之前将 BUP 文件放置在目标系统下的此目录中:
/opt/ota_package/
SMD 镜像生成器
在 X86 主机系统上运行 nv_smd_generator 工具以生成默认 SMD 镜像 slot_metadata.bin,该镜像被刷写到 SMD 分区中。
要启动镜像生成器:
输入命令:
$ nv_smd_generator <config_file> <output_file>
其中:
<config_file> 是 SMD 配置文件。
<output_file>slot_metadata.bin 输出 SMD 镜像。
例如:
$ sudo nv_smd_generator smd_info.cfg slot_metadata.bin
在 Jetson 板级支持包的 Linux 中,nv_smd_generator、默认 SMD 配置文件 smd_info.cfg 和默认镜像文件 slot_metadata.bin 安装在目录:
<top>/bootloader
默认情况下,smd_info.cfg 配置文件设置为插槽 A 是唯一可用的插槽。这有效地禁用了冗余。
< VERSION 4 >
# 设置最大启动插槽重试计数
# 请确保在插槽信息配置之前设置此字段
< MAX_BL_RETRY_COUNT 7 >
#
# 配置 1:禁用 A/B 支持(默认)
#
 
# 插槽信息顺序很重要!
# <priority> <suffix> <boot_successful>
15 _a 1
 
#
# 配置 2:启用冗余支持(通过删除注释 ##)
#
##< REDUNDANCY_USER 1 >
#
# 要禁用引导加载程序自动同步,请使用 < BL_AUTOSYNC_DISABLE 1>
# 必须在 BL_AUTOSYNC DISABLE 之前定义 REDUNDANCY_ENABLE 或 REDUNDANCY_USER!
##< BL_AUTOSYNC_DISABLE 1 >
 
# 插槽信息顺序很重要!
# <priority> <suffix> <boot_successful>
##15 _a 1
##14 _b 1
使用配置 2 创建 SMD 镜像并启用 A/B 冗余。
要启用 A/B 更新和 A/B 冗余:
1. 注释掉禁用 A/B 更新的配置,方法是在 配置 1 下面的参数行开头添加“#”
15 _a 1
2. “取消注释”启用 A/B 更新的配置,方法是从 配置 2 下面的参数行开头删除“##”
##15 _a 1
##14 _b 1
现在,与引导加载程序相关的分区、kernel 分区和 kernel-dtb 分区都具有 A/B 插槽。
3. 如果要同时启用 A/B 冗余和 A/B 更新,请取消注释 <REDUNDANCY_USER x> 语句。将 x 替换为指定所需冗余支持类型的数字:
0:仅支持引导加载程序处的冗余,即从 mb1mb2cboot
1:支持引导加载程序、kernelkernel-dtb 分区上的镜像的冗余。
4. 默认情况下启用引导加载程序插槽复制。您可以通过取消注释以下配置来禁用它:
##< BL_AUTOSYNC_DISABLE 1 >
最大启动插槽重试计数
MAX_BL_RETRY_COUNT 指定最大启动插槽重试计数。其默认值为 7。您可以设置介于 0 和 7 之间的任何值。

运行更新引擎

在目标系统上运行更新引擎脚本。
要启用/禁用 A/B 冗余:
输入此命令以启用冗余:
$ sudo nv_update_engine –-enable-ab
输入此命令以禁用冗余:
$ sudo nv_update_engine –-disable-ab
如果当前启动插槽不是 0,则命令失败。
要更新引导加载程序:
5. 输入此命令以切换到超级用户模式:
$ sudo su
6. 启用 A/B 冗余(一次性命令):
$ nv_update_engine --enable-ab
7. 如果 BUP 目录不存在,请通过执行以下命令创建一个:
$ mkdir /opt/ota_package
8. 使用以下命令将 BUP 从主机系统复制到新创建的 BUP 目录:
$ scp <host_loc:bl_update_payload> /opt/ota_package/
其中:
<host_loc:bl_update_payload> 是 BUP 在主机系统上构建的位置。您也可以使用 USB 密钥将 BUP 从主机系统复制到目标系统。
有关如何生成 BUP 的信息,请参阅 生成引导加载程序更新有效负载
9. 启动更新引擎以在非当前插槽上更新引导加载程序,命令为:
$ nv_update_engine --install

更新引擎状态机

更新引擎状态机流程如下:
Diagram, schematic Description automatically generated

手动修改启动插槽

NVIDIA 提供 nvbootctrl 工具用于测试和开发目的。但是,您可能希望手动更改启动插槽或从用户空间对 SMD 分区进行修改。
要手动修改启动插槽:
1. 输入此命令以切换到超级用户模式:
$ sudo su
2. 输入此命令:
$ nvbootctrl <command>
其中 <command> 如下:
插槽 0 和插槽 1 的默认设置均为“可启动”,其中插槽 0 具有更高的优先级。
命令
描述
get-number-slots
打印插槽数量。
get-current-slot
打印当前运行的插槽。
mark-boot-successful
将当前插槽标记为良好 (GOOD)。
set-active-boot-slot <slot>
在下次启动时,加载并执行 <slot>
set-slot-as-unbootable <slot>
将插槽标记为无效。
is-slot-bootable <slot>
如果插槽可启动,则返回 0。
is-slot-marked-successful <slot>
如果插槽标记为良好,则返回 0。
get-suffix <slot>
打印 <slot> 的后缀。
is-autosync-enabled
打印插槽复制的启用状态(默认情况下已启用)。
toggle-autosync
切换插槽复制的启用状态。
dump-slots-info
打印插槽的信息。
<slot> 是从零开始的插槽号。
要显示当前启动插槽:
输入此命令:
root@tegra-ubuntu:/home/nvidia# nvbootctrl get-current-slot
0
root@tegra-ubuntu:/home/nvidia#
要显示插槽状态:
输入以下命令之一:
在启用 A/B 冗余之前:
root@tegra-ubuntu:/home/nvidia# nvbootctrl dump-slots-info
magic:0x43424e00, version: 3 features: 0 num_slots: 1
slot: 0, priority: 15, suffix: _a, retry_count: 7, boot_successful: 1
slot: 1, priority: 0, suffix: , retry_count: 0, boot_successful: 0
root@tegra-ubuntu:/home/nvidia#
在启用 A/B 冗余之后:
root@tegra-ubuntu:/home/nvidia# nvbootctrl dump-slots-info magic:0x43424e00, version: 3 features: 3 num_slots: 2
slot: 0, priority: 15, suffix: _a, retry_count: 7, boot_successful: 1
slot: 1, priority: 14, suffix: _b, retry_count: 7, boot_successful: 1
root@tegra-ubuntu:/home/nvidia#

示例启动日志

启动插槽由 MB1 选择。以下示例日志显示插槽 1 被选为启动插槽。从 MB1 显示的消息可从启用了消息的 MB1 调试版本中获得。MB2 的消息始终可用。
[0000.040] I> Welcome to MB1-coldboot(dev-version : 14.00.170822-t186-M-00.00-96e265a3)
[0000.048] I> rst_source : 0xb
[0000.051] I> rst_level : 0x1
[0000.053] I> Read lock all AES keyslots
[0000.057] I> Read lock all RSA keyslots
[0000.061] I> 清除 BR 遗留的未关闭 SE 密钥槽
[0000.065] I> 上次 mts-fallback 状态:0x00000000
[0000.070] I> 启动设备:eMMC
[0000.094] I> sdmmc ddr50 模式
[0000.098] I> A/B:bin_type (19) 插槽 0
[0000.102] I> 大小为 512 的二进制文件 (19) 已加载 @ 0x40043400
[0000.108] I> 选择的启动链:1
[0000.111] I> 选择的启动链:1
[0000.114] I> magic:0x43424e00, version: 259, num_slots: 2
[0000.119] I> 插槽:0,优先级:14,后缀:_a,重试:7,启动成功:1
[0000.125] I> 插槽:1,优先级:15,后缀:_b,重试:6,启动成功:1
[0000.131] I> 正在加载 MB1-BCT 到 SysRAM
[0000.135] I> A/B:bin_type (0) 插槽 1
[0000.138] I> 启动设备:eMMC
. . .
. . .
[0000.888] I> 欢迎来到 MB2(TBoot-BPMP)(版本:01.00.160913-t186-M-00.00-mobile-09b4fbd4)
[0000.897] I> 默认堆 @ [0xd486400 - 0xd488400]
[0000.901] I> DMA 堆 @ [0x84a00000 - 0x85300000]
[0000.906] I> 位 @ 0xd480000
[0000.909] I> BR-BCT 重定位到 0xd7020000
[0000.913] I> 启动设备:eMMC
[0000.917] I> sdmmc bdev 已初始化
[0000.922] I> pmic:复位原因 (nverc) : 0x0
[0000.926] I> 正在从设备 00000003 的 512 读取 GPT
[0000.932] I> 正在从设备 00000003 的 8388096 读取 GPT
[0000.939] I> 在设备 00000003 中找到 13 个分区
[0000.944] I> 正在从设备 00010003 的 512 读取 GPT
[0000.950] I> 在设备 00010003 中找到 27 个分区
[0000.956] I> A/B:bin_type (16) 插槽 1
[0000.959] I> 正在加载分区 bpmp-fw_b,地址为 0xd7800000
[0000.964] I> 正在读取两个标头 - addr:0xd7800000 blocks:1
[0000.970] I> 地址:0xd7800000,起始块:58762425,块数:1
[0000.985] I> 大小为 528848 的二进制文件 (16) 已加载 @ 0xd7800000
. . .
. . .

生成引导加载程序更新有效负载 (BUP)

引导加载程序更新有效负载 (BUP) 用于实现引导加载程序更新。它包含更新 Jetson 设备所需的每种类型的固件二进制文件。
本节介绍生成单规格 BUP 的步骤,该 BUP 仅包含每种类型的一个二进制文件,并且可用于仅更新一个 Jetson 设备配置。
还有一种生成多规格 BUP 的步骤,其中包括每种类型的多个固件二进制文件和 BCT 映像,并且可用于更新任何受支持类型的 Jetson 设备。当您运行更新程序时,它会为正在更新的设备使用每种类型的适当二进制文件。有关信息,请参阅生成多规格 BUP部分,以及下方的内容
要生成单规范 BUP:
输入以下命令以创建 BUP 映像,以便存储在未连接到主机系统的板的文件中。
对于指示的 FAB/BOARDID/FUSELEVEL Jetson Xavier NX 系列板
$ cd <top>
$ sudo FAB=100 BOARDID=3668 FUSELEVEL=fuselevel_production BOARDSKU=0001./build_l4t_bup.sh jetson-xavier-nx-devkit-emmc mmcblk0p1
对于指示的 FAB/BOARDID/FUSELEVEL Jetson AGX Xavier 系列板
$ cd <top>
$ sudo FAB=400 BOARDID=2888 FUSELEVEL=fuselevel_production BOARDSKU=0001 BOARDREV=H.0 ./build_l4t_bup.sh jetson-agx-xavier-devkit mmcblk0p1
对于指示的 FAB/BOARDID/FUSELEVEL Jetson TX2 板
$ cd <top>
$ sudo FAB=C04 BOARDID=3310 FUSELEVEL=fuselevel_production ./build_l4t_bup.sh jetson-tx2-devkit mmcblk0p1
输入以下命令以创建连接到主机系统的板的 BUP 映像
1. 将目标板置于强制恢复模式
2. 输入以下命令
$ cd <top>
$ sudo ./build_l4t_bup.sh <device> mmcblk0p1
其中 <device>
对于 Jetson Xavier NX 系列:jetson-xavier-nx-devkit-emmc
对于 Jetson AGX AGX Xavier 系列:jetson-agx-xavier-devkit
对于 Jetson TX2 系列:jetson-tx2-devkit
输入以下命令以针对指示的 FAB/BOARDID/FUSELEVEL Jetson TX2 板创建 PKC 签名 BUP 映像
$ cd <top>
$ sudo FAB=C04 BOARDID=3310 FUSELEVEL=fuselevel_production ./build_l4t_bup.sh -s <pkc_key_file> jetson-tx2-devkit mmcblk0p1
其中:
目标是原始 Jetson TX2 板。如需在 Jetson TX2 系列的其他板上生成 BUP 的帮助,请联系 NVIDIA。
<top> 是 PDK 安装包父目录的位置,flash.sh 命令位于该目录中。
<pkc_key_file> 是您板的 RSA 私钥文件。它必须位于 <top>/bootloader 目录下,或者由完整的(绝对)路径名指定。
输入以下命令以针对连接到主机系统的板创建 PKC 签名 BUP 映像
1. 将目标板置于强制恢复模式
2. 输入以下命令:
$ cd <top>
$ sudo ./build_l4t_bup.sh -u <pkc_key_file> [‑v <sbk_key_file>] <device> mmcblk0p1
其中:
<top> 是 PDK 安装包父目录的位置,flash.sh 命令位于该目录中。
<pkc_key_file> 是您板的 RSA 私钥文件。它必须位于 <top>/bootloader 目录下或完整的(绝对)路径名。
<sbk_key_file> 是您 Jetson 载板的安全启动密钥 (SBK) 密钥文件。
可以省略 ‑v 选项。如果省略,则脚本将生成仅包含PKC 密钥的 BUP。如果存在,则脚本将生成包含 PKC 密钥和 SBK 密钥的 BUP。
<device>
对于 Jetson Xavier NX 系列:jetson-xavier-nx-devkit-emmc
对于 Jetson AGX Xavier 系列:jetson-agx-xavier-devkit
对于 Jetson TX2 系列:jetson-tx2-devkit
要生成多规范 BUP:
主题Jetson Nano / TX1 更新和冗余中的生成引导加载程序更新有效负载 (BUP)部分介绍了生成多规格 BUP 的步骤。当您运行更新程序时,它会为正在更新的设备使用每种类型的适当二进制文件。
要将多规格 BUP 步骤用于 Jetson Xavier NX 系列或 Jetson AGX Xavier 系列设备,请在生成 BUP 的命令中将 t21x 替换为 t19x。要将该步骤用于 Jetson TX2 系列设备,请将 t21x 替换为 t18x
注意
l4t_generate_soc_bup.sh 脚本仅针对 t19x 和 t18x 处理器支持额外的选项 ‑v <sbk_key_file>。此选项指定您的 Jetson 载板的安全启动密钥 (SBK) 密钥文件。它是可选的。