I’m trying to boot my Jetson Nano from a USB SSD following the bootFromUSB tutorial (GitHub - jetsonhacks/bootFromUSB: Boot NVIDIA Nano Jetson Developer Kit from a mass storage USB device (Jetson Nano devices A02, B01, 2GB and possibly Jetson TX1) · GitHub). My Arducam camera (OV9281 based) works perfectly when booting from the SD card, but after switching to USB boot the camera stops working. I ran the automatic installation script from Release Automatic installation script · ArduCAM/MIPI_Camera · GitHub after booting from USB, and now the system won’t boot properly. Anyone else run into this?
Can you share what exactly happened after you ran the installation script? Did it modify any boot configuration files, and what errors are you seeing during boot?
Yeah, the script modified /boot/arducam/extlinux.conf and set root=/dev/mmcblk0p1 (the SD card partition). I edited it to use the UUID of my USB drive instead, but now I get an error saying ‘mmcblk0p1 not found’ during boot. Here’s what my /boot/arducam/extlinux.conf looks like:
TIMEOUT 30
DEFAULT primary
MENU TITLE L4T boot options
LABEL primary
MENU LABEL primary kernel
LINUX /boot/arducam/Image
INITRD /boot/initrd
APPEND ${cbootargs} quiet root=PARTUUID=fdf0044c-1acd-4d68-a46b-7d7385a4f764 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0
FDT /boot/arducam/tegra210-p3448-0000-p3449-0000-b00-arducam.dtb
Even after changing the root to the USB’s PARTUUID, something is still looking for mmcblk0p1. I found a similar issue on the NVIDIA forums (Boot from USB SSD after adding FDT /boot/arducam/tegra210-p3448-0000-p3449-0000-b00-imx477.dtb in extlinux.conf - #27 by ssvemail1987 - Jetson Nano - NVIDIA Developer Forums) where they mentioned a Loadable Kernel Module might be needed.
Thanks for the details - that extlinux.conf is really helpful. Let me clarify something important about how the Jetson Nano handles USB boot: it doesn’t actually boot directly from the USB drive. What happens is the kernel and device tree are loaded from the SD card first, and then the root filesystem is switched to the SSD after booting completes.
So when you ran the Arducam installation script on the SSD, it modified the kernel image and DTB files in /boot/arducam/ on the SSD, but the bootloader is still using the kernel from the SD card during the initial boot stage. That’s why you’re getting the mmcblk0p1 error - the kernel installed by the script was built expecting the SD card rootfs.
Also, I should note that the OV9281 single module product page says it doesn’t officially support Jetson Nano - it sounds like you might be using the camarray-arducam-1mp-monochrome-quadrascopic-camera-bundle-kit instead.
Ah, that makes sense now. So the kernel loaded at boot is still coming from the SD card, and the DTB/kernel from the SSD install aren’t actually being used during the boot process. What’s the right way to fix this then?
You’ve got it exactly right. Here’s the fix:
You have two options:
Option 1 - Install on the SD card (recommended): Boot from the SD card with the camera working, run the Arducam installation script there. This puts the custom kernel and DTB where the bootloader can actually find them during the initial boot stage. Then you can still use the USB SSD as the root filesystem - the bootloader loads the kernel/DTB from SD, then switches rootfs to the SSD.
Option 2 - Copy the files manually: If you already have everything set up on the SD card (camera working), copy the entire /boot/arducam directory and the /boot/extlinux/extlinux.conf from the SD card to the corresponding locations on the SSD. This way the bootloader on the SD card can find the Arducam kernel and DTB during boot, and then the rootfs will be on the SSD.
The key thing is that the kernel and DTB files need to be accessible to the bootloader at boot time, and on the Jetson Nano that means they need to be on the SD card or in a location the bootloader can reach before the rootfs switch happens.