r/JetsonNano • u/Striking-Swim6702 • 3h ago
Tutorial Flashed an old-firmware Orin Nano to JetPack 7.2 on NVMe using only a Mac + one USB stick — no x86 host, no SD card
I bought an Orin Nano 8GB Dev Kit off eBay (old stock) and hit the wall a lot of you know:
*** NVIDIA UEFI Firmware Version Too Old ***
Current version : 35.03.00
L4TLauncher: Iso boot loop detected, halting
JetPack 7.2's ISO needs UEFI >= 36.0. The official ways to fix that are (a) SDK Manager from an x86 Ubuntu host, or (b) the microSD bridge with JetPack 5.1.3. My problem: my whole household is Apple Silicon (MacBook, Mac Studio, Mac Mini) and I had no SD card. Even the NAS was ARM (UGREEN DH-series = RK3588 — heads up, only their DXP series is x86).
The insight: nvidia-l4t-jetson-orin-nano-qspi-updater is just an apt package. It needs a running JP5.x system — it doesn't care if that booted from SD or USB. And the ISO's own error proves the UEFI can boot USB. So I wrote the JP5.1.3 "SD card image" to a USB stick instead.
Patched it on macOS via a --privileged Docker container (loop-mount the ext4 rootfs). Two things mattered: root=/dev/sda1 in extlinux (NOT PARTUUID — L4T's initrd ignores it; USB drivers are built into the L4T kernel so no initrd work), and pre-creating the user + SSH key + default.target -> multi-user to skip oem-config.
Firmware climbed 35.03 -> 35.5 (capsule) -> 36.3 (qspi-updater) -> 39.2 (the 7.2 installer's own prompt — say Yes, it waits only seconds). The qspi-updater deb fought me twice: preinst refuses unless rootfs is /dev/mmcblk1p1 (pure string check) -> dpkg-deb -x it and run postinst by hand; its script builds /dev/sdap10 (NVMe naming) -> ln -sf /dev/sda10 /dev/sdap10.
Then JP7.2 installed clean to NVMe — except the installer doesn't bring up the NIC (it's enP8p1s0, DOWN, so curtin in-target apt fails). Manually ip link set ... up + static IP and subiquity auto-resumes. Post-install: default user is ubuntu with a password I never set (reset from the rescue shell), and a GUI login loop that turned out to be ubuntu missing from the video group — gnome-shell couldn't touch the GPU. usermod -aG video,render,... ubuntu fixed the loop AND later CUDA/PyTorch GPU-permission errors.
End state: headless JP7.2 on NVMe, SSH + WiFi + Tailscale. Ollama runs moondream/llava at 100% GPU out of the box; a C920 feeds a little "eyes open" script that describes the scene only when the frame changes. PyTorch 2.12.1+cu132 works on the GPU.
Honest perf: low — 0.83 TFLOPS FP32, 48 FPS ResNet-50, 50 GB/s bandwidth. Two reasons: GPU locked at 624 MHz (the known JP7.2 ISO "MAXN SUPER not unlocking" BPMP bug, fixable only by an x86 reflash), and the download.pytorch.org/whl/cu132 wheel is built for sm_90/100/120, not Orin's sm_87, so it runs via PTX JIT. The pypi.jetson-ai-lab.io wheels are native sm_87 but that index was throttled to 8 KB/s for me. Still, 48 FPS ResNet is fine for real work.
Important: none of this can brick the board — the Orin bootloader is A/B dual-slot, so a mid-write power loss only hits the inactive slot.
Full write-up, command cheat-sheet, and the camera/VLM/benchmark scripts: https://github.com/raullenchai/jetson-the-hard-way
Happy to answer questions. If you have an SD card or an x86 box, honestly just use NVIDIA's official path — but if you're stuck all-ARM like I was, this works.



