Jetson xavier nx 是一款性价比不错的边缘计算模块。处于安全考虑,需要对全盘进行加密。官方文档描述的比较晦涩,实操性不强。花了两天时间终于搞定了全盘加密,在这里分享操作步骤,免得走弯路。
一 前期准备
主机系统需要 ubuntu 20.4 系统,我是用 VMware 建立了一个虚拟机安装的 ubuntu。
这个模块本身带有 16G 的 eMMC 存储,这个空间只够安装基本的系统,JetPack 都装不下。我安装了一个 256G 的 NVMe SSD 作为主存储使用。安装前,要查询一下磁盘的参数,记录下来备用。
sudo fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 238.49 GiB, 256060514304 bytes, 500118192 sectors
Disk model: aigo NVMe SSD DP35 256GB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes二
复制代码
二 下载开发套件系统
Xavier nx 支持的最新 Jetson Linux 版本为 35.5,去官网下载开发套件,并配置烧录环境。
(https://developer.nvidia.com/embedded/jetson-linux-r3550)
wget https://developer.nvidia.com/downloads/embedded/l4t/r35_release_v5.0/release/jetson_linux_r35.5.0_aarch64.tbz2
wget https://developer.nvidia.com/downloads/embedded/l4t/r35_release_v5.0/release/tegra_linux_sample-root-filesystem_r35.5.0_aarch64.tbz2
export L4T_RELEASE_PACKAGE="Jetson_Linux_R35.5.0_aarch64.tbz2"
export SAMPLE_FS_PACKAGE="Tegra_Linux_Sample-Root-Filesystem_R35.5.0_aarch64.tbz2"
export BOARD="jetson-xavier-nx-devkit-emmc"
tar xf ${L4T_RELEASE_PACKAGE}
sudo tar xpf ${SAMPLE_FS_PACKAGE} -C Linux_for_Tegra/rootfs/
cd Linux_for_Tegra/
sudo ./apply_binaries.sh
sudo ./tools/l4t_flash_prerequisites.sh
复制代码
三 配置磁盘参数
编辑配置文件(./tools/kernel_flash/flash_l4t_nvme_rootfs_enc.xml),设置硬盘参数。
第一个需要设置的参数是硬盘的扇区数,使用我们前面查到的参数。
?xml version="1.0"?>
<!-- Nvidia Tegra Partition Layout Version 1.0.0 -->
<partition_layout version="01.00.0000">
<device type="external" instance="0" sector_size="512" num_sectors="500118192">
复制代码
第二个需要设置的参数是加密磁盘的大小,这里使用的 256G 磁盘,实际加密分区的大小为 237G。
237 x 1024 x 1024 x 1024 = 254476812288 ,得到的这个数字就是我们要添加到配置文件中的数据。找到 APP_ENC 分区的设置,将前面的数据填入 <size> 条目中。
<partition name="APP_ENC" id="2" type="data" encrypted="true" reencrypt="false">
<allocation_policy> sequential </allocation_policy>
<filesystem_type> basic </filesystem_type>
<size> 254476812288 </size>
<file_system_attribute> 0 </file_system_attribute>
<allocation_attribute> 8 </allocation_attribute>
<percent_reserved> 0 </percent_reserved>
<align_boundary> 4096 </align_boundary>
<unique_guid> APP_ENC_UUID </unique_guid>
<filename> system_root_encrypted.img_ext </filename>
<description> **Required.** Contains the encrypted root partition("/"). </description>
</partition>
复制代码
注:加密分区大小是需要根据磁盘大小,及其他分区大小计算得出。我采用的是比较笨,也比较可靠的办法。第一次烧录的时候,未指定分区大小,系统自动分配 16G 空间,然后我根据磁盘未分配空间,得出可分配 237G 空间给加密分区。
四 烧录系统
准备工作做好后,烧录就比较简单了,只是等待时间比较长。
echo "00000000000000000000000000000000" > disk_enc.key #换成自己的16进制key
sudo ROOTFS_ENC=1 ./flash.sh -i ./disk_enc.key $BOARD mmcblk0p1
sudo ROOTFS_ENC=1 ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 -c ./tools/kernel_flash/flash_l4t_nvme_rootfs_enc.xml -S 237GiB --external-only $BOARD external
复制代码
说明:
第一条命令将加密密钥写入文件,供烧录程序调用,我使用的密钥是使用随机字符串程序生成的。
第二条命令先将加密系统写入内部 eMMC 存储。
第三条命令再将加密系统写入外部存储。
因为 Xavier nx 的启动机制,必须同时烧录内外存储为加密存储。在烧录后,会出现无法启动的现象。我推断是因为磁盘分区的改变,内外存储的配置不匹配照成的。这时候再按照相同配置烧录一遍就可以了。
评论