Skip to main content

适用于Jetson的内存扩展器

Jetson的reComputer售卖时附带16GB的eMMC存储空间,预装有Ubuntu 18.04 LTS和NVIDIA JetPack 4.6,因此剩余的可用用户空间大约只有2GB,这对于一些项目的培训和部署来说是一个重大障碍。本教程将介绍基于这一情况下,对不同型号reComputer进行扩展的过程,并帮助开发者通过将系统转移到外部存储设备上来扩展他们的系统。

扩容基础知识

系统安装的磁盘上的第一个扇区称为主引导记录(MBR),其中包含有关引导加载程序(BootLoader)、分区表和固定标识符55AA的信息。Linux的启动过程中,引导加载程序内核经历了两个重要阶段。

第一阶段: 引导加载程序初始化一个临时的根文件系统 (ramfs)。Ramfs 包含在启动时必要的驱动程序、文件系统(fs)、网络(net)等配置程序。之后,引导加载程序的控制权转移到内核,以便内核可以提取这些程序,将它们移至内存 (RAM) 并运行它们以加载各种功能模块。

第二阶段: 在内核加载了与ramfs一起的必要模块后,它释放系统并配置真正的根文件系统(rootfs)以挂载到真正的根目录。

  1. 在上述两个阶段中,我们不需要修改加载带有ramfs的功能模块的内核部分(第1阶段),因此即使重新计算机已扩展,它仍然需要使用eMMC。
  2. 我们需要修改的是第二阶段,它将根文件系统挂载到外部内存,从而实现扩展。

容量扩展说明

  1. 通过外部存储扩展的主要原则是将rootfs设置在外部存储设备上。

  2. 这种扩展方法会修改Linux内核级别的系统文件,可能会遇到一些难以解决的问题。在按照本教程完成扩展时,您应该使用一台新的reComputer和一个新的存储设备,并不要尝试在设备上存储重要文件。如果一切不如预期般顺利,您可能需要重新格式化存储设备甚至reComputer,在最终保留选项上,如果可能的话,我们将提供通过串口帮助您恢复备份,但是您需自行承担任何数据损失。

  3. 这种扩展过程不需要重新编译内核,与在线其他早期的扩展方法相比,安装时间可以节省约40分钟。

通过载板上的M.2插槽和固态硬盘进行扩展

固态硬盘,也被称为固态驱动器,通常被用作笔记本电脑、台式电脑等的主要存储设备。由于其高可靠性和快速的数据读写速率,它是扩展reComputer的最佳选择。下表列出了目前可用于固态硬盘扩展解决方案的reComputer系列产品。reComputer J1010不支持固态硬盘扩展的主要原因是载板未配备适用的M.2插槽。

产品reComputer J1020reComputer J2011reComputer J2012reComputer J2021
SKU110061361110061363110061401110061381
产品图
配备的模块Jetson Nano 4GJetson Xavier NX 8GBJetson Xavier NX 16GBJetson Xavier NX 8GB
操作载体板Jetson A206Jetson A206Jetson A206J202

软件和硬件要求

为了证明使用SSD进行扩展解决方案的成功,需要满足以下条件,这些是扩展成功的基本要求。

software and hardware requirements
reComputer for JetsonJetPack versions 4.4 ~ 4.6
Carrier board must contain M.2 M-Key slot
SSDSSD need to be fourth generation extended file system (Ext4)
M.2 M-Key interface with NVMe protocol
Recommended capacity ≤ 512 GB

注意!!! 更新后的JetPack版本尚未经过扩展测试,因此无法保证扩展的稳定性或成功性,请仔细遵循本教程。

SSD需要是M.2 M-Key,否则将无法匹配载板上的接口。

具有非扩展第四代文件系统(Ext4)的存储设备无法完成扩展操作。

步骤

步骤 1. 安装SSD

Follow the steps in the Hardware Instructions to install the SSD for reComputer.

步骤 2. 准备固态硬盘

使用快捷键Ctrl+F或点击左上角的Ubuntu图标搜索磁盘,并打开随Ubuntu 18.04提供的磁盘工具。

在左侧选择您的固态硬盘,然后在菜单栏下方的右上角选择格式化磁盘

将您的SSD格式化为GPT格式。将出现一个弹出窗口询问您进行确认并输入您的用户密码。

然后,我们点击中间的+添加一个磁盘字符。

点击“下一页”。

请给你的SSD取一个名称,然后在类型中选择Ext4,点击“创建”。这样,我们已经按照扩展需求完成了SSD的准备工作。

步骤 3. 构建将根目录定位到SSD

使用git命令下载我们需要使用重新计算机脚本文件。.

$ git clone https://github.com/limengdu/rootOnNVMe.git
$ cd rootOnNVMe/

然后执行以下命令,将来自eMMC的根目录中的文件构建到SSD中,此步骤的等待时间取决于您使用的根目录的大小。

$ ./copy-rootfs-ssd.sh

步骤 4.配置环境并完成扩展

执行以下命令以完成rootfs的配置。

$ ./setup-service.sh

重新启动计算机时,您会发现eMMC已变成主界面上的外部存储设备,并且您会看到系统占用空间已减少,因此扩展成功。

!!!注意 脚本文件中默认的SSD路径为/dev/nvme0n1p1,这也是reComputer默认分配的路径。如果发现您的SSD路径与命令sudo fdisk -l不匹配,请将rootOnNVMe中的文件copy-rootfs-ssd.shdata/setssdroot.servicedata/setssdroot.sh中所有的/dev/nvme0n1p1路径更改为您SSD所在的路径。

以上的扩展不会删除eMMC中原始根目录的内容。如果您不想从SSD启动,可以移除SSD,系统仍然会从eMMC启动。

通过USB存储设备进行容量扩展。

USB存储设备,如USB闪存驱动器和移动硬盘,在生活的各个领域广泛用作外部存储,USB扩展也适用于reComputer。以下表格列出了目前可用于USB扩展解决方案的reComputer产品。

产品reComputer J1010
SKU110061362
产品图
模组Jetson Nano 4G
载板J1010 carrier board

通过 USB 存储设备进行扩展的最大优势是 USB 设备的高度便利性和简单的拔插操作。然而,即使使用高速的 USB 3.2 接口,数据传输速率远低于标准 PCIe 总线的速度,因此 SSD 扩展方法在稳定性、可靠性和数据传输速度方面更为优越。

软件和硬件要求

使用USB进行扩展方案的成功实施,需要满足以下条件,这是验证扩展是否可以成功完成的基本要求。

软件和硬件要求
reComputer for JetsonJetPack versions 4.4 ~ 4.6
装备模块需要Jetson Nano
USB 存储设备USB存储设备需要为第四代的扩展文件系统(Ext4)。
USB存储设备电源供应电流 ≤ 0.5 A

!!!注意。 更新后的JetPack版本还未经过扩展测试,因此无法保证扩展的稳定性或成功性,请仔细按照这个教程操作。

大容量USB存储设备需要保证reComputer的正常供电以确保正常运行,不建议使用容量超过512GB的USB存储设备。电源供应不足会导致reComputer关机。

除了Jetson Nano外装备的模块目前不支持使用此方法进行扩展。

非扩展第四代文件系统(Ext4)的存储设备无法完成扩展操作。

扩展步骤

步骤 1. 准备必要的文件。

使用git命令下载我们需要用来重新计算机的脚本文件。

$ git clone https://github.com/limengdu/bootFromUSB.git
$ cd bootFromUSB

步骤 2. 准备USB存储设备

将USB存储设备连接到reComputer,并通过快捷键Ctrl+F或单击左上角的Ubuntu图标并搜索 Disks来打开随Ubuntu 18.04提供的Disks工具。

在左侧选择您的USB存储设备,然后在菜单栏下方的右上角选择格式化磁盘

将您的USB存储设备格式化为GPT格式。将会出现一个弹窗,要求您确认并输入您的用户密码。

然后,我们点击中间的+来添加一个磁盘字符。

点击“下一步”。

请为您的USB存储设备命名,选择Ext4类型,然后点击“创建”。这样,根据扩展要求,我们已经完成了USB存储设备的准备工作。

步骤 3. 安装 USB 存储设备

根据步骤2准备的USB存储设备可以在磁盘软件中看到,状态是未挂载的。

!!!Note 如果您发现您的USB设备在格式化后被自动挂载,请跳过此步骤。

我们使用以下命令来挂载USB设备。

$ mkdir /media/USB/
$ sudo mount <USB Device Path> /media/USB/

<USB设备路径>是指USB存储设备的路径,此参数可以在磁盘软件的设备中查看,也可以用命令sudo fdisk -l进行查询。例如,对于我的USB设备,我可以使用以下命令将/dev/sda1挂载到/media/USB/

$ sudo mount /dev/sda1 /media/USB/

请使用以下命令检查设备的挂载位置。

$ sudo findmnt -rno TARGET <USB Device Path>

对于我的USB设备,我需要使用的命令是:

$ sudo findmnt -rno TARGET /dev/sda1

步骤 4.将系统复制到USB存储设备中。

copyRootToUSB.sh脚本将整个eMMC系统的内容复制到USB存储设备中。当然,USB存储设备应该比eMMC拥有更多的存储空间。

所使用的命令如下。

usage: ./copyRootToUSB.sh [OPTIONS]
-d | --directory Directory path to parent of kernel

-v | --volume_label Label of Volume to lookup

-p | --path Device Path to USB drive (e.g. /dev/sda1)

-h | --help This message

通常,对于常规的扩展需求,我们可以在参数[选项]中简单选择-p,然后我们需要添加USB设备的路径(例如/dev/sda1),这是我们在步骤3中得到的。例如,对于我的USB设备,我需要使用的完整命令是:

$ ./copyRootToUSB.sh -p /dev/sda1

执行此命令所需的时间取决于您的eMMC存储的文件大小。

步骤 5.查询USB设备的UUID。

为了确保准确性,我们需要查找USB设备的UUID。

$ ./partUUID.sh 

此命令的默认路径为sda1 (/dev/sda1),但您也可以确定其他USB设备的UUID。请使用-d标志指定/dev/。例如,对于我的USB设备,路径将是:

$ ./partUUID.sh -d sdb1

UUID of Disk: /dev/sdb1
e34d67bb-83bb-4fc5-b9a4-a1388d2b2be5
Sample for /boot/extlinux/extlinux.conf entry:
APPEND ${cbootargs} root=UUID=e34d67bb-83bb-4fc5-b9a4-a1388d2b2be5 rootwait rootfstype=ext4

!!!注意 如果返回的UUID在格式和长度上与上面的示例不同,则设备可能未格式化为Ext4,请重新从步骤2开始!

步骤 6. 修改引导配置以完成扩展

我们需要首先备份引导配置文件。

$ sudo cp /boot/extlinux/extlinux.conf /boot/extlinux/extlinux.conf.bak

这一步骤是USB设备扩展操作中最重要且最危险的步骤。编辑 /boot/extlinux/extlinux.conf 文件和 /media/nvidia/boot/extlinux/extlinux.conf,然后添加一个条目指向新的rootfs,位置为USB设备的路径,请填写在下面的参数<path>中。路径信息可以在步骤3中获取。

$ sudo vi /boot/extlinux/extlinux.conf
$ sudo vi /media/nvidia/boot/extlinux/extlinux.conf

LABEL primary
MENU LABEL primary kernel
LINUX /boot/Image
INITRD /boot/initrd
APPEND ${cbootargs} quiet root=<path> rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 sdhci_tegra.en_boot_part_access=1

我正在使用的USB存储设备,修改后的/boot/extlinux/extlinux.conf文件和/media/nvidia/boot/extlinux/extlinux.conf文件内容如下:

TIMEOUT 30
DEFAULT primary

MENU TITLE L4T boot options

LABEL primary
MENU LABEL primary kernel
LINUX /boot/Image
INITRD /boot/initrd
APPEND ${cbootargs} quiet root=/dev/sda1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 sdhci_tegra.en_boot_part_access=1
# APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 sdhci_tegra.en_boot_part_access=1

# When testing a custom kernel, it is recommended that you create a backup of
# the original kernel and add a new entry to this file so that the device can
# fallback to the original kernel. To do this:
#
# 1, Make a backup of the original kernel
# sudo cp /boot/Image /boot/Image.backup
#
# 2, Copy your custom kernel into /boot/Image
#
# 3, Uncomment below menu setting lines for the original kernel
#
# 4, Reboot

# LABEL backup
# MENU LABEL backup kernel
# LINUX /boot/Image.backup
# INITRD /boot/initrd
# APPEND ${cbootargs}

保存文件并重新启动计算机,系统根目录将切换到 USB 存储设备,扩容完成。

通过串行控制台恢复系统备份

当您的系统由于错误或其他原因而无法正常引导时(一个常见情况是在引导时Nvidia图标不断出现),那么您在扩容期间制作的备份将发挥重要作用。我们理解您此刻的焦虑,但请耐心跟随以下步骤将ReComputer重新调入串行控制台,我们将操作U-boot来恢复您的备份。

材料准备

材料准备描述
Ubuntu主机x1.
无系统的 reComputer Jetson x1
UART转USB模块x1
母对母杜邦线 x3

访问串行控制台的步骤。

第一步。 将UART转USB模块连接到reComputer。

将reComputer连接到UART至USB模块,按照下表中的布线说明进行连接。

reComputer UART to USB module
GND-->GND
UART TXD-->RX
UART RXD-->TX

!!!Tip reComputer与UART至USB模块之间的VCC接口无需连接。

连接电缆后,暂时无需打开reComputer电源,请将其放在一旁。

请断开扩展的外部存储器。

第2步。 在Ubuntu主机上安装并启动minicom

如果您的Ubuntu主机没有安装minicom,则可以使用以下命令在计算机上安装minicom。

$ sudo apt-get install minicom

安装完成后,请输入命令启动minicom。

$ sudo minicom

步骤 3. 准备配置minicom

在minicom菜单栏中,我们打开串口并配置它,以便通过minicom获取reComputer启动信息。在菜单栏中,按键盘o键以访问配置屏幕。使用键盘上下箭头键控制光标移动到串口设置

步骤4。 将reComputer连接到Ubuntu主机

此刻,我们创建一个新的命令行窗口,并在窗口中输入命令来监视新设备的访问。

$ dmesg --follow

在这一点上,我们将启动reComputer,并将UART连接到USB模块,reComputer通过USB端口连接到Ubuntu主机。命令行窗口将显示新连接设备的名称,我们需要找到以tty开头的片段并记下来。

步骤5。 U-boot操作

回到minicom,将在步骤4中获得的设备名称填入串行设备中。同时,请检查波特率是否配置为115200

在修改后,按回车键保存。选择另存为dfl配置并退出minicom界面。

重新输入命令sudo minicom,输入minicom后,我们将在窗口中看到计算机的启动信息。

我们可以通过使用返回的信息和使用帮助命令来查看U-boot系统下所有可用命令,来排查reComputer无法启动的原因。了解如何使用这些命令是解决问题所必需的,当然这可能会很困难。

Tegra210 (P3450-0000) # help
? - alias for 'help'
base - print or set address offset
bdinfo - print Board Info structure
blkcache - block cache diagnostics and control
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootefi - Boots an EFI payload from memory
bootelf - Boot from an ELF image in memory
booti - boot Linux kernel 'Image' format from memory
bootm - boot application image from memory
bootp - boot image via network using BOOTP/TFTP protocol
bootvx - Boot vxWorks from an ELF image
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
dcache - enable or disable data cache
dfu - Device Firmware Upgrade
dhcp - boot image via network using DHCP/TFTP protocol
dm - Driver model low level access
echo - echo args to console
editenv - edit environment variable
enterrcm - reset Tegra and enter USB Recovery Mode
env - environment handling commands
exit - exit script
ext2load - load binary file from a Ext2 filesystem
ext2ls - list files in a directory (default /)
ext4load - load binary file from a Ext4 filesystem
ext4ls - list files in a directory (default /)
ext4size - determine a file's size
ext4write - create a file in the root directory
false - do nothing, unsuccessfully
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
fatmkdir - create a directory
fatrm - delete a file
fatsize - determine a file's size
fatwrite - write file into a dos filesystem
fdt - flattened device tree utility commands
fstype - Look up a filesystem type
go - start application at address 'addr'
gpio - query and control gpio pins
gzwrite - unzip and write memory to block device
help - print command description/usage
i2c - I2C sub-system
icache - enable or disable instruction cache
imxtract - extract a part of a multi-image
itest - return true/false on integer compare
ln - Create a symbolic link
load - load binary file from a filesystem
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loadx - load binary file over serial line (xmodem mode)
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
ls - list files in a directory (default /)
lzmadec - lzma uncompress a memory region
md - memory display
mii - MII utility commands
mm - memory modify (auto-incrementing address)
mmc - MMC sub system
mmcinfo - display MMC info
mw - memory write (fill)
nm - memory modify (constant address)
nvme - NVM Express sub-system
part - disk partition related commands
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv - print environment variables
pxe - commands to get and boot from pxe files
reset - Perform RESET of the CPU
run - run commands in an environment variable
save - save file to a filesystem
saveenv - save environment variables to persistent storage
setenv - set environment variables
sf - SPI flash sub-system
showvar - print local hushshell variables
size - determine a file's size
sleep - delay execution for some time
source - run script from memory
sspi - SPI utility command
sysboot - command to get and boot from syslinux files
test - minimal test like /bin/sh
tftpboot - boot image via network using TFTP protocol
true - do nothing, successfully
ums - Use the UMS [USB Mass Storage]
unzip - unzip a memory region
usb - USB sub-system
usbboot - boot from USB device
version - print monitor, compiler and linker version

技术支持与产品讨论

感谢您选择我们的产品!我们在这里提供不同的支持,以确保您与我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同偏好和需求。

Loading Comments...