Over-the-Air 更新
Over-the-Air (OTA) 更新使您能够更新 NVIDIA® Jetson™ 设备和用于 Jetson 开发的主机。
Jetson Linux 支持两种形式的 OTA,用于不同的目的。基于 Debian 软件包管理的 OTA 可以更新运行 Jetson Linux 的 Jetson 设备或主机上的 Jetson 组件。基于镜像的 OTA 使您可以创建 OTA 有效负载软件包,并且可以按分区更新 Jetson 设备上运行的完整镜像。本主题介绍这两种形式的 OTA。
从 NVIDIA APT 服务器更新
第一种形式的 OTA 更新使用从 NVIDIA APT 服务器获取的 Debian 软件包。您可以使用这种形式的 OTA 更新来更新运行 Jetson Linux 的 Jetson 设备,或者更新安装在运行 Ubuntu 的主机上的 Jetpack 组件。APT 服务器为每种目的维护各自的 Debian 软件包组。
本节介绍为 Jetson Linux 提供基本支持的工具和软件包。
注意 | 您不能使用 OTA 更新来更新安装了 Jetpack 的 Jetson 设备。 要在同时安装了 JetPack 和 Jetson Linux 组件的系统上将它们更新到新的 JetPack 版本,请参阅 JetPack 文档 中的说明。 NVIDIA 不建议在早于 32.3.1 版本的 Jetson Linux 版本或基于 Ubuntu 但未自定义 Jetson Linux 的系统上安装 OTA Debian 软件包。 |
更新 Jetson 设备
使用以下适当的步骤来更新您的系统
更新到新的点版本
1. 输入命令
$ sudo apt update
apt 从远程 APT 存储库读取软件包列表,并识别新的和可升级的软件包。
2. 输入命令
apt list --upgradable
apt 显示新的和可升级的软件包列表。
3. 要安装 Jetson Linux 的基本软件包,请输入命令
sudo apt upgrade
4. 升级完成后,重启您的 Jetson 设备。
更新到新的小版本
1. 在文本编辑器中打开 apt 源配置文件,例如
$ sudo vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list
2. 更改 deb 命令中的存储库名称和下载 URL。
原始命令是
deb https://repo.download.nvidia.com/jetson/common <release> main
deb https://repo.download.nvidia.com/jetson/<platform> <release> main
其中
• <release> 是您要更新到的小版本的版本号。例如,要更新到小版本 32.2, 将 r32 替换为 r32.2。OTA 更新到指定小版本的最新点版本(在本例中为版本 32.2.1)。
• <platform> 标识平台的处理器
• t186 用于 NVIDIA® Jetson™ TX2 系列
• t194 用于 NVIDIA® Jetson AGX Xavier™ 系列或 Jetson Xavier NX 系列
• t210 用于 NVIDIA® Jetson Nano™ 设备或 Jetson TX1
例如,如果当前版本是 32.4,并且您的平台是 Jetson Xavier NX 系列,则命令将是
deb https://repo.download.nvidia.com/jetson/common r32.4 main
deb https://repo.download.nvidia.com/jetson/t194 r32.4 main
3. 保存并关闭源配置文件。
4. 输入命令
$ sudo apt update
$ sudo apt dist-upgrade
如果 apt 提示您选择配置文件,请回复 Y 表示 是 (使用 NVIDIA 更新后的文件版本)。
5. 升级完成后,重启您的 Jetson 设备。
注意 | do-release-upgrade 命令已禁用,因为 Jetson Linux 目前不正式支持 20.04 版本。 |
更新主机
NVIDIA 提供了一组 Debian 软件包,用于在主机上添加或更新 Jetson Linux 支持组件。
准备主机以安装 Jetson Linux 支持组件
1. 输入此命令以安装公共 APT 服务器的 x86_64 存储库的公钥
$ sudo apt-key adv --fetch-key https://repo.download.nvidia.com/jetson/jetson-ota-public.asc
2. 将以下 x86_64 存储库添加到主机的源列表
• 对于 Ubuntu 16.04 主机
deb http://repo.download.nvidia.com/jetson/x86_64/xenial <relno> main
• 对于 Ubuntu 18.04 主机
deb http://repo.download.nvidia.com/jetson/x86_64/bionic <relno> main
其中 <relno> 是当前版本的完整版本号,如发行说明中所述。
3. 输入命令
$ sudo apt update
4. 使用 apt 下载并安装所需的软件包。对于 Ubuntu 16.04 主机
$ sudo apt-get install nsight-graphics-for-embeddedlinux-2021.2.1 nsight-systems-2021.2.3 cuda-toolkit-10-2 cuda-cross-aarch64-10-2 libvisionworks libvisionworks-dev libvisionworks-samples libvisionworks-sfm libvisionworks-sfm-dev libvisionworks-tracking libvisionworks-tracking-dev libnvvpi1 vpi1-dev vpi1-samples vpi1-cross-aarch64-l4t
• 对于 Ubuntu 18.04 主机
$ sudo apt-get install nsight-graphics-for-embeddedlinux-2021.2.1 nsight-systems-2021.2.3 cuda-toolkit-10-2 cuda-cross-aarch64-10-2 libvisionworks libvisionworks-dev libvisionworks-samples libvisionworks-sfm libvisionworks-sfm-dev libvisionworks-tracking libvisionworks-tracking-dev libnvvpi1 vpi1-dev vpi1-samples vpi1-cross-aarch64-l4t
NVIDIA APT 服务器上的 Debian 软件包
本节列出了 NVIDIA APT 服务器上为 Jetson 设备或主机维护的 Debian 软件包。
Jetson 设备的更新软件包
以下是截至 Jetson Linux 32.7 版本的 Jetson 设备上 BSP 的 OTA 更新软件包列表。
有关其他 OTA 软件包的列表以及应用它们的说明,请参阅
JetPack 用户指南中的“JetPack OTA 软件包列表”部分。
组件组 | 软件包 |
---|
BSP | jetson-gpio-common nvidia-l4t-3d-core nvidia-l4t-apt-source nvidia-l4t-bootloader nvidia-l4t-camera nvidia-l4t-configs nvidia-l4t-core nvidia-l4t-cuda nvidia-l4t-firmware nvidia-l4t-graphics-demos nvidia-l4t-gstreamer nvidia-l4t-init nvidia-l4t-initrd nvidia-l4t-jetson-io | nvidia-l4t-jetson-multimedia-api nvidia-l4t-kernel nvidia-l4t-kernel-dtbs nvidia-l4t-kernel-headers nvidia-l4t-multimedia nvidia-l4t-multimedia-utils nvidia-l4t-oem-config nvidia-l4t-tools nvidia-l4t-wayland nvidia-l4t-weston nvidia-l4t-x11 nvidia-l4t-xusb-firmware python-jetson-gpio python3-jetson-gpio |
注意 | Jetson AGX Xavier Industrial 不支持这些更新软件包,因为其分区布局已更改。 |
主机的更新软件包
下表列出了您可以在主机上使用 apt 安装的 Jetson Linux 支持组件,以及包含它们的软件包。
组件组 | 软件包 |
CUDA | cuda cuda-10-2 cuda-command-line-tools-10-2 cuda-compat-11-0 cuda-compiler-10-2 cuda-cudart-10-2 cuda-cudart-dev-10-2 cuda-cuobjdump-10-2 cuda-cupti-10-2 cuda-cupti-dev-10-2 cuda-demo-suite-10-2 cuda-documentation-10-2 cuda-driver-dev-10-2 cuda-drivers cuda-drivers-450 cuda-gdb-10-2 cuda-gdb-src-10-2 cuda-libraries-10-2 cuda-libraries-dev-10-2 cuda-memcheck-10-2 cuda-minimal-build-10-2 cuda-nsight-10-2 cuda-nsight-compute-10-2 cuda-nsight-systems-10-2 cuda-nvcc-10-2 cuda-nvdisasm-10-2 cuda-nvgraph-10-2 cuda-nvgraph-dev-10-2 cuda-nvml-dev-10-2 cuda-nvprof-10-2 cuda-nvprune-10-2 cuda-nvrtc-10-2 cuda-nvrtc-dev-10-2 cuda-nvtx-10-2 cuda-nvvp-10-2 cuda-runtime-10-2 cuda-samples-10-2 cuda-sanitizer-10-2 cuda-toolkit-10-2 cuda-tools-10-2 cuda-visual-tools-10-2 libcublas-dev libcublas10 libcuda1-375 libcuda1-450 | libcufft-10-2 libcufft-dev-10-2 libcurand-10-2 libcurand-dev-10-2 libcusolver-10-2 libcusolver-dev-10-2 libcusparse-10-2 libcusparse-dev-10-2 libnpp-10-2 libnpp-dev-10-2 libnvidia-cfg1-450 libnvidia-common-450 libnvidia-compute-450 libnvidia-decode-450 libnvidia-encode-450 libnvidia-extra-450 libnvidia-fbc1-450 libnvidia-gl-450 libnvidia-ifr1-450 libnvjpeg-10-2 libnvjpeg-dev-10-2 libxnvctrl-dev libxnvctrl0 nsight-compute-2019.5.3 nsight-systems-2021.1.3 nvidia-375 nvidia-375-dev nvidia-450 nvidia-450-dev nvidia-compute-utils-450 nvidia-dkms-450 nvidia-driver-450 nvidia-headless-450 nvidia-headless-no-dkms-450 nvidia-kernel-common-450 nvidia-kernel-source-450 nvidia-libopencl1-375 nvidia-libopencl1-450 nvidia-modprobe nvidia-opencl-icd-375 nvidia-opencl-icd-450 nvidia-settings nvidia-utils-450 xserver-xorg-video-nvidia-450 |
CUDA 交叉编译软件包 (主机) | cuda-cross-aarch64 cuda-cross-aarch64-10-2 cuda-cudart-cross-aarch64-10-2 cuda-cupti-cross-aarch64-10-2 cuda-driver-cross-aarch64-10-2 cuda-nsight-compute-addon-l4t-10-2 cuda-nvcc-cross-aarch64-10-2 cuda-nvgraph-cross-aarch64-10-2 cuda-nvml-cross-aarch64-10-2 cuda-nvprof-cross-aarch64-10-2 cuda-nvrtc-cross-aarch64-10-2 cuda-nvtx-cross-aarch64-10-2 libcublas-cross-aarch64 libcufft-cross-aarch64-10-2 libcurand-cross-aarch64-10-2 libcusolver-cross-aarch64-10-2 libcusparse-cross-aarch64-10-2 libnpp-cross-aarch64-10-2 nsight-compute-addon-l4t-2019.5.3 |
计算机视觉 (VisionWorks) | libvisionworks libvisionworks-dev libvisionworks-samples libvisionworks-sfm libvisionworks-sfm-dev libvisionworks-tracking libvisionworks-tracking-dev |
计算机视觉 (VPI) | libnvvpi1 vpi1-cross-aarch64-l4t vpi1-demos vpi1-dev vpi1-samples |
自定义 Debian 软件包
您可以自定义 Debian 软件包以帮助您实施解决方案,例如添加对您的载板的支持。有关更多信息,请参阅
重新打包 Debian 软件包 和
自行构建 Debian 引导加载程序软件包,主题为
BSP 自定义。
下载 Debian 软件包以供后续使用
作为从 APT 服务器在 Jetson 设备或主机上安装 Debian 软件包的替代方法,您可以下载软件包并存储它们,稍后您可以手动安装它们。
要下载软件包,请在 Web 浏览器中打开
https://repo.download.nvidia.com/jetson/。此 URL 显示每个 Jetpack 版本的 Debian 软件包列表。每个软件包名称都是一个超链接;要下载软件包,请单击其链接。
使用基于镜像的 Over-the-Air 更新更新 Jetson Linux
适用于:仅限 Jetson Xavier NX 系列、Jetson AGX Xavier 系列和 Jetson TX2 系列
基于镜像的 Over-the-Air 更新是一种通过将预生成的镜像写入分区来更新 Jetson 设备上的 BSP 的安全方法。它可以将许多旧的 BSP 版本更新到较新的版本。
基于镜像的 OTA 还进一步支持在具有不同分区布局的版本之间进行更新,这需要在更新过程中更改布局。此类更新的一个示例是从 Jetson Linux 版本 28.3 更新到版本 32.7。
基于镜像的 OTA 当前支持从以下早期版本更新到当前版本 32.7。您可以调整此过程以更新到其他版本。
更新到 Jetson Linux 版本 32.7 |
---|
载板 | 模块 | 从版本 |
---|
NVIDIA Jetson TX2 | 仅限原始 Jetson TX2 模块 | 28.2 28.3 28.4 32.1 32.2 32.3 32.4 32.5 32.6 |
NVIDIA Jetson TX2 NX | Jetson TX2 NX 模块 | 32.5 32.6 |
NVIDIA® Jetson AGX Xavier™ | 所有 Jetson AGX Xavier 系列模块 | 32.1 32.2 32.3 32.4 32.5 32.6 |
NVIDIA Jetson Xavier NX | 所有 Jetson Xavier NX 系列模块 | 32.4 32.5 32.6 |
注意 | 基于镜像的 OTA 旨在更新多个 Jetson 设备,只有当设备通过以太网网络连接时才有可能。如果基于镜像的 OTA 找不到连接,它会尝试通过重启来建立连接。 如果您的设备未连接到以太网网络,则必须禁用此重启 1. 转到目录 ${TARGET_BSP}/tools/ota_tools/version_upgrade/。 2. 在文本编辑器中打开文件 nv_recovery.sh。 3. 注释掉文件中的第一个 reboot_system 行;保存并退出。 |
术语和缩写
本节使用以下术语和缩写
• BUP:引导加载程序更新有效负载,一个文件,其中包含更新 Jetson 设备所需的每种类型的固件二进制文件
• MSI:最小镜像集,启动 Jetson Linux 所需的最小镜像集
• OTA:Over-the-Air 更新,Jetson Linux 功能,使您能够更新 Jetson 设备
• ToT:树顶,源代码控制系统(如 Git)中文件的最新修订版本
总体高级流程
基于镜像的 OTA 更新分两个步骤执行。第一步是在主机上准备 OTA 有效负载软件包;第二步是在目标设备上触发 OTA 进程。
准备 OTA 有效负载软件包
当前的 Jetson Linux BSP 提供了在 OTA 工具软件包中生成 OTA 有效负载软件包的所有必要工具,可以从 NVIDIA 开发者网站的
L4T 页面 下载。
OTA 工具软件包可用于创建 OTA 有效负载软件包,用于
• 更新完整系统
• 仅更新引导加载程序
• 仅更新 rootfs
生成的 OTA 有效负载软件包名为 ota_payload_package.tar.gz。此软件包包含要更新的所有分区的镜像。
注意 | NVIDIA 建议对此软件包应用安全机制,例如签名或加密。 |
将 ota_payload_package.tar.gz 和 OTA 工具软件包 ota_tools_<rel>_aarch64.tbz2 上传到您的 OTA 服务器。
触发 OTA 进程
您负责编写触发 OTA 进程的 OTA 客户端服务。它必须包括以下步骤
1. 从您自己的 OTA 服务器下载 OTA 工具软件包 ota_tools_<rel>_aarch64.tbz2 和 OTA 有效负载软件包 ota_payload_package.tar.gz。
2. 根据您自己的安全要求验证下载的 OTA 有效负载软件包及其内容。
3. 使用 OTA 工具软件包中的工具触发 OTA 更新。该工具解压缩 OTA 有效负载软件包并为其准备 OTA 更新。该工具处理涉及分区布局更改以及启用 rootfs A/B 的情况
有关详细步骤,请参阅以下各节。
准备基于镜像的 OTA 更新
准备基于镜像的 OTA 更新涉及主机和目标设备上的一些步骤。在过程中标识了在每个设备上执行的步骤。
在主机上执行的步骤
1. 将环境变量 BASE_BSP 设置为基本 BSP 的 Linux_for_Tegra/ 目录的完整路径名。(基本 BSP 是要更新的 BSP 版本,即受支持的 28 或 32 版本。)
2. 如果要更新到 32.6 版本,请转到步骤
6。否则,获取当前 Jetson Linux 版本的软件包,解压缩并应用其示例根文件系统。转到包含当前 BSP 软件包的目录,然后输入以下命令
$ tar xpf Tegra186_Linux_<rel>_aarch64.tbz2
$ cd Linux_for_Tegra/rootfs/
$ sudo tar xpf \
../../Tegra_Linux_Sample-Root-Filesystem_<rel>_aarch64.tbz2
$ cd ..
$ sudo ./apply_binaries.sh
3. 将环境变量 ToT_BSP 设置为当前版本 BSP 的 Linux_for_Tegra/ 目录的完整路径名。
4. 将 OTA 工具软件包 ota_tools_<rel>_aarch64.tbz2 安装到 ${ToT_BSP}
$ cd ${ToT_BSP}/../
$ tar xpf ota_tools_<rel>_aarch64.tbz2
5. 如果您要更新到的版本是
${ToT_BSP},请将环境变量
TARGET_BSP 设置为
${ToT_BSP} 并转到步骤
12。否则,继续执行下一步以将 BSP 更新到所需的其他版本。
6. 获取您要更新到的 Jetson Linux 版本的软件包,例如 32.5 或 32.6 版本。解压缩并应用其示例根文件系统。
注意 | Jetson Xavier NX 开发模块 P3668-0000 不支持更新到 r32.5。 |
转到包含 BSP 软件包的目录,然后输入以下命令
$ tar xpf Tegra186_Linux_<rel>_aarch64.tbz2
$ cd Linux_for_Tegra/rootfs/
$ sudo tar xpf \
../../Tegra_Linux_Sample-Root-Filesystem_<rel>_aarch64.tbz2
$ cd ..
$ sudo ./apply_binaries.sh
7. 将环境变量
TARGET_BSP 设置为您在步骤
6 中解压缩的软件包中的
Linux_for_Tegra/ 目录的完整路径名。如果此 BSP 软件包是 32.6 版本,请将环境变量
ToT_BSP 设置为
${TARGET_BSP}。
8. 将 OTA 工具软件包 ota_tools_<rel>_aarch64.tbz2 从 ${ToT_BSP} 安装到 ${TARGET_BSP}
$ cd ${TARGET_BSP}/../
$ tar xpf ${ToT_BSP}/../ota_tools_<rel>_aarch64.tbz2 -C ./
如果此 BSP 软件包是 32.6 版本,请转到步骤
12。否则,继续执行下一步。
9. 将 ${ToT_BSP}/tools/ota_tools/version_upgrade 下的文件复制到 ${TARGET_BSP}
$ cd ${TARGET_BSP}
$ cp ${ToT_BSP}/tools/ota_tools/version_upgrade/* ./tools/ota_tools/version_upgrade
10. 为 ${TARGET_BSP} 生成插槽元数据文件
$ cd ${TARGET_BSP}
$ cp ./bootloader/smd_info.cfg ./tools/ota_tools/version_upgrade/smd_info.boot_slot_A.cfg
$ cp ./bootloader/smd_info.cfg ./tools/ota_tools/version_upgrade/smd_info.boot_slot_B.cfg
$ sed -i -e 's/^15/# 15/' -e 's/^##15/15/' -e 's/^##14/14/' ./tools/ota_tools/version_upgrade/smd_info.boot_slot_A.cfg
$ sed -i -e 's/^15/# 15/' -e 's/^##15/14/' -e 's/^##14/15/' ./tools/ota_tools/version_upgrade/smd_info.boot_slot_B.cfg
$ ./bootloader/nv_smd_generator ./tools/ota_tools/version_upgrade/smd_info.boot_slot_A.cfg ./tools/ota_tools/version_upgrade/slot_metadata.bin.A
$ ./bootloader/nv_smd_generator ./tools/ota_tools/version_upgrade/smd_info.boot_slot_B.cfg ./tools/ota_tools/version_upgrade/slot_metadata.bin.B
11. 从 ${ToT_BSP} 复制文件并修改 p2771-0000.conf.common、 p2972-0000.conf.common 和 p3668.conf.common
$ cd ${TARGET_BSP}
$ mv ./flash.sh ./flash.sh.backup
$ cp ${ToT_BSP}/flash.sh ./
$ mv ./l4t_sign_image.sh ./l4t_sign_image.sh.backup
$ cp ${ToT_BSP}/l4t_sign_image.sh ./
$ mv ./l4t_sign_image.sh ./l4t_sign_image.sh.backup
$ cp ${ToT_BSP}/l4t_sign_image.sh ./
$ mv ./l4t_generate_soc_bup.sh ./l4t_generate_soc_bup.sh.backup
$ cp ${ToT_BSP}/l4t_generate_soc_bup.sh ./
$ mv ./bootloader/tegraparser_v2 ./bootloader/tegraparser_v2.backup
$ cp ${ToT_BSP}/bootloader/tegraparser_v2 ./bootloader/
$ mv ./bootloader/tegraflash.py ./bootloader/tegraflash.py.backup
$ cp ${ToT_BSP}/bootloader/tegraflash.py ./bootloader/
$ mv ./bootloader/tegrahost_v2 ./bootloader/tegrahost_v2.backup
$ cp ${ToT_BSP}/bootloader/tegrahost_v2 ./bootloader/
$ mv ./bootloader/tegrabct_v2 ./bootloader/tegrabct_v2.backup
$ cp ${ToT_BSP}/bootloader/tegrabct_v2 ./bootloader/
$ mv ./bootloader/tegraflash_internal.py ./bootloader/tegraflash_internal.py.backup
$ cp ${ToT_BSP}/bootloader/tegraflash_internal.py ./bootloader/
$ cp ${ToT_BSP}/bootloader/tegrasign_v3_util.py ./bootloader/
$ cp ${ToT_BSP}/bootloader/tegrasign_v3_internal.py ./bootloader/
$ cp ${ToT_BSP}/bootloader/tegrasign_v3.py ./bootloader/
$ cp ${ToT_BSP}/bootloader/tegraopenssl ./bootloader/
$ sudo mv ./rootfs/opt/nvidia/l4t-bootloader-config/nv-l4t-bootloader-config.sh ./rootfs/opt/nvidia/l4t-bootloader-config/nv-l4t-bootloader-config.sh.backup
$ sudo cp ${ToT_BSP}/rootfs/opt/nvidia/l4t-bootloader-config/nv-l4t-bootloader-config.sh ./rootfs/opt/nvidia/l4t-bootloader-config/nv-l4t-bootloader-config.sh
$ sudo mv ./rootfs/usr/sbin/nvbootctrl ./rootfs/usr/sbin/nvbootctrl.backup
$ sudo cp ${ToT_BSP}/rootfs/usr/sbin/nvbootctrl ./rootfs/usr/sbin/nvbootctrl
$ sudo mv ./rootfs/usr/sbin/nv_bootloader_payload_updater ./rootfs/usr/sbin/nv_bootloader_payload_updater.backup
$ sudo cp ${ToT_BSP}/rootfs/usr/sbin/nv_bootloader_payload_updater ./rootfs/usr/sbin/nv_bootloader_payload_updater
$ sudo mv ./rootfs/usr/sbin/nv_update_engine ./rootfs/usr/sbin/nv_update_engine.backup
$ sudo cp ${ToT_BSP}/rootfs/usr/sbin/nv_update_engine ./rootfs/usr/sbin/nv_update_engine
$ echo "SMDFILE=\"slot_metadata.bin\";" >>p2771-0000.conf.common
$ echo "DRAMECCFILE=\"bootloader/dram-ecc.bin\";" >>p2771-0000.conf.common
$ echo "BADPAGEFILE=\"bootloader/badpage.bin\";" >>p2771-0000.conf.common
$ echo "SMDFILE=\"slot_metadata.bin\";" >>p2972-0000.conf.common
$ echo "SMDFILE=\"slot_metadata.bin\";" >>p3668.conf.common
12. 生成基本恢复镜像和恢复 DTB。输入以下命令
$ cd ${TARGET_BSP}/
$ sudo ./tools/ota_tools/version_upgrade/build_base_recovery_image.sh [-u <PKC 密钥文件>] [-v <SBK 密钥文件>] <target_board> <bsp_version> ${BASE_BSP} ${BASE_BSP}/rootfs ${TARGET_BSP}
其中
• <target_board> 是适当的配置名称
• 对于 Jetson Xavier NX P3668-0000:jetson-xavier-nx-devkit
• 对于 Jetson Xavier NX P3668-0001 (8 GB) 或 P3668-0003 (16 GB):jetson-xavier-nx-devkit-emmc
• 对于 Jetson TX2 NX:jetson-xavier-nx-devkit-tx2-nx
• 对于 Jetson AGX Xavier P2888-0001 (16 GB)、P2888-0004 (32 GB) 或 P2888-0005 (64 GB):jetson-agx-xavier-devkit
• 对于 Jetson TX2 P3310-1000:jetson-tx2-devkit
• <bsp_version> 是基本 BSP 版本,格式为 Rmm-n,其中 mm 和 n 分别是主版本号和小版本号。基本 BSP 版本可以是 28.2 版本之后的任何小版本。例如,R32-3 指定基本 BSP 版本 32.3。
• <PKC 密钥文件> 是可选的 PKC 密钥文件。它必须与闪存镜像到目标板时使用的密钥文件相同。
• <SBK 密钥文件> 是可选的 SBK 密钥文件。它必须与闪存镜像到目标板时使用的密钥文件相同。
此命令成功完成后,脚本将生成恢复镜像和恢复 DTB,并将它们存储在 ${TARGET_BSP}/bootloader/ 下。恢复镜像和恢复 DTB 用于将目标设备启动到恢复内核。
例如,以下命令在不使用 PKC 密钥和 SBK 密钥的情况下,为 Jetson TX2 载板上的 32.1 版本生成恢复镜像和恢复 DTB。它在 ${TARGET_BSP}/bootloader/ 下生成恢复镜像 recovery.img.R32_1_2 和恢复 DTB recovery.dtb.R32_1_2。
$ sudo ./tools/ota_tools/version_upgrade/build_base_recovery_image.sh jetson-tx2 R32-1 ${BASE_BSP}/ ${BASE_BSP}/rootfs ${TARGET_BSP}
13. 生成 OTA 更新有效负载软件包。输入以下命令
$ cd ${TARGET_BSP}
$ sudo ./tools/ota_tools/version_upgrade/l4t_generate_ota_package.sh [-s] [‑b] [‑r] [-u <PKC_key_file>] [-v <SBK_key_file>] [-o <rootfs_updater>] [-f <rootfs_image>] <target_board> <bsp_version>
其中
• ‑s、‑b 和 ‑r 可以单独使用,如所示,也可以组合成一个“单词”,例如 ‑sb 或 ‑sr。
• ‑s:跳过生成 rootfs 镜像。如果已生成 rootfs 镜像或使用 -f 选项指定了 rootfs 镜像,则使用此选项。
• -b:生成仅用于更新引导加载程序的 OTA 有效负载软件包。此选项仅对没有布局更改的更新有意义。
• -r:生成仅用于更新 rootfs 的 OTA 有效负载软件包。此选项仅对没有布局更改的更新有效。
• <PKC_key_file> 是可选的 PKC 密钥文件。它必须与闪存镜像到目标板时使用的密钥文件相同。
• <SBK_key_file> 是可选的 SBK 密钥文件。它必须与闪存镜像到目标板时使用的密钥文件相同。
• <rootfs_image> 是要写入 rootfs 分区的 rootfs 镜像的路径。
默认 rootfs 从 ${TARGET_BSP}/rootfs 构建。此选项使您可以使用自己生成的 rootfs 镜像覆盖默认 rootfs 镜像,例如,从已使用树顶版本的 Jetson Linux 完全自定义的 Jetson 设备克隆的镜像。
• <target_board> 是在步骤
12 中为
build-base-recovery-image.sh 指定的配置名称。
• <bsp_version> 是在步骤
12 中为
build-base-recovery-image.sh 指定的基本 BSP 版本。
脚本在 ${TARGET_BSP}/bootloader/<target_board> 下生成文件 ota_payload_package.tar.gz。
脚本从默认 rootfs 生成的 ota_payload_package.tar.gz 归档文件大约占用 2 GB 的空间。 自行生成的 rootfs 可能会产生更大或更小的归档文件。 在 Jetson 设备上解压缩该归档文件以应用基于镜像的 OTA 至少需要 6 GB 的可用空间。
注意 | 步骤 12 和 13 使用来自 Linux_for_Tegra/rootfs/ 的 Jetson Linux 示例 rootfs 来构建恢复内核、恢复 DTB 和 OTA 包。 如果您自定义了示例 rootfs,例如,您必须将所需的库和二进制文件添加到 rootfs 中,请在运行此脚本之前应用它们。 您必须将 OTA 工具包和 OTA 有效负载包放到您自己的 OTA 服务器上,以实现完整的 OTA 解决方案。 |
在 Jetson 设备上执行的步骤
1. 查看 /boot/extlinux/extlinux.conf。
如果未设置 INITRD 条目,请在 LINUX /boot/Image 行下添加以下行
INITRD /boot/initrd
如果未设置根设备,请将其添加到 APPEND 行中,例如
root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4。
2. 将 OTA 更新工具包 ota_tools_<rel>_aarch64.tbz2 和 OTA 更新有效负载包 ota_payload_package.tar.gz 下载到目标板。
3. 创建一个目录来保存 OTA 更新过程中生成的文件。 将环境变量 WORKDIR 设置为此目录的完整路径名。
4. 将 ota_tools_<rel>_aarch64.tbz2 解压缩到 ${WORKDIR} 目录中。
5. 创建一个目录 /ota/,并将 OTA 更新有效负载包 ota_payload_package.tar.gz 放入其中。
6. 解压缩 OTA 有效负载包,并准备开始 OTA
$ cd ${WORKDIR}/Linux_for_Tegra/tools/ota_tools/version_upgrade
$ sudo ./nv_ota_start.sh /dev/mmcblk0 /ota/ota_payload_package.tar.gz
/ota/ota_payload_package.tar.gz 是 OTA 有效负载包。
7. 如果在上一步中没有发生错误,请重新启动目标板。
如果在目标上启用了 rootfs A/B,则在步骤
6 中更新非活动槽位上的引导加载程序分区和 rootfs 分区。 然后,目标板重新启动到刚刚更新的槽位。
如果在目标上禁用了 rootfs A/B,则它会启动到恢复内核,该内核在执行此步骤后运行 OTA 更新过程。 如果由于断电导致更新失败,目标设备可以重新启动到恢复内核并继续更新。 目标设备重新启动并继续更新的最大次数由脚本变量 OTA_MAX_RETRY_COUNT 确定,该变量默认为 0(零)。 如果更新失败次数超过该次数,目标设备将启动到恢复内核并进入 bash shell。 您可以在 ${TARGET_BSP}/tools/ota_tools/version_upgrade/nv_recovery.sh 中更改 OTA_MAX_RETRY_COUNT 的值。
如果 OTA 更新过程失败,则更新过程会将日志存储在目标设备上的 /ota_logs/ 中。 这些日志记录了 OTA 更新过程的详细信息。 在 OTA 更新成功结束后,将删除此目录中的日志文件。
注意 | 要创建完整的安全 OTA 更新解决方案,您必须实现一个 OTA 客户端,该客户端在目标设备上执行此过程,并且您必须根据您的安全策略要求应用安全机制。 |
nv_ota_start.sh,用于触发 OTA 的实用程序
基于镜像的 OTA 支持版本之间的更新,无论是否进行分区布局更改。 它支持在启用或禁用 rootfs A/B 的情况下进行更新。 您无需了解其中的差异,因为相同的实用程序 nv_ota_start.sh 可以处理这两种情况。
nv_ota_start.sh 包含在 ota_tools_<rel>_aarch64.tbz2 中。 它确定是否需要布局更改,并执行另一个脚本来执行适当类型的更新。
要执行不进行布局更改的更新,脚本将执行 nv_ota_update_without_layout_change.sh。
要执行进行布局更改的更新,脚本将执行
nv_ota_update_with_layout_change.sh。 以下的
使用分区布局更改进行更新部分描述了使用分区布局更改更新版本的过程。
启用 Rootfs 冗余更新
您可以在启用 rootfs 冗余的设备上使用基于镜像的 OTA。 在运行 nv_ota_start.sh 实用程序后,将触发 OTA 更新。 整个过程在完全启动的系统中执行,并且设备永远不会重新启动到恢复内核。 更新过程采用了两个额外的实用程序 nv_update_engine 和 nv_bootloader_payload_updater。
OTA 更新过程与是否启用“统一引导加载程序 A/B 和 rootfs A/B”选项无关
1. 通过运行带有预生成的 BUP 镜像 bl_only_payload 的 nv_update_engine,更新非活动槽位上的引导加载程序分区。
2. 通过运行带有预生成的 BUP 镜像 kernel_only_payload 的 nv_bootloader_payload_updater,更新非活动槽位上的 kernel 和 kernel-dtb 分区。
3. 通过运行带有预生成的 rootfs 镜像和相应的 rootfs 更新程序的 nv_update_engine,更新非活动槽位上的 rootfs 分区。
OTA 更新成功完成后,设备将重新启动到更新后的槽位。 如果设备在多次重试后未能启动到更新后的槽位,它将切换回之前的已知良好槽位。 有关启用 rootfs 冗余的槽位切换的更多信息,请参阅
根文件系统冗余,位于
设置文件系统主题中。
分区布局更改更新
对于基于镜像的 OTA 更新,使用分区布局更改进行更新是一个具有挑战性的过程。 如果您直接执行分区更改,则更新期间意外的重新启动可能会失败,并使 Jetson 设备处于无法启动的状态。
BSP 支持 A/B 更新,它维护两组分区用于启动和运行操作系统,分别称为“槽位 A”和“槽位 B”。 它一次仅使用一个槽位,并将更新应用于非活动槽位上的分区,然后交换槽位的角色。 例如,当槽位 A 处于活动状态时,BSP 从槽位 A 中的分区启动并运行操作系统,并将更新应用于槽位 B 中的分区。 这确保了更新失败不会导致设备无法启动。
为了实现故障安全更新,基于镜像的 OTA 更新过程会创建一些中间分区布局,在更新期间发生意外重新启动时,它会使用这些布局来创建备用可启动路径。 可启动路径由存储设备可用空间上的许多分区组成。 存储在这些分区中的镜像称为最小镜像集 (MSI)。
例如,在 Jetson TX2 上从版本 28.3 到版本 32.7 的 OTA 更新使用两个中间分区布局
• flash_l4t_t186_R28-3_R32i_emmc.xml 基于版本 28.3 中的默认分区布局。 它由 jetson-tx2-R28_3-R32i-emmc.conf 使用。
• flash_l4t_t186_R32A_R32i_emmc.xml 基于 R32.7 中的默认分区布局。 它由 jetson-tx2-R32A-R32i-emmc.conf 使用。
l4t_generate_ota_package.sh 使用这些中间分区布局及其相应的 .conf 文件来生成 OTA 有效负载包。 默认情况下,这些布局是基于发布的 BSP 中的默认分区布局创建的。 如果对默认分区布局进行了任何自定义,则必须将自定义应用于中间分区布局。 在 OTA 期间,更新脚本会将这些布局与实际板上的布局进行验证。 如果布局不匹配,则 OTA 更新不会继续。
备份和还原 APP 分区上的文件
ota_tools_<rel>_aarch64.tbz2 中的脚本 nv_ota_preserve_data.sh 在 OTA 更新期间备份和恢复 APP 分区上的文件。 它位于 Linux_for_Tegra/tools/ota_tools/version_upgrade/。
编辑配置文件 ota_backup_files_list.txt 以添加 OTA 更新后要保留的文件的路径名。 ota_backup_files_list.txt 的分发版本包含以下内容
# 所有文件或目录都应使用绝对路径列出
# 示例
# etc/passwd
# opt/nvidia
opt/nvidia
路径名以相对形式编写,但始终相对于文件系统根目录进行解释; 您可以将它们视为省略了前导斜杠的绝对路径名。
您可以在第 1 列中添加以磅符号(‘#’)开头的注释行。
注意 | 脚本 nv_ota_preserve_data.sh 将列出的文件打包到 .tar.gz 归档文件中。 您可以根据自己的要求选择其他备份和恢复这些文件的方式。 |
完整和安全的 OTA
NVIDIA 提供了通过 OTA 更新过程更新系统的基本功能。 您必须修改该过程并创建完整且安全的 OTA 解决方案。 根据您的需求,您修改后的过程可能必须满足以下一项或多项要求
• 加密 OTA 更新有效负载
• 在 OTA 更新服务器上托管 OTA 更新有效负载
• 当在 OTA 服务器上找到更新时触发 OTA 更新(目标设备上 OTA 更新客户端的功能)
• 验证 OTA 更新服务器的身份
• 解密 OTA 更新有效负载
• 确定何时应用 OTA 更新有效负载
自定义
如果您自定义了发布的 BSP,例如通过自定义 rootfs 或更改分区布局,则必须修改分布式基于镜像的 OTA 更新过程中的某些文件,以应用基于镜像的 OTA 更新解决方案。 以下小节讨论了可能的自定义类型以及它们所需的 OTA 更新更改。
Rootfs 自定义
Rootfs 自定义包括
• 在 rootfs 中添加或删除文件
• 修改 rootfs 中的文件
此类更改需要
• 将更改应用于 rootfs
分区布局自定义
分区布局自定义包括
• 添加或删除分区
• 更改分区大小
• 更改分区位置
此类更改需要
• 修改提供的中间分区布局以适应基本系统。 例如,对于使用版本 28.3 刷写的 Jetson TX2 板,分区布局文件为 flash_l4t_t186_R28-3_R32i_emmc.xml。
• 基于 ${TARGET_BSP} 当前发布系统修改提供的中间分区布局。 对于上面的板,分区布局文件为 flash_l4t_t186_R32A_R32i_emmc.xml。
• 修改 ${TARGET_BSP} 的当前发布分区布局。 对于 Jetson TX2,它是 flash_l4t_t186.xml。
• 如果需要,修改 *.conf 文件中的 MSI_EMMC_OFFSET。 确保从 MSI_EMMC_OFFSET 开始的可用空间足够大,可以存储 MSI。 对于上面的示例,相应的配置文件是 jetson-tx2-R28_3-R32i-emmc.conf 和 jetson-tx2-R32A-R32i-emmc.conf。
注意 | 如果您要使用分区布局自定义将版本 32.3、32.4 或 32.5 更新到当前版本,请参阅下面的 示例部分。 |
更新过程自定义
更新过程自定义包括
• 更改更新分区的方式
• 除了默认分区外,还更新新创建的分区
• 仅更新某些默认分区
此类更改需要
• 修改提供的文件 upgradetasklist.txt.XXX。 例如,要将版本 28.2、28.3 或 28.4 更新到版本 32.7,您必须修改 upgradetasklist.txt.jetson-tx2.R28_to_R32-ToT_emmc 以指定要更新的分区。
恢复镜像自定义
恢复镜像自定义包括
• 向恢复 initrd 添加一些文件
此类更改需要
• 编辑提供的文件 recovery_copy_binlist.txt 以指定要添加到恢复镜像的任何文件的文件系统和路径名。 有关如何进行更改的说明和示例,请参阅该文件。
恢复任务自定义
恢复任务自定义包括
• 在恢复内核运行时添加一些其他任务
恢复内核执行 nv_ota_run_tasks.sh 作为任务运行程序。 它按顺序执行 OTA 任务。 要添加在选择恢复内核时运行的任务,您必须
• 将脚本文件添加到 Linux_for_Tegra/tools/ota_tools/version_upgrade/。 确保脚本文件具有执行权限。
• 修改 nv_ota_customer.conf 中的 OTA_TASKS 和 OTA_TASK_NEEDED_FILES 以包含新添加的脚本文件。
• OTA_TASKS 中列出的脚本文件是 OTA 任务,并由任务运行程序按顺序执行。 在适当的位置插入每个脚本文件名。
• OTA_TASK_NEEDED_FILES 中列出的脚本文件是 OTA 任务所需的文件。 如果有任何文件,请将文件名添加到列表中。
• 重新生成 OTA 更新有效负载包。
其他自定义:以太网连接要求
如果您想确保仅在稳定的以太网连接可用时才执行更新,请通过在 nv_ota_customer.conf 中设置属性 REQUIRE_ETHERNET 来启用 OTA 更新的以太网连接要求。 此设置使 Jetson Linux 在启动 OTA 之前检查以太网连接。 如果未找到连接,它将尝试通过重新启动来建立连接。
默认情况下禁用此要求,因为 Jetson 设备不需要使用以太网作为其主要连接方式。
使用自定义更新程序和镜像更新 Rootfs 分区
当您生成 OTA 有效负载包时(
主机上执行的步骤中的步骤
13),您可以使用
-o 选项指定 rootfs 更新程序,并使用
-f 选项指定 rootfs 镜像。
rootfs 更新程序是一个脚本,用于将 rootfs 镜像写入 rootfs 分区。 多个 Jetson Linux 实用程序和服务(包括 OTA 更新)使用适当的命令行参数和选项调用它。 NVIDIA 提供了一个名为 nv_ota_rootfs_updater.sh 的默认 rootfs 更新程序; 它位于分发归档文件 ota_tools_<rel>_aarch64.tbz2 中。
默认 rootfs 更新程序的使用方法是
nv_ota_rootfs_updater.sh [-p <devnode>] [-d <workdir>] <image>
其中
• <devnode> 是 rootfs 分区的设备节点路径,例如,/dev/mmcblk0p1。
• <workdir> 是 OTA 工作目录的路径,例如,/ota_work。
• <image> 是 rootfs 镜像的路径,例如,/ota_work/system.img。
如果您创建了自定义 rootfs 镜像,则必须指定一个可以处理该镜像的 rootfs 更新程序。 您指定的 rootfs 更新程序必须期望与 nv_ota_rootfs_updater.sh 相同的参数和选项。 您的更新程序可以使用这些参数和选项,也可以不使用,具体取决于您的特定需求。
更新单个分区
当前版本的 BSP 支持更新单个分区(不包括分区 BCT、mb1 和 APP)。
您分两个步骤执行单个分区更新
1. 在主机系统上准备引导加载程序更新有效负载 (BUP)。
2. 在目标设备上触发更新。
要准备引导加载程序更新有效负载
1. 在主机系统上输入以下命令
$ cd ${Tot_BSP}/Linux_for_Tegra
$ sudo ./l4t_generate_soc_bup.sh <processor>
其中 <processor> 是
• 对于 Jetson TX2,t18x
• 对于 Jetson AGX Xavier,t19x
该脚本在 Linux_for_Tegra/payloads_<processor>/bl_update_payload/ 目录中生成一个名为 bl_update_payload 的 BUP。
2. 将 BUP 复制到要更新其分区的目标设备上的任何方便的位置。
要触发更新过程
1. 将 BUP bl_update_payload 移动到目录 /opt/ota_package/。
2. 创建一个名为 update_list.conf 的文件并对其进行编辑,以添加要更新的分区的名称和槽位。
例如,您可以通过添加以下行来更新其非当前槽位中的分区 cpu-bootloader 和 bootloader-dtb
cpu-bootloader non-current
bootloader-dtb non-current
3. 要触发更新,请使用文件名 update_list.conf 作为输入参数运行脚本 nv_part_update
$ sudo nv_part_update update_list.conf
示例
NVIDIA 提供了有关如何为某些特定用例应用基于镜像的 OTA 更新的几个示例
• 修改中间分区布局
• 使用分区布局自定义将版本 32.3、32.4 或 32.5 升级到当前版本
• ota-demo-host.sh 和 ota-demo-target.sh 示例脚本
• 在自定义设备上更新
有关这些示例的更多详细信息,请参阅文件
Linux_for_Tegra/tools/ota_tools/version_upgrade/Image_based_OTA_Examples.txt
此文件包含在 OTA 工具包 ota_tools_<rel>_aarch64.tbz2 中。