Alternative to USB Mass Storage Gadget for NVMe on Jetson Orin Nano (No Ubuntu/Docker Host Required)

Hello Jetson Orin Nano community,

I’m looking for a way to expose my Jetson Orin Nano’s NVMe drive as a USB mass storage device to a host computer, specifically to burn a disk image for recovery purposes.

I know i can use recovery mode and the SDK Manager, but I want to avoid needing a specific host OS like Ubuntu 22.04 or Docker on the host side.
Background:
• Jetson Orin Nano with NVMe SSD installed.
• Goal: Connect via USB-C to any generic host PC (Windows/Mac/Linux) and have the NVMe appear as a USB drive for dd-like imaging or file copy recovery.
• No host-side flashing tools (e.g., no NVIDIA SDK Manager, no Ubuntu VM, no Docker).

What I’ve tried/researched:
• Standard configfs USB gadget (mass_storage) works for emulated block devices or loop files, but not raw NVMe (/dev/nvme0n1).
• Force Recovery Mode exposes storage differently but requires host flashing tools I want to avoid.
• Boot-from-USB scripts exist but focus on Jetson Nano, not Orin, and still tie to SDK workflows.

Is there a kernel module, script, or custom DTB overlay to bind NVMe as a USB block backend? Any experiences with UASP or similar for raw passthrough?

Appreciate any pointers, guides, or pitfalls—thanks!

Hardware details: Jetson Orin Nano 8GB dev kit, JetPack 6.x, NVMe PCIe Gen3 SSD.

Kind regards
Ben J

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

I understand your requirement to expose the Jetson Orin Nano’s NVMe drive as a USB mass storage device to a host computer for recovery purposes. You want to achieve this without relying on specific host OS like Ubuntu 2204 or Docker on the host side.

Unfortunately, the standard configfs USB gadget mass storage approach works only for emulated block devices or loop files, not for raw NVMe devices like /dev/nvme0n1. Force Recovery Mode exposes storage differently, but it requires host flashing tools, which you want to avoid.

After researching and analyzing the provided context, I couldn’t find a straightforward solution that meets your requirements. However, I can offer some insights and potential directions to explore:

  1. USB gadget mass storage: As you’ve already tried, this approach doesn’t work for raw NVMe devices. You might need to explore other USB gadget configurations or custom implementations.
  2. NVMe over USB: There are some projects and kernel modules that enable NVMe over USB, such as nvme-usb and usb-nvme. However, these might require custom kernel builds, and it’s unclear if they would work with the Jetson Orin Nano’s NVMe drive.
  3. UASP (USB Attached SCSI) passthrough: UASP is a protocol that allows for raw SCSI commands to be passed through a USB connection. This might be a viable option, but it would likely require custom kernel modules and configuration.
  4. Custom DTB overlay: Creating a custom DTB (Device Tree Blob) overlay might allow you to bind the NVMe drive to a USB block backend. However, this would require in-depth knowledge of the Jetson Orin Nano’s hardware and Device Tree configuration.
  5. Kernel module development: Developing a custom kernel module to expose the NVMe drive as a USB mass storage device might be the most promising approach. This would require significant development effort and expertise in kernel programming.

Before pursuing any of these directions, I recommend exploring the following:

  • Jetson Orin Nano documentation: Check the official NVIDIA documentation for any mentions of USB gadget configurations or NVMe over USB support.
  • Kernel source code: Study the kernel source code for the Jetson Orin Nano to understand how the NVMe drive is currently exposed and if there are any existing configurations or modules that could be leveraged.
  • Community forums and discussions: Search online forums and discussions related to the Jetson Orin Nano and NVMe over USB to see if others have attempted similar projects.

In summary, while there isn’t a straightforward solution available, exploring custom kernel modules, UASP passthrough, or custom DTB overlays might lead to a viable solution. However, these approaches will likely require significant development effort and expertise.

If you’re willing to share more details about your project, I can try to provide more specific guidance or recommendations.

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

Hi,

Please refer to Flashing Support — NVIDIA Jetson Linux Developer Guide and the Workflow 3: To massflash the backup image in README_backup_restore.txt.

Thanks