With the advent of JetPack 4.6 (L4T 32.6.1) it is now possible to boot the Jetson AGX Xavier and Jetson Xavier NX from external storage. Looky here:
Background
In the JetPack 4.6 release Cboot now has NVMe driver support for the Jetson Xavier NX and Jetson AGX Xavier series. This enablesnables loading kernel, kernel-dtb and initrd from the root file system on NVMe.
There is also a new flashing tool which can flash internal or external media connected to the Jetson Xaviers. The new tool uses initial RAM disk for flashing and is up to 1.5x faster when flashing compared to the previous method!
If you have read the highlights from the press release, you already know all of that. Let’s talk about the new flashing tool in a little more detail.
For reference, the JetsonHacks scripts are in the JetsonHacks repository on Github: bootFromExternalStorage
You’ll need a NVMe drive in your Jetson to follow this tutorial. These drives are available in different sizes of course, but 500GB seems like a good price/capacity. Here’s some suggestions (Amazon affiliate links):
This process does not require that the NVIDIA SDK Manager GUI application be present. These are all command line scripts that can be run in a Terminal. For many people, this better fits their workflow.
Flashing with initrd
The new flashing method uses initrd (initial RAM Disk) to flash both internal media and external media connected to a Jetson device. This method uses initrd and USB device mode. Initrd flash supports several workflows such as:
- Flashing internal storage devices
- Flashing external storage devices such as NVMe SSD and USB drives
- Enabling A/B rootfs on external storage devices
- Enabling disk encryptions on external storage devices
- Flashing individual partitions
- Flashing fused Jetson devices
- Flashing a Massflash blob to normal and fused Jetson devices
- Generating separate images for external and internal storage devices, then flashing the combined images
Note: Jetson AGX Xavier series devices use boot firmware that is stored only on internal eMMC memory. Consequently this type of device cannot boot from USB or NVMe SSD until its internal eMMC has been flashed.
As usual, tools this flexible have a little bit of a learning curve. There are a group of scripts in the Linux_for_Tegra/tools/kernel_flash directory which handle the above mentioned tasks. It is worth reading the README_initrd_flash.txt file to get a feel for what it takes accomplish the task you are trying to accomplish.
nvsdkmanager_flash.sh
There is a higher level script which can be useful if you are less concerned with fine control of all of the different parameters. For the simple case of flashing to a Jetson Xavier with an attached NVMe SSD, you prepare the Jetson disk image and:
$ ./sdkmanager_flash.sh –storage nvme0n1p1
For a Jetson Xavier NX, this will flash the internal QSPI-NOR memory and put the rootfs and other partitions on the NVMe SSD. The Jetson AGX Xavier does not have QSPI memory, so the equivalent on eMMC is flashed instead.
The Jetson Xavier will then boot from the SSD. For the Jetson Xavier NX, no SD card need be present.
Preparing the Host
You will need to install dependencies on the x86 host to support flashing the Jetson. NVIDIA officially supports Ubuntu 16.04 and 18.04 for the flashing scripts. Then you will minimally need three archives:
- Jetson Xavier Board Support Package (BSP)
- Sample Root File System (rootfs)
- Secure Boot
Here are Direct downloadable links to JetPack 4.6 and L4T debian packages for Jetson
There are helper scripts in the JetsonHacks bootFromExternalStorage repository. The time for the entire process of downloading and flashing the Jetson will depend on the speed of your Internet connection and host computer. Here it was ~ 1 hour. To download the helper scripts and run them:
$ git clone https://github.com/jetsonhacks/bootFromExternalStorage.git
$ cd bootFromExternalStorage
$ ./install_dependencies.sh
$ ./get_jetson_files.sh
There are a couple of tricks here and there in the scripts to put everything in the right place.
Flashing the Jetson
Once the archives are expanded and put in the correct place, put the Jetson into Force Recovery mode. This is different on each Xavier. The video shows a Xaiver NX. You can use the command lsusb to determine if the host can ‘see’ the Xavier. There should be an entry with the NVidia Corp tag when the Xavier is connected to the host in Force Recovery mode. Default is to flash to the NVMe SSD. You will find this works best if you actually have a NVMe SSD installed (64GB minimum; more is better) before attempting to flash.
You can use the convenience script in the repository to flash the Jetson:
$ flash_jetson_external_storage.sh
It takes ~ 20 minutes to install everything in this manner. After flashing, the Jetson will be in ‘oem-config’ mode, ready to be setup.
Setting up the Jetson
You can choose to setup the Jetson in headless mode or desktop mode. In the video, we chose desktop mode. In either case, the next step is to install the NVIDIA JetPack packages on the Jetson. Switch from the host to the Jetson. Finish the Jetson configuration, then:
$ git clone https://github.com/jetsonhacks/bootFromExternalStorage.git
$ cd bootFromExternalStorage
./install_jetson_default_packages.sh
The default packages are from the meta-package nvidia-jetpack and includes all of our Jetson friends like:
- CUDA
- cuDNN
- TensorRT
- VisionWorks
- VPI
- OpenCV
plus a couple of other of packages to replicate the same experience as the default Xavier NX SD card.
Conclusion
With the convenience scripts, setting up your Jetson Xavier to boot from external storage should be straightforward. This is the NVIDIA ‘approved’ way, so Over The Air (OTA) updates should work going forward too.
Note that NVIDIA is working on the SDK Manager GUI application to replicate this type of functionality. That’s certainly worth checking out!
Notes
- JetPack 4.6, L4T 32.6.1
- Tested on Jetson Xavier NX, NVMe SSD
- Host: Ubuntu 16.04 (should work with Ubuntu 18.04 also)
- Experimental Ubuntu 20.04 support added
The post Native Boot for Jetson Xaviers appeared first on JetsonHacks.