BSP 定制
您可以通过以下方式定制 NVIDIA® Jetson™ Linux 驱动程序包 (L4T):
• 在使用前手动配置和设置软件驱动程序。
• 使用 NVIDIA® SDK 管理器执行自定义设置。
注意 | NVIDIA SDK 管理器执行以下操作 • 安装 NVIDIA® Jetson™ Linux 驱动程序包 • 配置或刷写您的 Jetson 设备 • 运行示例 如果您使用 SDK 管理器安装,请跳过这些主题。有关更多信息,请参阅平台对应的 Jetson 开发者套件用户指南中的“安装 JetPack”部分。 |
启动选项
在 NVIDIA® Jetson™ 参考板上,Linux 从集成内存(eMMC 或 QSPI)、连接内存(SD 卡或 USB 设备)或网络可访问存储上的根文件系统 (rootfs) 启动。
引导加载程序必须从内部 eMMC 加载。
内核和 DTB 可以从以下位置加载
• SD 卡(格式化为 GPT)
• USB 驱动器(格式化为 GPT)
• 网络(通过 DHCP/TFTP)
• NVMe SSD(格式化为 GPT)
为 Jetson AGX Xavier 系列平台选择启动设备
适用于:Jetson AGX Xavier 系列
CBoot 启动选项 (CBO) 是一个设备树,可用于设置某些启动配置选项,例如启动设备优先级和用于从网络启动的 IP 地址。
CBO 设备树节点的名称是 boot-configuration。
节点属性
boot-order
boot-order 属性包含按优先级排序的启动设备列表。每个设备都由其名称和控制器信息指定。可能的条目有
• sd:表示任何控制器上的 SD 卡。
• usb:表示任何控制器和端口上的外部 USB 大容量存储设备。
• net:表示网络启动。
• emmc:表示内置 MMC 存储。
• nvme…:表示内置 NVMe SSD 存储。条目的格式是以下之一
• nvme: C<n> | 到 PCIe 设备 <n> 上的 NVMe 存储 |
• nvme:pcie@<addr> | 使用 PCIe 地址 <addr> 处的 NVMe 存储 |
• nvme | 使用任何可用的 NVMe 设备 |
例如
boot-order = "sd", "usb", "nvme", "net", "emmc";
tftp-server-ip
tftp-server-ip 属性指定 TFTP 服务器的 IP 地址。
该属性指定为
tftp-server-ip = /bits/ 8 <a b c d>
其中 <a b c d> 是 V4 IP 地址的四个部分。
dhcp-enabled
dhcp-enabled 属性没有值。如果它存在,设备将从 DHCP 服务器获取其 IP 配置。如果它不存在,设备将从 static-ip、ip-netmask 和 ip-gateway 属性获取其 IP 配置。
static-ip、ip-netmask 和 ip-gateway
static-ip 属性在 IP 配置中指定静态 IP 地址。
ip-netmask 属性在 IP 配置中指定 IP 地址的子网掩码。
ip-gateway 属性在 IP 配置中指定网关的 IP 地址。
如果 dhcp-enabled 为 false 或未指定,则所有三个属性都是必需的;否则,它们不是必需的,如果存在则会被忽略。
这些属性指定为
static-ip = /bits/ 8 <a b c d>
ip-netmask = /bits/ 8 <a b c d>
ip-gateway = /bits/ 8 <a b c d>
其中 <a b c d> 是 V4 IP 地址或子网掩码的四个部分。
示例
本主题介绍完整的 boot-configuration 定义示例。
示例:DHCP 已启用
/dts-v1/;
/ {
compatible = "nvidia,cboot-options-v1";
boot-configuration {
boot-order = "sd", "usb", "nvme", "emmc", "net";
tftp-server-ip = /bits/ 8 <10 1 2 3>;
dhcp-enabled;
};
};
示例:指定静态 IP 配置
/dts-v1/;
/ {
compatible = "nvidia,cboot-options-v1";
boot-configuration {
boot-order = "sd", "usb", "nvme", "net", "emmc";
tftp-server-ip = /bits/ 8 <10 1 2 3>;
static-ip = /bits/ 8 <10 1 2 2>;
ip-netmask = /bits/ 8 <255 255 255 0>;
ip-gateway = /bits/ 8 <10 1 2 1>;
};
};
重新构建 DTB
如果您修改了 DTS,则必须重新构建 DTB。
要修改 DTS 并重新构建 DTB
1. 在此目录中找到 cbo.dts 文件
$ cd <bsp>/Linux_for_Tegra/bootloader/
其中 <bsp> 是 Jetson 板级支持包 BSP 的位置。
2. 根据需要修改文件。有关更多信息,请参见上面的
节点属性和
示例。
3. 输入此命令以将 DTS 转换为 DTB
dtc -I dts -O dtb -o cbo.dtb cbo.dts
dtc 可执行文件位于
<bsp>/Linux_for_tegra/kernel/dtc
为其他平台选择启动设备
适用于:Jetson Nano 设备、Jetson TX2 系列和 Jetson TX1
在 NVIDIA® Jetson AGX Xavier™ 系列以外的平台上,CBoot 使用 U‑Boot 执行启动过程。启动设备优先级由 U‑Boot 确定。
Linux 主机系统先决条件
要在 Linux 主机系统上使用 L4T,必须满足以下硬件和软件先决条件
• 运行 Linux 的主机 PC
• 内核镜像
L4T 包含供您使用的内核镜像。或者,您可以从源代码下载并重新构建内核镜像。
• 引导加载程序
在 NVIDIA® Jetson™ 开发者板上刷写需要引导加载程序,即 NVIDIA T-Boot (nvtboot)。
• 网络文件系统
如果您打算从 Linux 主机系统或网络可访问服务器在参考板上启动 Linux。
• 连接到恢复端口的 USB 电缆。
在主机系统上设置 TFTP 服务器
主机系统必须提供 TFTP 服务器供目标设备使用。
要设置 TFTP 服务器
1. 通过输入此命令安装 tftp 包及其依赖项
$ sudo apt-get install xinetd tftpd tftp
2. 创建文本文件 /etc/xinetd.d/tftp,例如通过输入命令
$ sudo vim /etc/xinetd.d/tftp
3. 将以下内容放入文件中,然后保存
service tftp
{
protocol = udp
port = 69
socket_type = dgram
wait = yes
user = nobody
server = /usr/sbin/in.tftpd
server_args = ~/tftpboot
disable = no
}
4. 生成已签名的内核镜像。创建目录 ~/tftpboot(指定由 server_args 定义的路径名)并将内核镜像复制到其中
$ sudo ./flash.sh -k kernel --no-flash --sign <board> mmcblk0p1
$ mkdir ~/tftpboot
$ cp /Linux_for_Tegra/bootloader/boot_sigheader.img.encrypt ~/tftpboot/boot.img
5. 生成已签名的 .dtb 并将 .dtb 文件复制到同一目录。
• 对于 NVIDIA Jetson Xavier™ NX
$ sudo ./flash.sh -k kernel-dtb --no-flash --sign jetson-xavier-nx-devkit mmcblk0p1
$ cp /Linux_for_Tegra/bootloader/tegra194-p3668-p3509-0000_sigheader.dtb.encrypt ~/tftpboot/jetson.dtb
• 对于 Jetson AGX Xavier 系列
$ sudo ./flash.sh -k kernel-dtb --no-flash --sign jetson-xavier mmcblk0p1
$ cp /Linux_for_Tegra/bootloader/tegra194-p2888-0001-p2822-0000_sigheader.dtb.encrypt ~/tftpboot/jetson.dtb
6. 重启 xinetd 服务器
$ sudo service xinetd restart
提取 Jetson Linux 驱动程序包
使用以下步骤提取 Jetson Linux 驱动程序包 (L4T)。示例中的命令假定您在 ~/ 中提取了发行包。
要提取 Jetson Linux 驱动程序包
• 通过执行以下命令手动提取软件包
$ sudo tar -vxjf Jetson_Linux_R<release_num>_aarch64.tbz2
其中 <release_num> 是当前版本的发行号。
登录凭据
L4T 不提供默认登录凭据。首次启动时创建您自己的登录凭据。
安装其他软件包
NVIDIA 在 APT (Debian) 存储库中提供额外的 L4T 软件组件和更新,可通过 apt 实用程序访问。
NVIDIA 维护以下 APT 存储库
• 对于 NVIDIA® Jetson™ Nano 设备和 Jetson TX1:https://repo.download.nvidia.com/jetson/t210
• 对于 Jetson TX2 系列:https://repo.download.nvidia.com/jetson/t186
• 对于 Jetson AGX Xavier 系列:https://repo.download.nvidia.com/jetson/t194
• 所有 Jetson 平台上使用的软件包:https://repo.download.nvidia.com/jetson/common
软件包 nvidia-l4t-apt-source 预安装在 L4T 根文件系统中。它识别其运行的平台,并将相应的存储库添加到软件源列表。
APT 存储库中的软件包使用 GPG 密钥签名。相应的公钥预安装在 L4T 根文件系统中。将存储库添加到源列表后,apt 可以下载并安装软件包。
注意 | 此处描述的 APT 存储库也用于升级现有软件包和安装 NVIDIA 添加到最初随 L4T 安装的软件包集中的软件包。有关更多信息,请参见主题 更新 Jetson 设备和主机。 |
重新打包 Debian 软件包
您可以使用脚本 nvdebrepack.sh 重新打包现有的 L4T Debian 软件包。该脚本可以在 Linux_for_Tegra/tools/Debian/ 中找到。有关用法和示例,请参见 Linux_for_Tegra/tools/Debian/nvdebrepack.txt。
自行构建 Debian 引导加载程序包
此过程是上述
重新打包 Debian 软件包过程的替代方法。
Debian 引导加载程序包根据您的 Jetson 设备中处理器的类型安装一个或多个有效负载文件。软件包的安装后脚本会自动从有效负载文件更新引导加载程序。
引导加载程序包的分布式版本仅支持 Jetson 参考载板。如果您正在使用自定义载板,您可能需要自定义此软件包以更改 ODM 数据、引脚复用分配等。要自定义引导加载程序
1. 生成您需要更改的 BUP 的自定义版本。
2. 解包软件包。
3. 将适用的 BUP 或 BUP 替换为您的自定义版本。
4. 将 BUP 重新打包到软件包中。
5. 安装自定义软件包。
本节介绍 NVIDIA 用于构建引导加载程序包的软件包依赖项和脚本。您可以将其用作创建自己的引导加载程序包的参考。
引导加载程序包的版本
Jetson Linux 可以获取两个版本的引导加载程序包,具体取决于您使用的 Jetson 设备。引导加载程序包安装以下有效负载
• Jetson Nano 设备和 Jetson TX1 的软件包
/opt/ota_package/t21x/bl_update_payload
• 其他 Jetson 设备的软件包
• Jetson Xavier NX 系列和 Jetson AGX Xavier 系列的 BUP
• /opt/ota_package/t19x/bl_only_payload
• /opt/ota_package/t19x/bl_update_payload
• Jetson TX2 系列的 BUP
• /opt/ota_package/t18x/bl_only_payload
• /opt/ota_package/t18x/bl_update_payload
预依赖项和依赖项
引导加载程序包的预依赖项是
• nvidia-l4t-core(必须与此软件包的主版本匹配)
软件包的依赖项是
• nvidia-l4t-tools
软件包脚本
该软件包有一个安装后脚本,您可以通过提取 .deb 文件来获取它。它执行 BUP 安装。
自行构建内核 Debian 软件包
您可以通过获取内核源软件包、进行更改和构建 Debian 软件包来自定义 L4T 内核。
本节介绍 NVIDIA 用于构建内核软件包的软件包依赖项和脚本。您可以将其用作创建自己的 Debian 软件包的参考。
使用软件包
内核软件包都是开源的。四个内核软件包中的三个在 public_sources.tbz2 中。您可以从 NVIDIA 开发者中心通过以下链接下载此存档
此存档包含另一个名为 kernel_src.tbz2 的存档,而 kernel_src.tbz2 又包含三个头文件目录
• nvidia-l4t-kernel/
• nvidia-l4t-kernel-dtbs/
• nvidia-l4t-kernel-headers/
debian.org
Debian 维护者指南 提供了修改开源文件并从中创建新的 Debian 软件包的指南。
第四个内核软件包
nvidia-l4t-jetson-io 在下面的
nvidia-l4t-jetson-io 中讨论。
软件包依赖项
大多数 L4T Debian 软件包都预依赖于 nvidia-l4t-core。此软件包可防止在不兼容的 Jetson 平台上安装软件包,例如,在 Jetson Nano 设备上安装 Jetson TX2 内核。nvidia-l4t-core 如果检测到不兼容的平台,则不会执行安装。
nvidia-l4t-core 还防止部分升级,即一个 L4T 软件包升级到新的主版本(例如,从版本 32.4 升级到版本 32.5),但依赖于它的其他 L4T 软件包也未升级。部分升级可能会导致已升级的固件、程序和库与未升级的固件、程序和库之间出现兼容性问题。
nvidia-l4t-kernel
nvidia-l4t-kernel 包含 L4T 内核本身的文件。
预依赖项和依赖项
此软件包的预依赖项是
• nvidia-l4t-core(必须与此软件包的主版本匹配)
此软件包的依赖项是
• 无
软件包脚本
此软件包有一个安装后脚本,您可以通过提取 .deb 文件来获取它。它执行以下操作
1. 执行 depmod -a。
2. 创建名为 /usr/lib/linux/triggers/<release> 的 dpkg 触发器文件。触发器调用 /etc/kernel/postinst.d 中定义的操作,以在内核更新时更新 initramfs/grub configs/…。这符合标准的 Ubuntu 内核更新过程。
nvidia-l4t-kernel-dtbs
nvidia-l4t-kernel-dtbs 包含 L4T 设备树 Blob (DTB) 的文件。
该软件包将所有 .dtb 文件安装在 /boot/ 中。当您刷写板时,它会通过检查板规范与 DTB 的兼容性信息,将板使用的 .dtb 文件安装在 /boot/dtb/ 中。
预依赖项和依赖项
此软件包的预依赖项是
• nvidia-l4t-core(必须与此软件包的主版本匹配)
此软件包的依赖项是
• device-tree-compiler
• nvidia-l4t-kernel
软件包脚本
此软件包有一个安装后脚本,您可以通过提取 .deb 文件来获取它。
安装后脚本执行以下操作
1. 反编译 /boot/dtb/ 中板使用的 .dtb 文件,并在 /chosen 节点中获取 bootargs 属性。
2. 反编译
/boot/ 中相应的
.dtb 文件,并将步骤
1 中的
bootargs 属性替换到生成的
.dts 文件中。
3. 将 .dts 文件重新编译为 .dtb 文件,并将其放在 /boot/dtb/ 中。
nvidia-l4t-kernel-headers
nvidia-l4t-kernel-headers 包含 L4T 内核头文件。
预依赖项和依赖项
此软件包的预依赖项是
• nvidia-l4t-core(必须与此软件包的主版本匹配)
此软件包的依赖项是
• nvidia-l4t-kernel
软件包脚本
此软件包有一个安装后脚本,您可以通过提取 .deb 文件来获取它。该脚本执行以下操作
1. 将内核头文件 tarball 提取到 /usr/src/。
2. 更新两个符号链接文件 build 和 source,以指向正确的内核头文件目录。
nvidia-l4t-jetson-io
nvidia-l4t-jetson-io 包含与 Jetson I/O 功能相关的 Python 脚本。
预依赖项和依赖项
此软件包的预依赖项是
• nvidia-l4t-core(必须与此软件包的主版本匹配)
此软件包的依赖项是
• mount
• python3
• util-linux
• nvidia-l4t-kernel
• device-tree-compiler
您还可以通过提取 Debian 文件来获取依赖项。
软件包脚本
此软件包没有软件包脚本。
在 Linux 主机上配置 NFS 根目录
要从 NFS 启动目标设备,您必须在 Linux 主机系统上提供 NFS 根挂载点。
先决条件
• 用于在主机上安装软件包的以太网连接。
• 目标设备上的以太网连接。
要在 Linux 主机上配置 NFS 根目录
1. 在您的主机机器上安装 NFS 组件
$ sudo apt-get install nfs-common nfs-kernel-server
2. NFS 服务器必须知道您要为客户端导出的目录。此信息在 /etc/exports 文件中指定。
• 修改 /etc/exports 以使其看起来像这样
$ /nfsroot *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
• 添加条目后,使用以下命令重启
$ sudo /etc/init.d/nfs-kernel-server restart
3. 在您的 Linux 主机系统上创建 /nfsroot 目录
$ sudo mkdir /nfsroot
4. 设置 /nfsroot 目录的权限,如下所示
$ sudo chmod 755 /nfsroot
$ sudo chown root.root /nfsroot
5. 将文件系统复制到 nfsroot 目录
$ cd ./rootfs
$ sudo cp –a * /nfsroot
6. 导出根点
$ sudo exportfs -a
或者,您可以使用 -a 和 -u 标志导出或取消导出所有目录。以下命令取消导出所有目录
$ sudo exportfs -au
7. 可选地,如果 Ubuntu 防火墙阻止 NFS 根访问,则必须禁用它,具体取决于您的配置,使用以下命令
$ sudo ufw disable
8. 如果执行 NFS 启动时出现问题,请通过 USB/SD/内部 eMMC 在启动的目标板上执行以下步骤,验证主机系统上的所有配置是否正确。应该可以在目标设备上挂载主机 NFS 根点
$ mkdir rootfs
$ sudo mount -v -o nfsvers=3 <IP-ADDR>:/nfsroot rootfs
其中 <IP-ADDR> 是 Linux 主机机器的 IP 地址,取自 ifconfig 命令。这证明主机配置是正确的。
注意 | 在目标系统上执行 mount 命令之前,使用以下命令安装 nfs-common 软件包 $ sudo apt-get install nfs-common |
要使用 NFS 根点启动目标,请参见
刷写和启动目标设备。请务必包含 NFS 根点的
-N 选项。
确定版本和平台信息
使用以下步骤确定
• 刷写的 BSP 版本
• 内核版本
• 其他平台信息
要确定 BSP 版本和其他平台信息
• 执行命令
head -1 /etc/nv_tegra_release
输出类似于以下内容
# R31, REVISION: 0.0, GCID: , BOARD: t186ref, EABI: aarch64, DATE: Wed Aug 1 23:57:14 UTC 2018"
要确定内核版本
• 在 kernel 目录中执行此命令
head -22 Makefile | tail -3
输出类似于以下内容
VERSION = 4
PATCHLEVEL = 9
SUBLEVEL = 140
• 如果系统正在运行,请使用以下命令确定内核版本
uname -a
输出类似于以下内容
Linux tegra-ubuntu 4.9.140-tegra #16 SMP PREEMPT Mon Jun 3 12:08:39 PDT 2019 aarch64 GNU/Linux
要确定启动配置
所有启动配置都存在于刷写配置中。例如,jetson-xavier.conf 提供以下信息
CHIPID=0x19;
EMMC_CFG=flash_t194_sdmmc.xml;
BOOTPARTSIZE=8388608;
EMMCSIZE=31276924928;
ITS_FILE=;
SYSBOOTFILE=p2972-0000/extlinux.conf;
BPFDTB_FILE=tegra194-a01-bpmp-p2888-a01.dtb;
DTB_FILE=tegra194-p2888-0001-p2822-0000.dtb;
TBCDTB_FILE=tegra194-p2888-0001-p2822-0000.dtb;
引导配置的完整定义位于 p2792-0000.conf.common 中。类似 jetson-xavier.conf 这样的文件会引用该文件,然后指定添加和更改。
默认内核构建配置如下
arch/arm64/configs/tegra_defconfig
提高系统性能
本节讨论您可以使用的自定义类型,以提高 Jetson 平台的性能。
轻量级窗口管理器替代方案
L4T 安装的窗口系统是 Gnome,它是标准的 Ubuntu 窗口管理器。在许多情况下,您可以通过将 Gnome 替换为轻量级窗口管理器来减少启动时间、响应时间、内存消耗和 CPU 利用率。NVIDIA 建议为此目的使用 LXDE 环境和 Compton 合成管理器。
有关 LXDE 安装说明和其他信息,请参阅主题
Window Systems 的
LXDE 部分。