Flashing AGX Orin so RootFS is on NVMe, But, All else on QSPI and eMMC

We are using r35.4.1. I would like to flash our AGX Orin SOMs such that only the root filesystem (including the boot directory’s Linux Image, initrd, and device-tree blob) is on NVMe. MB1, MB2, UEFI, and their configurations would be on QSPI and eMMC on the AGX Orin SOM. Is this configuration possible?

I presume I would need to use initrd flashing, correct?

I don’t see this configuration in the sample methods for flashing using initrd in tools/kernel_flash/README_initrd_flash.txt. Did I miss it?

Thanks very much,

Chris

*** Please note that this reply is generated by LLM automatically ***

Based on the provided context, it appears that you want to flash your Jetson AGX Orin SOMs with a custom configuration where:

  • The root filesystem, including the boot directory, Linux Image, initrd, and devicetree blob, is stored on an NVMe drive.
  • MB1, MB2, UEFI, and their configurations are stored on QSPI.
  • eMMC is also present on the AGX Orin SOM.

To achieve this configuration, you can use the l4t_initrd_flash.sh script, which is designed for initrd flashing.

The sample methods for flashing using initrd in tools/kernel_flash/README_initrd_flash.txt do not explicitly mention this specific configuration. However, you can modify the provided commands to suit your needs.

Here’s a suggested approach:

  1. Flash the QSPI with the required MB1, MB2, UEFI, and their configurations using the flash.sh script. You can use the following command as a reference:

    $ sudo ./flash.sh jetson-agx-orin-devkit qspi
    
  2. Prepare the NVMe drive by formatting it and creating the necessary partitions. You can use the flash_l4t_t234_nvme.xml file as a reference for creating the partitions.

  3. Use the l4t_initrd_flash.sh script to flash the root filesystem, including the boot directory, Linux Image, initrd, and devicetree blob, to the NVMe drive. You can use the following command as a reference:

    $ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 -u <pkc_keyfile> [-v <sbk_keyfile>] --uefi-keys uefi_keys/uefi_keys.conf -p "-c ./bootloader/generic/cfg/flash_t234_qspi.xml" -c ./tools/kernel_flash/flash_l4t_t234_nvme.xml --showlogs --network usb0 jetson-agx-orin-devkit external
    

    Make sure to replace <pkc_keyfile> and <sbk_keyfile> with the actual file paths and names.

  4. Verify that the UEFI settings are configured to boot from the NVMe drive. You can use the efibootmgr command or the UEFI GUI to modify the boot order if necessary.

By following these steps, you should be able to achieve the desired configuration for your Jetson AGX Orin SOMs.

In comparison to the provided sample methods, your configuration is unique in that it stores the root filesystem on an NVMe drive while keeping MB1, MB2, UEFI, and their configurations on QSPI. The sample methods typically store the root filesystem on eMMC or SD cards. However, the l4t_initrd_flash.sh script provides the flexibility to customize the flashing process to suit your specific needs.

*** Please give the thumbs up if you get answers you like. Or provide feedback to help us improve the answer. ***

Hi @chrisrfq ,

I hope you are doing well.

You can refer to this link for Flashing a Specific partition.

Let me know if this helps!

Best regards,
Nico
Embedded Software Engineer at ProventusNova

Hello @chrisrfq,

I believe that should be possible with a custom partition table configuration.

Here is some documentation from NVIDIA you might find useful:

Regarding your question:

I presume I would need to use initrd flashing, correct?

I believe that would be a good approach since initrd flashing method is the industry standard.

Please let me know if you have any other questions or need further support.

best regards,
Andrew
Embedded Software Engineer at ProventusNova

I was able to get it to work, it seems with the following command:

./tools/kernel_flash/l4t_initrd_flash.sh \
        -c ./tools/kernel_flash/flash_l4t_extrootfs.xml \
        --external-device nvme0n1p1 \
        --network usb0 \
        <my_custom_board_file> external

where <my_custom_board_file> was the .conf file I had been using with flash.sh; and, where flash_l4t_extrootfs.xml is just a copyt of flash_l4t_external.xml with all partitions except “master_boot_record”, “primary_gpt”, “APP”, and “secondary_gpt” removed.

The partition table of the NVMe device ends up with only the rootfs partition.

After some additional testing, the configuration file /boot/extlinux/extlinux.conf isn’t getting used. The system boots all the way, but I noticed that the device tree version is obsolete compared to the one called out in the /boot/extlinux/extlinux.conf file. The files are there after Linux finishes booting, but UEFI says:

L4TLauncher: Attempting Direct Boot
OpenAndReadUntrustedFileToBuffer: Failed to open boot\extlinux\extlinux.conf: No
t Found
ProcessExtLinuxConfig:sds Failed to Authenticate boot\extlinux\extlinux.conf (No
t Found)
L4TLauncher: Unable to process extlinux config: Not Found
L4TLauncher: Attempting Kernel Boot
EFI stub: Booting Linux Kernel...
EFI stub: Using DTB from configuration table
EFI stub: Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device path
EFI stub: Exiting boot services and installing virtual address map...

So it looks like UEFI isn’t mounting the NVMe rootfs, or can’t read it or something. I tried adding the overlay for NVMe so the flash command was

ADDITIONAL_DTB_OVERLAY_OPT="BootOrderNvme.dtbo" \
        ./tools/kernel_flash/l4t_initrd_flash.sh \
        -c ./tools/kernel_flash/flash_l4t_extrootfs.xml \
        --external-device nvme0n1p1 \
        --network usb0 \
        p0760-a101+p3701-0008 external |& tee -a $LOG_FILE

That got rid of the message that it was unable to open boot\extlinux\extlinux.conf, but the device tree file specified in /boot/extlinux/extlinux.conf still isn’t getting used. (The timestamp in /proc/device-tree/nvidia,dtbbuildtime shows “Nov 26 2025”, but I replaced the .dtb file in /boot/dtb/ with one that has “Dec 2 2025”, and that date doesn’t show up.)

Any suggestions as to how to get UEFI to use the proper device-tree .dtb file?

Thanks!

Hi @chrisrfq,

To get UEFI to use the proper device tree file, you can try changing the device tree used when flashing by modifying the machine configuration file.

In your machine conf file: p0760-a101+p3701-0008.conf you can modify the DTB_FILE entry to use the proper device tree, which should also be referenced on the flash_l4t_extrootfs.xmlfile.

After modifying the machine configuration file, try reflashing the board with your flashing command:

ADDITIONAL_DTB_OVERLAY_OPT="BootOrderNvme.dtbo" \
        ./tools/kernel_flash/l4t_initrd_flash.sh \
        -c ./tools/kernel_flash/flash_l4t_extrootfs.xml \
        --external-device nvme0n1p1 \
        --network usb0 \
        p0760-a101+p3701-0008 external |& tee -a $LOG_FILE

Let me know if this helps.

Best regards,
Nico
Embedded Software Engineer at ProventusNova

Thanks for your response, Nico.

Your suggestion looks like putting the device tree in a separate partition of the NVMe, something like kernel-dtb. I would like UEFI or whatever to read the .dtb file from the rootfs, not add another partition to the NVMe.

The desired result is to be able to replace the .dtb file in /boot/dtb (or similar) in the rootfs, not have to flash a different partition. Shouldn’t the /boot/extlinux/extlinux.conf file be read and the FDT entry used to indicate where the .dtb file should be found?

Thanks again,

Chris

So, If ADDITIONAL_DTB_OVERLAY_OPT="BootOrderNvme.dtbo" is specified to the flash command, is that supposed to direct UEFI to read the boot/initrd, boot/Image, and the FDT file, if specified, from the NVMe drive that the rootfs is on?

If not, is there a way to get it to do so?

hello chrisrfq,

please refer to readme file, $OUT/Linux_for_Tegra/tools/kernel_flash/README_initrd_flash.txt
you may see-also [Workflow 11: Generate images for internal device and external device seperately then flash]
here’re commands to create images separately,
for instance, internal=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
external=NVMe:
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --showlogs --no-flash --external-device nvme0n1p1 -c ./tools/kernel_flash/flash_l4t_t234_nvme.xml --external-only --append --network usb0 jetson-orin-nano-devkit external
you may put the device into recovery mode, then flash both images with flash-only options.
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --flash-only