烧录支持
使用flash.sh脚本可为Jetson设备烧录引导加载程序和内核,并可选择将根文件系统烧录至内部或外部存储设备。
使用l4t_initrd_flash.sh脚本可烧录连接至Jetson设备的内部或外部存储介质。该脚本通过恢复初始RAM磁盘进行烧录,采用统一流程处理内外存储介质。由于使用内核进行烧录,其速度通常快于flash.sh脚本。详细信息请参阅《使用initrd烧录》(https://docs.nvidia.com/jetson/archives/r38.2/DeveloperGuide/SD/FlashingSupport.html#sd-flashingsupport-flashingwithinitrd)。
默认板型配置和分区布局支持64GB及以上容量的外部存储介质。如需适配更低容量的外部介质,需修改板型配置中的ROOTFSSIZE变量和分区布局中的num_sectors字段。关于外部存储设备分区布局调整的详细信息,请参阅《烧录至外部存储设备》(https://docs.nvidia.com/jetson/archives/r38.2/DeveloperGuide/SD/FlashingSupport.html#flashing-to-an-external-storage-device)。
准备工作
必须确保以下目录存在:
bootloader:包含引导加载程序及烧录工具(如TegraFlash、CFG和BCT)
kernel:包含内核镜像/Image、DTB文件及内核模块
rootfs:已下载的根文件系统
· 该目录初始为空,需用示例文件系统填充
nv_tegra:用户空间二进制文件及示例应用程序
此外,执行烧录命令前,必须通过USB线缆将主机计算机连接至Jetson设备的恢复模式端口。
基础烧录脚本使用说明
通过运行发行版中包含的flash.sh -h命令可显示当前使用信息。基本使用格式如下:
bash
$ sudo ./flash.sh [选项] <板型> <根设备>
bash
1
参数说明:
· 选项(options):一个或多个命令行选项(所有选项均为可选)。具体选项信息请参阅《烧录脚本使用指南》(https://docs.nvidia.com/jetson/archives/r38.2/DeveloperGuide/SD/FlashingSupport.html#flashing-script-usage)
· <板型>(board):指定要烧录设备的配置类型。可选值列于《Jetson模块与配置表》(https://docs.nvidia.com/jetson/archives/r38.2/DeveloperGuide/IN/QuickStart.html#in-quickstart-jetsonmodulesandconfigurations)中。flash.sh从名为<板型>.conf的配置文件中获取配置信息,该文件指定了分区布局文件的位置,而分区布局文件定义了Jetson目标设备上要烧录的存储设备。关于<板型>.conf的详细解释,请参阅《板型配置文件详解》和《生成待烧录镜像》(https://docs.nvidia.com/jetson/archives/r38.2/DeveloperGuide/SD/FlashingSupport.html#sd-flashingsupport-explainingboardconfigurationfileandgeneratingaflashimagetoflashlater)
· <根设备>(rootdev):指定用作根文件系统的设备类型。例如使用mmcblk0p1值表示烧录本地存储设备(根据平台不同可能是eMMC或SD卡),以区别于NFS服务器等网络存储方案
基础烧录流程
本节介绍烧录单个或多个目标设备的常用操作流程。
安装烧录环境依赖
执行以下命令:
bash
$ sudo tools/l4t_flash_prerequisites.sh
烧录目标设备
将目标设备置入强制恢复模式:
· 接通载板电源并长按RECOVERY按钮
· 按下RESET按钮
运行本版本BSP顶级目录中的flash.sh脚本。命令行必须指定目标板型(例如jetson-agx-orin-devkit)和根文件系统设备:
bash
$ sudo ./flash.sh <板型> <根设备>
bash
1
参数说明:
· <板型>:指定目标设备的配置类型(详见《Jetson模块与配置表》)
· <根设备>:指定根文件系统所在的存储设备(详见《基础烧录脚本使用》)
运行示例如下:
bash
$ sudo ./flash.sh <板型> mmcblk0p1
bash
1
使用便捷脚本进行烧录
NVIDIA提供自动检测Jetson设备载板类型的便捷烧录脚本:
bash
$ sudo ./nvsdkmanager_flash.sh [–storage <存储设备>]
其中<存储设备>可选:
nvme0n1p1 或 nvme1n1p1:烧录至外部NVMe SSD
sda1:烧录至外部USB存储驱动器
mmcblk0p1 或 mmcblk1p1:烧录至外部SD卡(具体取决于目标设备)
12345
在Jetson Orin系列上,使用–storage选项烧录时还会同时烧录内部eMMC存储,其中包含指向外部存储设备作为根文件系统的小型引导分区。
若不使用–storage选项,则要求Jetson设备必须配备内部eMMC或SD卡(针对无内置eMMC存储的设备)。
烧录目标设备以挂载UUID指定的根文件系统
对于内部存储设备(如eMMC或SD卡),执行命令:
bash
$ sudo ./flash.sh <板型> internal
此命令会为根文件系统分区生成新UUID并存储在bootloader/l4t-rootfs-uuid.txt文件中。您也可通过向该文件写入自定义UUID后执行以下命令:
bash
$ sudo ./flash.sh –reuse-uuid <板型> internal
对于外部存储设备(如NVMe或USB设备),执行命令:
bash
$ sudo ./flash.sh <板型> external
此命令会为根文件系统分区生成新UUID并存储在bootloader/l4t-rootfs-uuid.txt_ext文件中。您也可通过向该文件写入自定义UUID后执行以下命令:
bash
$ sudo ./flash.sh –reuse-uuid <板型> external
烧录目标设备以挂载分区设备名指定的根文件系统
注意
以下命令仅向Jetson内部eMMC存储烧录小型引导分区,用于挂载外接至Jetson的USB/NVMe SSD设备。这些命令并不会将根文件系统内容实际烧录到外部连接的存储设备上。
text
· 对于连接到Jetson设备的USB存储设备分区,执行命令:
bash $ sudo ./flash.sh <板型> sda<x>
· 对于连接到Jetson设备的NVMe存储设备分区,执行命令:
bash $ sudo ./flash.sh <板型> nvme0n1p<x>
参数说明:
· <板型>:指定目标设备的配置类型(详见《快速入门》中的设备名称表)
· :数字编号,指定存储设备上APP分区的位置(例如USB设备使用sda1,NVMe存储设备使用nvme0n1p1)
解释板级配置文件并生成用于稍后刷写的刷机镜像
板级配置文件是一个bash脚本,用于定义多个bash变量。这些变量指定了flash.sh将使用的启动配置表(BCT)、设备树二进制文件(DTB)、内核、配置文件、固件和分区布局。
该板级配置文件通过EMMC_CFG变量指定分区配置文件的存储位置,该文件定义了刷写工具需要处理的存储设备及其分区布局。刷写工具仅会处理分区配置布局中描述的存储设备。
text
flash.sh仅支持板级配置文件中定义的一个分区配置文件
l4t_initrd_flash.sh支持板级配置文件中定义的一个分区配置文件,以及通过–external-device选项刷写时使用-c参数传递的另一个分区配置文件(用于定义外部设备的分区布局)
有关分区配置文件格式的详细信息,请参阅分区配置说明。
通常,NVIDIA提供的板级配置依赖从EEPROM和芯片读取的值来定义这些bash变量。用于生成后续刷写的刷机镜像:
text
1.将Jetson目标设备进入恢复模式
2.使用以下命令从电路板获取EEPROM和芯片信息,随后生成刷机镜像:
$ sudo ./flash.sh –no-flash mmcblk0p1
当无法获取恢复模式下的Jetson目标设备时,仍可通过手动获取EEPROM和芯片值并设置为环境变量来生成刷机镜像。例如:
$ sudo BOARDID=3701 BOARDSKU=0000 FAB=500 BOARDREV=500 CHIP_SKU=D0 RAMCODE=0 FUSELEVEL=fuselevel_production ./flash.sh –no-flash jetson-agx-orin-devkit mmcblk0p1
这些信息通常可在Jetson目标设备的规格书中找到。若您具有设备物理访问权限,也可通过以下方式手动获取:
text
将Jetson目标设备进入恢复模式
运行以下命令生成bootloader/cvm.bin和bootloader/chip_info.bin_bak文件:
$ sudo ./flash.sh –no-flash –no-systemimg mmcblk0p1
通过以下命令获取所需环境变量:
$ cd bootloader
$ BOARDID=$(./chkbdinfo -i cvm.bin)
$ BOARDSKU=$(./chkbdinfo -k cvm.bin)
$ FAB=$(./chkbdinfo -f cvm.bin)
$ BOARDREV=$(./chkbdinfo -r cvm.bin)
$ CHIP_SKU=$(./chkbdinfo -C chip_info.bin_bak)
$ RAMCODE_ID=$( ./chkbdinfo -R chip_info.bin_bak)
$ RAMCODE=$(echo “ibase=2; ${RAMCODE_ID//😕}” | bc)
生成刷机镜像后,您可在后续时间通过以下命令执行刷写操作:
$ cd bootloader
$ sudo bash ./flashcmd.txt
bash
12
克隆Jetson设备并进行刷写
从需要克隆的文件系统分区复制system.img文件。输入命令:
$ sudo ./flash.sh -r -k APP -G mmcblk0p1
其中:
text
确定克隆副本的文件名
指定目标设备的配置
此步骤会在目录下创建两个克隆副本:一个名为的稀疏镜像(比原始镜像小),以及一个名为.raw的精确副本。分区备份所需时间取决于分区大小。
例如,若为original.img,flash.sh将创建一个名为original.img的稀疏镜像和一个名为original.img.raw的精确副本。
将.img复制到/bootloader/system.img目录,其中是Jetson Linux BSP的安装目录。输入命令:
$ sudo cp .img bootloader/system.img
将镜像刷写到目标板:
text
若目标板已完成初始刷写,请重新刷写克隆镜像到APP分区。分区备份时间取决于分区大小。运行以下命令进行刷写:
$ sudo ./flash.sh -r -k APP mmcblk0p1
若目标板从未进行刷写,请刷写所有分区。输入命令:
$ sudo ./flash.sh -r mmcblk0p1
重要提示
若克隆源设备的根文件系统在oem-config过程中被调整大小,必须相应更新目标设备的eMMC配置文件。以jetson-agx-orin-devkit为例,根文件系统(APP)是位于secondary_gpt之前的最后一个分区。若APP分区被调整为允许的最大尺寸,必须将Linux_for_Tegra/bootloader/generic/cfg/flash_t234_qspi_sdmmc.xml中APP分区的allocation_attribute属性从0x8更新为0x808。
注意事项
要克隆外部存储设备(如NVMe存储设备)的rootfs分区,请参阅《使用initrd克隆rootfs》章节。
备份和恢复Jetson设备
NVIDIA提供了一套工具用于创建Jetson设备的备份镜像以及从备份镜像恢复设备。
备份Jetson设备与克隆设备(参见”克隆Jetson设备并进行刷写”)有所不同:备份镜像包含设备内部eMMC和QSPI存储器中的每个分区,而克隆仅包含APP文件系统分区。
用于备份和恢复Jetson设备的工具位于BSP目录下:
/Linux_for_Tegra/tools/backup-restore/
设备备份和恢复的操作说明详见同目录下的README_backup_restore.txt文件。
分区备份或恢复所需时间取决于分区大小。
重要提示
工作流程3:目前批量刷写备份镜像的功能暂不支持Jetson Orin NX。此外,使用此工具需要Jetson设备连接SD卡或NVMe固态硬盘。
通过RCM启动到NFS
将设备进入复位/恢复模式:
text
接通载板电源并按住Recovery按钮
按下Reset按钮
输入命令:
$ sudo ./flash.sh -N <ip_addr>:<root_path> –rcm-boot eth0
其中:
<ip_addr> 是主机系统的IP地址
<root_path> 是NFS根文件系统的路径
<board> 是目标设备的配置(详见Jetson模块与配置说明)
bash
123
刷写脚本使用说明
本节作为《基础刷写脚本使用》的补充,提供关于flash.sh命令行选项及其他使用细节的详细信息。
命令行选项 描述
-c <cfgfile> 刷写分区表配置文件的路径 -d <dtbfile> 设备树文件的路径 -f <flashapp> 要使用的刷写应用程序名称。刷写应用程序存储在bootloader目录,默认为bootloader/tegraflash.py -h 显示命令行语法和选项的说明 -k <partition_id> 在flash.xml或flash.cfg中指定的分区名称或编号 -m <mts_preboot> 要使用的MTS预启动文件名(如mts_preboot) -n <nfs_args> 静态NFS网络分配:<客户端IP>:<服务器IP>:<网关IP>:<子网掩码> -o <odmdata> ODM数据 -p <bp_size> eMMC硬件启动分区总大小 -r 跳过构建system.img;重用现有镜像 -t <tegraboot> tegraboot二进制文件路径(如nvtboot.bin) -u <PKC_key_file> 包含用于ODM熔断板子的PKC密钥的文件路径 -v <SBK_key_file> 包含用于ODM熔断板子的安全启动密钥(SBK)的文件路径 -w <wb0boot> 热启动二进制文件路径(如nvtbootwb0.bin) -x <tegraid> 处理器芯片ID。默认值为: • NVIDIA® Jetson Orin系列:0x23 -z <sn> 目标板序列号 -B <boardid> 板卡ID -C <args> 内核命令行参数。若指定此选项,将覆盖flash.sh定义的默认值。若指定两个及以上参数,需用引号括起并以空格分隔 内核命令行参数详见kernel-4.9/Documentation/kernel-parameters.txt文件 对于NFS启动,若省略-I选项,可使用此选项设置NFS启动相关参数 -F <flasher> 刷写服务器路径(如nvtboot_recovery_cpu.bin) -G <file_name> 读取启动分区并将镜像保存到指定文件 -I <initrd> initrd文件路径,默认值为空 -K <kernel> 内核镜像文件路径(如zImage或Image) -M <mts boot> MTS启动文件路径(如mts_si) -N <nfsroot> NFS根地址(如<我的IP地址>:<我的NFS根文件系统导出路径>) -R <rootfs_dir> 示例根文件系统目录路径 -S <size> 根文件系统大小(字节),仅对内部根设备有效 KB/MB/GB后缀表示1000、1000²、1000³单位 KiB/MiB/GiB后缀表示1024、1024²、1024³的倍数 例如:2GiB表示2×1024³字节 --bup 生成启动加载程序更新包(BUP) --clean-up 刷写多规格BUP时清理BUP缓冲区 --multi-spec 启用构建多规格BUP支持 --no-flash 执行除物理刷写板卡外的所有步骤,脚本会创建system.img文件 --no-systemimg 阻止创建或重新创建system.img --sparseupdate 仅刷写已更改的分区,当前仅支持SPI闪存 --usb-instance <id> 要连接的USB实例;<id>为USB端口路径(例如3-14)。查找<id>方法请参阅"如何查找usb-instance"章节 --user_key <user_key_file> 包含用户密钥的文件路径,可用于加密和解密内核、内核设备树及initrd二进制镜像。若指定user_key,则必须同时指定-v选项 --read-info 读取并显示板卡相关信息、熔断信息和EEPROM内容 --read-ramcode 生成read_ramcode脚本以允许在刷写前读取ramcode --gen-read-eeprom 使用所有已签名二进制文件生成read_eeprom脚本
bash123456789101112131415161718192021222324252627282930313233343536373839404142434445
查找usb-instance方法
当主机连接多个处于恢复模式的Jetson设备时,flash.sh脚本支持通过usb-instance参数指定要刷写的具体设备。本节介绍如何确定需要使用的usb-instance编号。
text
将所有设备置于恢复模式
运行以下命令:
$ grep /sys/bus/usb/devices/*/idProduct
其中idProduct指设备恢复模式的USB产品ID。例如Jetson AGX Orin的ID为7023。
查询结果将显示类似以下信息:
/sys/bus/usb/devices/1-1.1/idProduct:7023
text
其中的1-1.1就是需要使用的usb-instance编号,用于指定要刷写的设备
刷写到USB驱动器
Jetson设备支持从采用批量传输协议的大容量存储类USB设备(如U盘)启动。请注意不支持热插拔——必须在Jetson设备启动前连接U盘。您可以按照《手动设置可启动U盘》中的说明手动设置启动U盘。
所有Jetson设备都可以从内部存储的启动分区启动,并可以将外部USB驱动器挂载为根文件系统。
NVIDIA提供了简化刷写到Jetson设备所连接USB驱动器的方法。具体细节请参阅《使用initrd刷写将USB驱动器设置为启动设备或根文件系统》。
手动设置可启动U盘
请确认设备能够从eMMC成功启动。若无法启动,请先通过刷写eMMC解决问题。
将U盘连接到主机计算机。
检查U盘的设备名称(如/dev/sdb):
bash
$ sudo lsblk -p -d | grep sd
运行以下命令:
bash
$ sudo ./l4t_initrd_flash.sh [ -S ] -c –external-device sda1 –direct external
其中:
<sdx> 是主机计算机分配给U盘的设备名称
<config> 是USB分区布局配置文件(参考Linux_for_Tegra/tools/kernel_flash/flash_l4t_t234_nvme.xml中的示例)
<board> 是要刷写的Jetson设备类型(详见Jetson模块与配置表)
12345
您还可以指定作为APP分区的大小。该值与外部存储设备的总大小不同(总大小由中的num_sectors字段定义)。如果修改了中的num_sectors字段,必须指定新的,且其大小应比外部存储设备总容量小几GiB,以便容纳APP分区和其他分区。
如果在没有连接恢复模式设备的情况下运行此命令,必须手动指定环境变量。
例如,若主机计算机将U盘识别为sdb,针对Jetson AGX Orin设备的命令为:
bash
$ sudo BOARDID=3701 BOARDSKU=0000 FAB=TS4 ./l4t_initrd_flash.sh -c tools/kernel_flash/flash_l4t_t234_nvme.xml –external-device sda1 –direct sdb jetson-agx-orin-devkit external
默认情况下,Linux_for_Tegra/tools/kernel_flash/flash_l4t_t234_nvme.xml仅支持64GiB及以上容量的SD卡。若要刷写32GiB SD卡,必须修改该文件中的num_sectors字段,使num_sectors * 512 = 32GiB。运行命令为:
bash
$ sudo BOARDID=3701 BOARDSKU=0000 FAB=TS4 ./l4t_initrd_flash.sh -c tools/kernel_flash/flash_l4t_t234_nvme.xml -S 20GiB –external-device sda1 –direct sdb jetson-agx-orin-devkit external
需要将指定为20GiB,使其小于SD卡容量。
重要提示
更多信息请阅读Linux_for_Tegra/tools/kernel_flash目录下README_initrd_flash.txt文件中的”工作流程11″。
将U盘插入目标设备后启动或重启设备。
若设备仍从内部存储启动,可能需要使用efibootmgr工具或UEFI图形界面修改UEFI的启动顺序。
手动设置作为根文件系统的flash driver(sd卡,u盘等)
按照《手动设置可启动U盘》的类似方法准备U盘。
刷写Jetson设备以挂载外部U盘作为根文件系统:
bash
$ sudo ./flash.sh sda1
使用initrd刷写将USB驱动器设置为启动设备或根文件系统
通过initrd刷写方式,您可以对连接到Jetson设备的外部USB设备进行刷写。更多信息请参阅《刷写到外部存储设备》。
刷写到NVMe驱动器
Jetson设备支持从NVMe驱动器启动。请注意不支持热插拔——必须在Jetson设备启动前连接NVMe驱动器。
您可以按照《手动设置可启动NVMe驱动器》的步骤手动设置NVMe驱动器启动。
所有Jetson设备都可以从内部存储的启动分区启动,并可以将外部NVMe驱动器挂载为根文件系统。
NVIDIA提供了简化刷写到Jetson设备所连接NVMe驱动器的方法。具体细节请参阅《使用initrd刷写将NVMe驱动器设置为启动设备或根文件系统》。
手动设置可启动NVMe驱动器
请确认设备能够从eMMC成功启动。若无法启动,请先通过刷写eMMC解决问题。
将NVMe驱动器连接到主机计算机。
检查NVMe驱动器的设备名称(如/dev/nvme0n1):
bash
$ lsblk -d -p | grep nvme | cut -d -f 1
注意:-d 后面必须跟两个空格。
重要提示
Jetson Orin开发者套件提供两个PCIe插槽连接NVMe存储设备:PCIe C4插槽支持较长的M2.2280 NVMe卡,PCIe C7插槽支持较短的M2.2230 NVMe卡。
当单个NVMe设备连接到任一插槽时,设备将被识别为nvme0n1
当两个NVMe设备同时连接到两个PCIe插槽时,C4插槽中的NVMe设备识别为nvme0n1,C7插槽中的设备识别为nvme1n1。刷写时应根据目标NVMe设备将--external-device设置为nvme0n1p1或nvme1n1p1。此种情况下,必须将<rootdev>指定为external,以便刷写工具使用root=PARTUUID=<part-uuid>选项设置内核命令行。更多信息请阅读Linux_for_Tegra/tools/kernel_flash目录下README_initrd_flash.txt文件中的"工作流程3"
123
运行以下命令:
bash
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh [ -S ] -c –external-device nvme0n1p1 –direct external
其中:
<nvmeXn1> 是主机计算机分配给NVMe驱动器的设备名称
<config> 是NVMe SSD分区布局配置文件(参考Linux_for_Tegra/tools/kernel_flash/flash_l4t_t234_nvme.xml中的示例)
<board> 是要刷写的Jetson设备类型(详见Jetson模块与配置表)
12345
您还可以指定作为APP分区的大小。该值与外部存储设备的总大小不同(总大小由中的num_sectors字段定义)。如果修改了中的num_sectors字段,必须指定新的,且其大小应比外部存储设备总容量小几GiB,以便容纳APP分区和其他分区。
如果在没有连接恢复模式设备的情况下运行此命令,必须手动指定环境变量。
例如,若主机计算机将NVMe驱动器识别为nvme1n1p1,针对Jetson AGX Orin设备的命令为:
bash
$ sudo BOARDID=3701 BOARDSKU=0000 FAB=TS4 ./tools/kernel_flash/l4t_initrd_flash.sh -c tools/kernel_flash/flash_l4t_t234_nvme.xml –external-device nvme0n1p1 –direct nvme1n1p1 jetson-agx-orin-devkit external
重要提示
更多信息请阅读Linux_for_Tegra/tools/kernel_flash目录下README_initrd_flash.txt文件中的”工作流程11″。
将NVMe驱动器插入目标设备后启动或重启设备。
若设备仍从内部存储启动,可能需要使用efibootmgr工具或UEFI图形界面修改UEFI的启动顺序。
使用initrd刷写将NVMe驱动器设置为启动设备或根文件系统
通过initrd刷写方式,您可以对连接到Jetson设备的外部NVMe SSD进行刷写。更多信息请参阅《刷写到外部存储设备》。
刷写到SD卡
text
适用对象:仅Jetson Orin Nano开发者套件
本节介绍为搭载p3767-0005模块的Jetson Orin Nano开发者套件刷写和使用SD卡的操作流程。
前提条件
text
下载适用于Linux的Etcher工具。Etcher是用于将镜像复制到SD卡的工具,可从balenaEtcher主页获取
下载适用于Linux x64 (64位) 的Etcher (AppImage格式)。请将下载的文件设置为可执行
重要提示
NVIDIA推荐使用Etcher将镜像复制到SD卡,因为这是一种简单且可靠的方法。如果您愿意,也可以使用Linux dd命令执行此操作。若使用dd命令,则无需下载Etcher。
生成要刷写到SD卡的镜像
text
适用对象:仅Jetson Orin NX系列
如未解压,请先解压linux_for_tegra.tbz2归档文件
进入Linux_for_Tegra/tools目录
输入命令:
$ ./jetson-disk-image-creator.sh -o <blob_name> -b
其中:
text
<blob_name> 为文件名,脚本将以此名称保存原始镜像
指定SD卡要刷写的Jetson设备类型。可在Jetson模块与配置表中找到合适的值
此命令将根据Jetson Orin NX开发模块的SPI-SD配置方案生成包含分区的原始镜像。
例如,创建名为sd-blob.img的原始镜像文件用于Jetson Orin NX开发模块:
bash
$ ./jetson-disk-image-creator.sh -o sd-blob.img -b jetson-orin-nano-devkit -r 100
jetson-disk-image-creator.sh脚本支持使用修改后的根文件系统。因此,您可以创建包含指定根文件系统目录的SD卡镜像:
bash
$ ROOTFS_DIR=<修改后的根文件系统路径> ./jetson-disk-image-creator.sh -o <blob_name> -b -r <修订版本>
使用Etcher将镜像刷写到SD卡
text
将SD卡插入主机系统的SD卡槽或外部SD卡读卡器
启动Etcher并选择由jetson-disk-image-creator.sh创建的SD blob镜像文件
选择要刷写的SD卡
点击Flash按钮将SD blob镜像写入SD卡
使用dd命令将镜像刷写到SD卡
输入命令:
bash
$ sudo dd if=<sd_blob_name> of=/dev/mmcblk bs=1M oflag=direct
其中:
text
<sd_blob_name> 是由jetson-disk-image-creator.sh创建的blob镜像文件名(如需可包含路径)
是Linux主机检测到的SD卡块编号,即0或1
例如,将工作目录下名为sd-blob.img的镜像blob文件复制到编号为1的SD卡:
bash
$ sudo dd if=sd-blob.img of=/dev/mmcblk1 bs=1M oflag=direct
调整根分区大小以占用SD卡可用空间
根分区始终创建在启动设备的末端。这样可以在不移动其他分区的情况下调整其大小。
您可以使用resize2fs工具调整启动分区的大小,该工具会在首次从SD卡启动新复制的镜像blob文件时由oem-config自动运行。
当新初始化的SD卡首次启动时,会运行oem-config程序,其功能之一就是设置APP分区的大小。该程序执行以下操作:
text
将备份GPT表头移动到磁盘末端
删除并重新创建根分区
向内核和操作系统通知分区表及根分区大小的变更
调整根分区上的文件系统大小以适应新的分区表和根分区尺寸
将Jetson Orin Nano开发套件从JetPack 5升级至JetPack 6
本更新流程提供开箱即用的支持,无需Linux主机即可将Jetson Orin Nano开发套件升级到JetPack 6。推荐方式是直接刷写设备。
更新前,请断开Jetson Orin Nano开发套件的NVMe存储设备,并插入SD卡。
无需Linux主机即可从JetPack 5升级到JetPack 6的步骤如下:
将QSPI中的当前槽位启动加载程序版本更新至JetPack 5.1.4,可使用JetPack 5.1.1 SD卡通过apt更新,或直接使用JetPack 5.1.4 SD卡: a) 使用JetPack 5.1.1 SD卡: - 准备载有JetPack 5.1.1镜像的SD卡(可从JetPack SDK 5.1.1下载)。制作SD卡镜像请参阅《使用Etcher刷写镜像到SD卡》 - 插入JetPack 5.1.1 SD卡启动开发套件 - 在UEFI菜单启动页面出现"Press ESCAPE for boot options"提示时,进入Boot Manager检查启动顺序,确保UEFI SD Device位于列表顶部。如未置顶,请参阅《UEFI菜单中自定义默认启动顺序》了解修改方法 - 根据需要完成oem-config配置 - 登录后通过sudo nvbootctrl dump-slots-info命令检查QSPI当前槽位启动加载程序版本,输出Current version应低于35.6.0 - 通过Debian OTA更新至最新JetPack 5版本(详见《升级到新的次要版本》) - 升级到JetPack 5.1.4的具体操作: ```bash $ sudo vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list ### 将以下行中的r35.x改为r35.6 deb https://repo.download.nvidia.com/jetson/common r35.6 main deb https://repo.download.nvidia.com/jetson/t234 r35.6 main text
12345678910111213141516
$ sudo apt update
$ sudo apt dist-upgrade
### 重启开发套件
$ sudo reboot
bash
12345
b) 使用JetPack 5.1.4 SD卡:
准备载有JetPack 5.1.4镜像的SD卡(可从JetPack SDK 5.1.4下载)。制作方法同上插入SD卡启动开发套件同样确保UEFI SD Device处于启动顺序首位完成oem-config配置登录后通过sudo nvbootctrl dump-slots-info检查QSPI当前槽位版本若Current version低于35.6.0(早于JetPack 5.1.4),重启开发套件将QSPI启动加载程序槽位更新至JetPack 5.1.4。更新后务必确认版本已升级至35.6.0,否则需从步骤b重复流程
重要提示:
重启前请运行sudo systemctl status nv-l4t-bootloader-config确认服务状态为0/SUCCESS当从JetPack 5.1.4 SD卡启动且启动加载程序版本低于35.6.0时,后台任务会设置UEFI胶囊更新请求,使下次启动时UEFI自动触发启动加载程序更新
安装以下Debian包将QSPI中的非当前启动加载程序槽位更新至JetPack 6,并重启开发套件:
创建/boot/efi目录并挂载esp分区(/dev/mmcblk1p10)
$ sudo mkdir -p /boot/efi
$ sudo mount /dev/mmcblk1p10 /boot/efi
安装Debian包并重启
$ sudo apt-get install nvidia-l4t-jetson-orin-nano-qspi-updater
$ sudo reboot
更新完成后,开发套件将启动至UEFI并停止运行
注:停止运行是因为QSPI中的启动加载程序与SD卡中的文件系统版本不匹配——启动加载程序为JetPack 6版本,而文件系统仍是JetPack 5版本。JetPack 6启动加载程序不兼容JetPack 5文件系统。
关闭开发套件电源
准备载有JetPack 6正式版镜像的SD卡(详见《使用Etcher刷写镜像到SD卡》)
插入JetPack 6正式版SD卡并启动开发套件,完成oem-config配置后进入用户空间
系统启动后通过sudo nvbootctrl dump-slots-info检查当前槽位启动加载程序版本,输出应为Current version: 36.x.x
运行以下命令将QSPI中另一个启动加载程序槽位同步至JetPack 6,并重启开发套件:
bash
$ sudo dpkg-reconfigure nvidia-l4t-bootloader
$ sudo reboot
更新完成并进入系统后,再次运行sudo nvbootctrl dump-slots-info确认当前版本为36.x.x,胶囊更新状态为1,且当前启动加载程序槽位输出与第7步不同
刷写到外部存储设备
initrd刷写工具支持刷写到外部存储设备。关于该工具的概述,请参阅《使用initrd刷写》。
要刷写外部设备,必须创建外部分区布局。相关信息请参阅启动架构主题中的《外部存储设备分区》。
大多数配置的默认分区布局为Linux_for_Tegra/tools/kernel_flash/flash_l4t_t234_nvme.xml。该分区布局被SDK管理器采用,并支持存储容量64GB及以上的外部介质。
Jetson Linux支持的外部存储设备是在Linux文件系统中显示为SCSI设备(设备名/dev/sd)和NVMe设备(/dev/nvmen*)的设备。NVIDIA在Linux BSP包中提供了必要的工具和说明。这些设备相关文件可能位于Linux_for_Tegra/tools/kernel_flash目录。更详细的说明请参阅该目录下README_initrd_flash.txt文件中的工作流程3、4和5。
刷写特定分区
您可以使用命令行选项-k来刷写特定分区,而无需刷写整个设备:
输入命令: bash $ sudo ./flash.sh -k <partition_name> [--image <image_name>] <board> <rootdev> 其中: <partition_name> 是要刷写的分区名称。可选值取决于目标设备,具体文件名请参阅《分区配置》主题中的分区配置文件表 <image_name> 是镜像文件名。如果省略,flash.sh将选择用于刷写整个设备的镜像文件 <board> 是目标设备的配置(详见Jetson模块与配置) <rootdev> 指定根文件系统所在的设备(详见《基础刷写脚本使用》)
1234567891011121314
示例
使用预定义配置文件列表刷写Jetson AGX Orin系列的A_MB1_BCT分区:
bash
$ sudo ./flash.sh -k A_MB1_BCT jetson-agx-orin-devkit mmcblk0p1
仅刷写Jetson Orin系列的QSPI:
bash
$ sudo ./flash.sh –no-systemimg -c bootloader/generic/cfg/flash_t234_qspi.xml
仅刷写NVMe SSD:
bash
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh –external-only –network usb0 –external-device nvme0n1 -c tools/kernel_flash/flash_l4t_t234_nvme.xml
刷写Jetson AGX Orin系列的UEFI启动加载程序(A_cpu-bootloader):
bash
$ sudo ./flash.sh -k A_cpu-bootloader jetson-agx-orin-devkit mmcblk0p1
刷写Jetson Orin Nano系列的UEFI启动加载程序(A_cpu-bootloader):
bash
$ sudo ./flash.sh -k A_cpu-bootloader -c bootloader/generic/cfg/flash_t234_qspi.xml jetson-orin-nano-devkit nvme0n1p1
刷写NVMe中的APP分区:
bash
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh –external-only –network usb0 -k APP –external-device nvme0n1 -c tools/kernel_flash/flash_l4t_t234_nvme.xml
配置NFS作为根文件系统的刷写
您可以将设备刷写为使用网络文件系统(NFS)作为根文件系统。
为网络文件系统作为根文件系统进行刷写
将设备进入恢复模式:启动载板电源;按住RECOVERY按钮,然后按下RESET按钮。
输入命令:
bash
$ sudo ./flash.sh -N <ip_addr>:<root_path> eth0
其中:
<ip_addr> 是主机系统的IP地址
<root_path> 是NFS根文件系统的路径
<board> 是目标设备的配置(详见Jetson模块与配置表)
12345
该命令会将启动加载程序和一个仅包含/boot目录的文件系统镜像刷写到设备,使系统在启动时使用<ip_addr>:<root_path>处的网络文件系统作为根文件系统。
对于Jetson Orin NX系列,如果未连接SD卡,请使用以下组合命令:
bash
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh –no-flash -p ” -c bootloader/generic/cfg/flash_t234_qspi.xml –no-systemimg” jetson-orin-nano-devkit internal
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh –no-flash -p ‘-N <ip_addr>:<root_path>’ –external-device -c tools/kernel_flash/flash_l4t_external.xml –external-only –append jetson-orin-nano-devkit eth0
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh –network usb0 –flash-only
其中额外参数:
<storage-device> 是连接到Jetson Orin NX的外部存储设备。例如:连接到Jetson Orin NX的NVMe SSD使用--external-device nvme0n1p1
1
使用initrd进行刷写
您可以使用初始内存磁盘(initrd)对Jetson设备的内部存储介质和外部连接存储介质进行刷写。该流程采用initrd和USB设备模式。
用于initrd刷写的工具和说明位于/Linux_for_Tegra/tools/kernel_flash/目录。详细信息请参阅同目录下的README_initrd_flash.txt文件。
README_initrd_flash.txt包含多个使用initrd刷写的工作流程示例:
刷写内部存储设备 刷写外部存储设备(如NVMe SSD和USB驱动器) 在外部存储设备上启用A/B根文件系统 在外部存储设备上启用磁盘加密 刷写单个分区 刷写已熔断的Jetson设备 向普通和已熔断的Jetson设备刷写量产镜像包 为外部和内部存储设备生成独立镜像,然后刷写组合镜像
123456789101112131415
环境要求
Initrd刷写需要高质量的USB-C转micro-USB数据线(低质量线缆可能导致刷写失败)。
安装必要依赖项:
bash
$ sudo tools/l4t_flash_prerequisites.sh # 适用于基于Debian的Linux系统
刷写工具通过IPv6地址空间fc00:1:1::/48使用NFS和SSH。
重要提示:
确保操作系统和防火墙允许使用该IPv6地址空间
验证工具已在Ubuntu 18.04及更高版本通过测试
123
使用initrd刷写
以下流程适用于具有内部存储(如eMMC)的设备。对于无内部存储的设备(如Jetson Orin Nano和Jetson Orin NX),请参阅《刷写到外部存储设备》。
将Jetson设备进入恢复模式 在主机上输入以下命令: bash $ cd Linux_for_Tegra $ sudo ./tools/kernel_flash/l4t_initrd_flash.sh <board-name> <rootdev> 其中: <board-name> 是目标设备的BOARD环境变量值(详见Jetson模块与配置表) <rootdev> 指定根文件系统所在的设备(详见《基础刷写脚本使用》)
12345678910111213
使用initrd克隆根文件系统
在设备上执行:
bash
$ sudo sed -i “//boot/efi/d” /etc/fstab
将Jetson设备进入恢复模式。
在主机上输入:
bash
$ cd Linux_for_Tegra
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh –initrd
参数说明同上。
进入Jetson设备的bash shell。
插入USB驱动器,通过以下命令将根文件系统分区克隆为精确副本system.img.raw到该USB驱动器:
bash
$ mount /dev/sda1 /mnt
$ dd if=<rootfs分区> of=/mnt/system.img.raw
$ sync
$ umount /mnt
其中/dev/sda1为插入的USB驱动器,<rootfs分区>可能是eMMC设备的/dev/mmcblk0p1或NVMe设备的/dev/nvme0n1p1。
将USB驱动器从Jetson设备拔出并连接到主机。
将system.img.raw文件从USB驱动器复制到主机。
通过以下命令将其转换为system.img稀疏镜像:
bash
$ cd Linux_for_Tegra
$ ./bootloader/mksparse –fillpattern=0 system.img.raw system.img
在Orin NX和Nano上使用initrd刷写
Initrd刷写是Jetson Orin NX系列和Jetson Orin Nano系列使用NVMe作为外部存储设备的官方刷写方法。您可以通过以下命令针对不同场景进行刷写:
默认情况刷写:
bash
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 -p "-c ./bootloader/generic/cfg/flash_t234_qspi.xml" -c ./tools/kernel_flash/flash_l4t_t234_nvme.xml --showlogs --network usb0 jetson-orin-nano-devkit external
1234
重要提示:
Jetson Orin开发者套件提供两个PCIe插槽连接NVMe存储设备:PCIe C4插槽支持较长的M2.2280 NVMe卡,PCIe C7插槽支持较短的M2.2230 NVMe卡。
当单个NVMe设备连接到任一插槽时,设备将被识别为nvme0n1
当两个NVMe设备同时连接到两个PCIe插槽时,C4插槽中的NVMe设备识别为nvme0n1,C7插槽中的设备识别为nvme1n1。刷写时应根据目标NVMe设备将--external-device设置为nvme0n1p1或nvme1n1p1。此种情况下,必须将<rootdev>指定为external,以便刷写工具使用root=PARTUUID=<part-uuid>选项设置内核命令行。更多信息请阅读Linux_for_Tegra/tools/kernel_flash目录下README_initrd_flash.txt文件中的"工作流程3"
启用根文件系统A/B分区的刷写:
12345
# 生成QSPI镜像
$ sudo ROOTFS_AB=1 ./tools/kernel_flash/l4t_initrd_flash.sh --showlogs -p "-c bootloader/generic/cfg/flash_t234_qspi.xml" --no-flash --network usb0 jetson-orin-nano-devkit internal
bash
123
# 生成外部存储设备镜像
$ sudo ROOTFS_AB=1 ./tools/kernel_flash/l4t_initrd_flash.sh --showlogs --no-flash --external-device nvme0n1p1 -c ./tools/kernel_flash/flash_l4t_t234_nvme_rootfs_ab.xml --external-only --append --network usb0 jetson-orin-nano-devkit external
bash
12
# 将镜像刷写到两个存储设备
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --showlogs --network usb0 --flash-only
bash
12
启用磁盘加密的刷写:
# 生成QSPI镜像
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --showlogs -p "-c bootloader/generic/cfg/flash_t234_qspi.xml" --no-flash --network usb0 jetson-orin-nano-devkit internal
bash
1234
# 生成外部存储设备镜像
$ sudo ROOTFS_ENC=1 ./tools/kernel_flash/l4t_initrd_flash.sh --showlogs --no-flash --external-device nvme0n1p1 -i ./ekb.key -c ./tools/kernel_flash/flash_l4t_t234_nvme_rootfs_enc.xml --external-only --append --network usb0 jetson-orin-nano-devkit external
bash
12
# 将镜像刷写到两个存储设备
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --showlogs --network usb0 --flash-only
bash
12
注:“-i ./ekb.key”选项指定磁盘加密密钥。请参考《磁盘加密》中的”如何在主机上创建加密根文件系统”。
同时启用根文件系统A/B分区和磁盘加密的刷写:
bash # 生成QSPI镜像 $ sudo ROOTFS_AB=1 ./tools/kernel_flash/l4t_initrd_flash.sh --showlogs -p "-c bootloader/generic/cfg/flash_t234_qspi.xml" --no-flash --network usb0 jetson-orin-nano-devkit internal # 生成外部存储设备镜像 $ sudo ROOTFS_AB=1 ROOTFS_ENC=1 ./tools/kernel_flash/l4t_initrd_flash.sh --showlogs --no-flash --external-device nvme0n1p1 -i ./ekb.key -c ./tools/kernel_flash/flash_l4t_t234_nvme_rootfs_ab_enc.xml --external-only --append --network usb0 jetson-orin-nano-devkit external # 将镜像刷写到两个存储设备 $ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --showlogs --network usb0 --flash-only
bash12345678910
在Orin NX和Nano上使用flash.sh
重要提示:
Orin NX和Nano的官方刷写方法是使用initrd刷写。
flash.sh使用的内存布局与initrd刷写不同。为确保OTA更新成功,生产系统必须使用initrd刷写。
出于开发目的(如分区刷写等特性),您可能需要使用flash.sh。以下刷写配置可与flash.sh配合使用:
jetson-orin-nano-devkit(支持SD卡)
在Jetson Orin Nano开发者套件上刷写SD卡的示例:
bash
123
$ sudo ./flash.sh jetson-orin-nano-devkit internal
jetson-orin-nano-devkit-nvme(支持NVME)
要刷写NVME,需要了解NVME插入连接器对应的PCIe控制器。PCIe C4插槽是较长的插槽,支持M2.2280 NVMe卡。PCIe C7插槽支持较短尺寸的M2.2230 NVMe卡。
刷写连接到PCIe C4的NVMe示例:
bash
$ sudo ./flash.sh jetson-orin-nano-devkit-nvme internal
刷写连接到PCIe C7的NVMe示例:
bash
$ sudo UPHYLANE=“c7x2” ./flash.sh jetson-orin-nano-devkit-nvme internal
Flash using initrd说明文档
NVIDIA Jetson Linux软件包提供了通过主机刷写Jetson设备的工具,该工具使用在目标设备上运行的恢复内核initrd。本文档详细描述了”使用initrd刷写”的操作流程。
环境要求:
本工具使用SSH与Jetson目标设备通信,并在主机上建立NFS服务器以便将文件从主机传输到目标设备。请确保您的防火墙和网络设置允许SSH连接到Jetson目标设备以及来自Jetson目标设备的NFS请求。
本工具使用IPv6协议。请确保您的内核设置、防火墙设置和网络设置允许IPv6通信。
运行以下脚本安装必要的依赖项:
$ sudo tools/l4t_flash_prerequisites.sh # 适用于基于Debian的Linux系统
123456
使用方法:
本工具不支持内部eMMC/SD卡的容量自动检测。因此,如果默认的"num_sectors"值不兼容,您可能需要修改bootloader/generic/cfg目录下配置文件中的"num_sectors"字段。必须确保num_sectors * sector_size(扇区大小)等于或小于Jetson设备内部eMMC/SD卡的实际容量。
本工具支持T194和T234系列设备。您可以使用-h选项查看工具支持的所有参数。
以下列举了一些initrd刷写的典型工作流程。
12345
工作流程1:如何一步完成单个设备刷写
步骤:
确保主机仅连接一台处于恢复模式的设备
在Linux_for_Tegra目录下运行以下命令:
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh <板卡名称> <根设备>
其中<板卡名称>和<根设备>参数与flash.sh命令中使用的对应变量类似(更多详细信息请参阅官方文档中的板卡名称表)。
12345
工作流程2:如何先生成镜像后再刷写目标设备
步骤:
连接设备时(在线模式):
确保主机仅连接一台处于恢复模式的设备
在Linux_for_Tegra目录下运行以下命令生成刷写镜像:
123
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --no-flash <板卡名称> <根设备>
bash
1
未连接设备时(离线模式):
在Linux_for_Tegra目录下运行以下命令生成刷写镜像:
1
$ sudo BOARDID=<板卡ID> FAB=<生产批次> BOARDSKU=<板卡SKU> BOARDREV=<板卡版本>
./tools/kernel_flash/l4t_initrd_flash.sh --no-flash <板卡名称> <根设备>
bash
12
再次将设备进入恢复模式
在Linux_for_Tegra目录下运行以下命令:
123
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --flash-only <板卡名称> <根设备>
bash
1
其中<板卡名称>和<根设备>参数与flash.sh命令中使用的对应变量类似(更多详细信息请参阅官方文档中的板卡名称表)(https://docs.nvidia.com/jetson/archives/r38.2/DeveloperGuide/IN/QuickStart.html#in-quickstart-jetsonmodulesandconfigurations)。
根设备:https://docs.nvidia.com/jetson/archives/r38.2/DeveloperGuide/SD/FlashingSupport.html#sd-flashingsupport-basicflashingscriptusage
环境变量取值请参考本文档底部的表格说明。
工作流程3:如何刷写到外部存储设备
环境要求
要刷写到外部连接的存储设备,您需要为外部设备创建自己的分区配置文件xml文件。具体操作方法请参阅开发者指南中的”外部存储设备分区”章节。特别需要注意的是,由于Initrd刷写不支持容量自动检测,您需要修改分区配置文件xml中的”num_sectors”字段以匹配您的外部存储设备。必须确保num_sectors * sector_size(扇区大小)等于或小于外部存储设备的实际容量。对于所有类型的外部设备,设备”type”都需要设置为”nvme”。
tools/kernel_flash目录下提供了三个示例xml文件。这些示例假设连接的外部存储设备容量为64GB及以上:
flash_l4t_external.xml:包含位于外部存储设备上的根文件系统、内核和内核设备树
flash_l4t_nvme_rootfs_enc.xml:用于外部存储设备磁盘加密功能的示例分区配置
flash_l4t_nvme_rootfs_ab.xml:用于外部存储设备根文件系统A/B分区的示例分区配置
12345
要进行刷写,请在Linux_for_Tegra目录下运行以下命令:
$ sudo ADDITIONAL_DTB_OVERLAY_OPT=<选项> ./tools/kernel_flash/l4t_initrd_flash.sh --external-device <外部设备>
-c <外部分区布局>
[ --external-only ]
[ -S <APP分区大小> ]
[ --network <网络参数> ] <板卡名称> <根设备>
bash
12345
参数说明:
<板卡名称>和<根设备>变量与flash.sh中使用的变量类似(更多详细信息请参阅官方文档的板卡名称表)
<根设备>可设置为”mmcblk0p1″或”internal”表示从内部设备启动,或设置为”external”、”sda1″或”nvme0n1p1″表示从外部设备启动。如果外部设备的分区布局包含”APP”分区,此处指定”nvme0n1p1″将生成根文件系统启动命令行:root=/dev/nvme0n1p1。如果<根设备>为internal或external,工具将生成根文件系统命令行:root=PARTUUID=…
注意:对于双NVMe的Jetson设备,<根设备>必须为internal或external,以便在内核命令行中使用root=PARTUUID=…
<外部分区布局>是外部存储设备的分区布局XML文件
<外部设备>是要刷写的外部存储设备在’/dev/'目录中的名称(如nvme0n1p1、nvme1n1p1、sda1)
<APP分区大小>是包含操作系统的分区大小(字节)。允许使用KiB、MiB、GiB简写,例如1GiB表示102410241024字节。此大小不能大于<外部分区布局>中指定的”num_sectors” * “sector_size”,且必须足够小以容纳分区布局中的其他分区
使用–external-only选项仅刷写外部存储设备。如果不提供此选项,命令将同时刷写内部和外部存储设备
如果希望通过以太网协议而非USB协议进行刷写,使用–network <网络参数>。对于USB等外部设备,以太网协议比USB协议更可靠。
<网络参数>可以是:通过USB刷写线使用以太网协议时为”usb0″,通过RJ45网线使用以太网协议时为”eth0:<目标IP>/<子网>:<主机IP>”
(可选)声明ADDITIONAL_DTB_OVERLAY_OPT=<选项>,其中<选项>可以是BootOrderNvme.dtbo。这允许UEFI优先从NVMe SSD启动。<选项>也可以是BootOrderUsb.dtbo,允许UEFI优先从USB存储驱动器启动
示例用法:
刷写NVMe SSD并使用其上的APP分区作为根文件系统
sudo ADDITIONAL_DTB_OVERLAY_OPT="BootOrderNvme.dtbo" --external-device nvme0n1p1 -c ./tools/kernel_flash/flash_l4t_external.xml --showlogs jetson-xavier nvme0n1p1
bash
1
刷写USB连接的存储设备并使用其上的APP分区作为根文件系统
sudo ADDITIONAL_DTB_OVERLAY_OPT="BootOrderUsb.dtbo" --external-device sda1 -c ./tools/kernel_flash/flash_l4t_external.xml --showlogs jetson-xavier mmcblk0p1
bash
1
刷写NVMe SSD并使用分区UUID(在l4t-rootfs-uuid.txt_ext中指定)作为根文件系统:
sudo ADDITIONAL_DTB_OVERLAY_OPT="BootOrderNvme.dtbo" --external-device nvme0n1p1 -c ./tools/kernel_flash/flash_l4t_external.xml --showlogs jetson-xavier external
bash
1
Initrd刷写依赖于–external-device选项和最后一个参数<根设备>来生成正确的镜像。支持以下组合
–external-device | < rootdev> | Results |
---|---|---|
nvmenp* / sda* | internal | External device contains full root filesystem with kernel commandline: rootfs=PARTUUID=< external-uuid> Internal device contains full root filesystem with kernel commandline: rootfs=PARTUUID= |
nvmenp* / sda* | nvme0np / sd* | External device contains full root filesystem with with kernel commandline rootfs=/dev/nvme0n1p1 Internal device contains minimal filesystem with kernel command line rootfs=/dev/nvme0n1p1 |
nvmenp* / sda* | mmcblk0p1 | External device contains full root filesystem with with kernel commandline rootfs=/dev/nvme0n1p1 Internal device contains full filesystem with kernel command line rootfs=/dev/mmcblk0p1 |
nvmenp* / sda* | external | External device contains full root filesystem with kernel commandline: rootfs=PARTUUID= Internal device contains minimal root filesystem with |
工作流程4:如何刷写带有内部QSPI和外部存储设备的设备:
某些Jetson设备(如Jetson Orin NX和Jetson Xavier NX)具有内部QSPI和外部存储设备,flash.sh可能尚未支持此类设备的刷写。在这种情况下,您可以使用以下命令:
对于带有内部QSPI和外部NVMe的设备(第一个或唯一的NVMe):
sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1
-c tools/kernel_flash/flash_l4t_external.xml
-p "-c bootloader/generic/cfg/flash_t234_qspi.xml --no-systemimg" --network usb0
<板卡型号> external
bash
1234
对于带有内部QSPI和外部NVMe的设备(第二个NVMe):
sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme1n1p1
-c tools/kernel_flash/flash_l4t_external.xml
-p "-c bootloader/generic/cfg/flash_t234_qspi.xml --no-systemimg" --network usb0
<板卡型号> external
bash
1234
对于带有内部QSPI和外部USB存储的设备:
sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device sda1
-c tools/kernel_flash/flash_l4t_external.xml
-p "-c bootloader/generic/cfg/flash_t234_qspi.xml --no-systemimg" --network usb0
<板卡型号> external
bash
1234
工作流程5:支持ROOTFS_AB并从外部设备启动:
通过将ROOTFS_AB环境变量设置为1来支持ROOTFS_AB功能。例如:
bash
sudo ROOTFS_AB=1 ./tools/kernel_flash/l4t_initrd_flash.sh
--external-device nvme0n1
-S 8GiB
-c ./tools/kernel_flash/flash_l4t_nvme_rootfs_ab.xml
jetson-xavier
external
bash
123456
工作流程6:安全启动
安装安全启动包后,您可以刷写PKC熔断或SBKPKC熔断的Jetson设备。例如:
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh
-u pkckey.pem
-v sbk.key
[-p "--user_key user.key" ]
--external-device nvme0n1
-S 8GiB
-c ./tools/kernel_flash/flash_l4t_external.xml
jetson-xavier
external
bash
123456789
工作流程7:Initrd量产刷写
Initrd量产刷写适用于工作流程3、4、5。Initrd量产刷写需要分两步进行。
首先,使用–no-flash、–massflash 和–network usb0选项生成量产刷写包,其中是可能同时刷写的最大设备数量。
支持在线模式和离线模式(详细内容参见工作流程2)。在以下示例中,我们使用离线模式创建一个能够同时刷写5台设备的刷写环境:
$ sudo BOARDID=<板卡ID> FAB=<生产批次> BOARDSKU=<板卡SKU> BOARDREV=<板卡版本>
./tools/kernel_flash/l4t_initrd_flash.sh --no-flash --massflash 5 --network usb0 jetson-xavier-nx-devkit-emmc mmcblk0p1
bash
12
(BOARDID、FAB、BOARDSKU和BOARDREV的值请参考本文档底部的表格)
其次:
将所有5台Jetson设备连接到刷写主机(确保所有设备的硬件版本完全一致,符合README_Massflash.txt中的要求)
将所有连接的Jetson设备置于RCM模式
运行:
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --flash-only --massflash 5 --network usb0
bash
1
(可选添加–showlogs显示所有日志)
注意:实际连接的设备数量可以少于量产包支持的最大设备数量。
技巧:
工具提供–keep选项保留刷写环境,以及–reuse选项重用刷写环境以加速量产刷写:
首次量产刷写:
bash
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --flash-only --massflash 5 --network usb0 --keep
bash
1
第二次量产刷写:
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --flash-only --massflash 5 --network usb0 --reuse
bash
1
使用ionice使刷写进程获得系统最高I/O优先级:
$ sudo ionice -c 1 -n 0 ./tools/kernel_flash/l4t_initrd_flash.sh --flash-only --network usb0 --massflash 5
bash
1
工作流程8:安全Initrd量产刷写
以下是在非安全工厂环境中进行刷写的步骤:
首先,使用–no-flash和–massflash 选项生成量产刷写包,并通过-u和-v选项指定必要的密钥,其中是可能同时刷写的最大设备数量。在以下示例中,我们在在线模式下创建一个能够同时刷写5台设备的刷写环境:
bash
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh -u [-v ] –no-flash –massflash 5 jetson-xavier-nx-devkit-emmc mmcblk0p1
工具会生成一个名为mfi_<目标板卡>.tar.gz的压缩包,其中包含在非安全环境中刷写所需的所有最小化二进制文件。将此压缩包下载到不安全环境,并解压以创建刷写环境。例如:
bash
$ scp mfi_<目标板卡>.tar.gz <工厂主机IP>:<工厂主机目录>
…
在工厂主机上解压:
$ sudo tar xpfv mfi_<目标板卡>.tar.gz
其次,执行以下操作:
将Jetson设备连接到刷写主机(确保所有设备的硬件版本完全一致,符合README_Massflash.txt中的要求)
将所有连接的Jetson设备置于RCM模式
运行:
12345
$ cd mfi_<目标板卡>
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --flash-only --massflash 5
bash
12
(可选添加–showlogs显示所有日志)
工作流程9:刷写单个分区
Initrd刷写提供了基于索引文件刷写单个分区的选项。运行initrd刷写时,会根据分区配置布局XML文件在tools/kernel_flash/images目录下生成索引文件(内部存储为images/internal/flash.idx,外部存储为images/external/flash.idx)。使用”-k”选项,initrd刷写可以根据索引文件中指定的分区标签刷写单个分区。
示例:
刷写内部设备的eks分区:
bash
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh -k eks jetson-xavier mmcblk0p1
bash
1
刷写外部设备的kernel-dtb分区:
bash
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh
--external-device nvme0n1p1
-c ./tools/kernel_flash/flash_l4t_external.xml
-k kernel-dtb --external-only jetson-xavier mmcblk0p1
bash
1234
工作流程10:外部设备的磁盘加密支持
对于Jetson Xavier上外部设备的磁盘加密,您可以使用以下命令刷写外部设备:
在Linux_for_Tegra目录下运行:
bash
$ sudo ROOTFS_ENC=1 ./tools/kernel_flash/l4t_initrd_flash.sh --external-device <外部设备>
-c <外部分区布局>
[-p "-i encryption.key" ] --external-only
-S <APP分区大小> jetson-xavier external
bash
1234
其中:
所有参数与上述相同
<外部分区布局>是包含APP、APP_ENC和UDA加密分区的外部存储分区布局。本目录中的flash_l4t_nvme_rootfs_enc.xml作为示例提供
123
工作流程11:分别生成内部设备和外部设备镜像后进行刷写
刷写工具支持三步流程:先为内部设备生成镜像,再为外部设备生成镜像,最后进行刷写。这是通过使用”append”选项实现的。以下四个示例展示其工作原理:
示例1:为内部设备生成普通根文件系统配置,然后为外部设备生成加密根文件系统,最后刷写
将设备置于恢复模式,为内部设备生成普通根文件系统:
1
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --no-flash jetson-xavier internal
bash
1
(如需离线生成镜像,可使用:
$ sudo BOARDID=2888 BOARDSKU=004 FAB=400 ./tools/kernel_flash/l4t_initrd_flash.sh --no-flash jetson-xavier internal
bash
1
将设备置于恢复模式,为外部设备生成加密文件系统:
1
$ sudo ROOTFS_ENC=1 ./tools/kernel_flash/l4t_initrd_flash.sh --no-flash
--external-device nvme0n1p1
-S 8GiB -c ./tools/kernel_flash/flash_l4t_nvme_rootfs_enc.xml
--external-only --append jetson-xavier external
bash
1234
(如需离线生成镜像,可使用:
$ sudo BOARDID=2888 BOARDSKU=0004 FAB=400 ./tools/kernel_flash/l4t_initrd_flash.sh --no-flash
--external-device nvme0n1p1
-S 8GiB -c ./tools/kernel_flash/flash_l4t_nvme_rootfs_enc.xml
--external-only --append jetson-xavier external
bash
1234
将设备置于恢复模式,刷写两个镜像:
1
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --flash-only
bash
1
示例2:本例中,您希望从连接的NVMe SSD启动Jetson Xavier NX SD。SD卡无需插入。如果您不想使用Jetson Xavier NX eMMC上的eMMC,也可以应用此方法。
将设备置于恢复模式,为内部设备仅生成qspi镜像:
1
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --no-flash jetson-xavier-nx-devkit-qspi internal
bash
1
注:此处给出的板卡名称不是jetson-xavier-nx-devkit或jetson-xavier-nx-devkit-emmc,因此不会生成SD卡或eMMC镜像。
将设备置于恢复模式,为外部设备生成普通文件系统:
1
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --no-flash
--external-device nvme0n1p1
-c ./tools/kernel_flash/flash_l4t_external.xml
--external-only --append jetson-xavier-nx-devkit external
bash
1234
将设备置于恢复模式,刷写两个镜像:
1
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --flash-only
bash
12
示例3:使用–append选项创建包含加密内部镜像和普通外部镜像的量产刷写包
将设备置于恢复模式,为内部设备生成加密根文件系统镜像:
1
$ sudo ROOTFS_ENC=1 ./tools/kernel_flash/l4t_initrd_flash.sh --no-flash jetson-xavier internal
bash
1
将设备置于恢复模式,为外部设备生成普通文件系统,并创建能够同时刷写两台设备的量产刷写包:
1
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --no-flash
--external-device nvme0n1p1
-S 8GiB -c ./tools/kernel_flash/flash_l4t_external.xml
--external-only --massflash 2 --append jetson-xavier external
bash
1234
将两台设备置于恢复模式,刷写两台设备:
1
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --flash-only --massflash 2
bash
1
示例4:为内部设备生成加密根文件系统配置,然后为外部设备生成加密根文件系统,最后刷写
将设备置于恢复模式,为内部设备生成加密根文件系统:
1
$ sudo ROOTFS_ENC=1 ./tools/kernel_flash/l4t_initrd_flash.sh --no-flash jetson-xavier internal
bash
1
第二步:将设备置于恢复模式,为外部设备生成加密文件系统:
$ sudo ROOTFS_ENC=1 ./tools/kernel_flash/l4t_initrd_flash.sh --no-flash
--external-device nvme0n1p1
-S 8GiB -c ./tools/kernel_flash/flash_l4t_nvme_rootfs_enc.xml
--external-only --append jetson-xavier external
bash
1234
第三步:将设备置于恢复模式,刷写两个镜像:
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --flash-only
bash
1
工作流程12:手动生成可启动外部存储设备:
您可以使用此工具手动生成可启动的外部存储设备,如NVMe SSD、SD卡或USB设备。当连接处于恢复模式的Jetson设备时,使用以下命令:
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --direct <主机端外部设备>
-c <外部分区布局>
--external-device <目标端外部设备>
[ -p <选项> ]
[ -S <根文件系统大小> ]
<板卡名称> external
bash
123456
其中:
<主机端外部设备> 是外部设备在主机上显示的/dev节点名称。例如,如果在PC上插入USB设备并显示为/dev/sdb,则<主机端外部设备>为sdb <目标端外部设备> 对于NVMe SSD为"nvme0n1p1",USB设备为"sda1",SD卡为"mmcblk1p1" <外部分区布局> 是外部存储设备的分区布局XML文件。您可以使用./tools/kernel_flash/flash_l4t_external.xml作为示例 <根文件系统大小>(可选)是外部存储设备上APP分区的大小。请注意,这与外部存储设备的总大小不同(总大小由<外部分区布局>中的num_sectors字段定义) <选项>(可选)是生成外部存储设备时使用的任何其他选项。例如,如果要添加内核选项"kmemleak",请指定-p "-C kmemleak"
123456789
如果未连接处于恢复模式的Jetson设备,请在运行刷写命令时指定这些环境变量:
sudo BOARDID=<板卡ID> FAB=<生产批次> BOARDSKU=<板卡SKU> BOARDREV=<板卡版本>
./tools/kernel_flash/l4t_initrd_flash.sh ...
bash
12
这些变量的取值请参考本文档底部的表格。
附录:
环境变量值表:
text
# # 板卡ID 板卡SKU 生产批次 板卡版本 # ----------------------------------+--------+---------+----+--------- # jetson-agx-xavier-industrial 2888 0008 600 A.0 # clara-agx-xavier-devkit 3900 0000 001 C.0 # jetson-xavier-nx-devkit 3668 0000 100 不适用 # jetson-xavier-nx-devkit-emmc 3668 0001 100 不适用 # jetson-xavier-nx-devkit-emmc 3668 0003 不适用 不适用 # jetson-agx-xavier-devkit (16GB) 2888 0001 400 H.0 # jetson-agx-xavier-devkit (32GB) 2888 0004 400 K.0 # jetson-agx-orin-devkit 3701 0001 TS1 C.2 # jetson-agx-orin-devkit 3701 0000 TS4 A.0 # jetson-agx-xavier-devkit (64GB) 2888 0005 402 B.0 # holoscan-devkit 3701 0002 TS1 A.0 # jetson-agx-orin-devkit 3701 0004 TS4 A.0 # jetson-agx-orin-devkit (64GB) 3701 0005 500 # jetson-orin-nano-devkit (NX 16GB) 3767 0000 300 # jetson-orin-nano-devkit (NX 8GB) 3767 0001 300 # jetson-orin-nano-devkit (Nano 4GB) 3767 0004 300 # jetson-orin-nano-devkit (Nano 8GB) 3767 0003 300 # jetson-orin-nano-devkit (Nano 8GB) 3767 0005 300 # ----------------------------------+--------+---------+----+---------
bash12345678910111213141516171819202122
其他环境变量:
EXTOPTIONS:为外部设备生成刷写镜像时的刷写选项
ADDITIONAL_DTB_OVERLAY_OPT:生成刷写镜像时为UEFI添加额外的叠加设备树