My Spark went unbootable after a routine “Update Now” through the DGX Dashboard. Symptoms and fix below.
Symptoms
-
Initiated update through DGX Dashboard
-
System rebooted automatically when the update “finished”
-
Boot landed at:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) -
No GRUB menu appeared at any point — system goes straight from POST to the panic
-
LAN ping and Tailscale both unreachable; the box was fully off the network
-
Hardware was fine — POSTed normally, UEFI worked, NVMe detected in boot order
What actually broke
The kernel update from 6.17.0-1008-nvidia to 6.17.0-1014-nvidia got far enough to install the kernel image but the post-install script bailed out before generating the initramfs. The kernel package reported a CRITICAL error, but the dashboard triggered the reboot anyway. The result on disk:
/boot/vmlinuz-6.17.0-1014-nvidia ✅
/boot/config-6.17.0-1014-nvidia ✅
/boot/System.map-6.17.0-1014-nvidia ✅
/boot/initrd.img-6.17.0-1014-nvidia ❌ missing
GRUB’s symlink pointed at the missing initrd, kernel had no way to find root, panic.
The dpkg state of the kernel package was iF (installed but failed to configure), and the failure was DKMS exiting non-zero because the NVIDIA modules were already present at the target version and DKMS refused to rebuild without --force.
Why you can’t recover this remotely
/etc/default/grub ships with GRUB_TIMEOUT=0 on systems set up in headless / network-appliance mode. With zero timeout there’s no menu, no opportunity to fall back to an older kernel from the boot loader. Holding Shift or Esc doesn’t help — there’s no menu to interrupt. GRUB_RECORDFAIL_TIMEOUT did not engage for me after multiple failed boots either.
Result: even though older working kernels are sitting right there in /boot, you can’t reach them without physical access.
Recovery (what worked for me)
You’ll need:
-
An ARM64 Linux live USB. The Spark is
aarch64; standard amd64 ISOs will not boot. I used Ubuntu Server 26.04 LTS arm64 (ubuntu-26.04-live-server-arm64.iso). -
A USB-C flash drive, or a USB-A stick plus a USB-C adapter — the Spark has no USB-A ports.
-
A keyboard and monitor.
Boot from the USB:
UEFI won’t enumerate a USB device for boot ordering unless it’s plugged in when you enter UEFI. Plug the USB stick in before powering on, then mash Esc/Del to enter UEFI, set USB Hard Drive as first boot, save and exit. This boots to the Subiquity installer…
IMPORTANT: DO NOT RUN THE INSTALLER! YOU WILL WIPE YOUR PARTITION IF YOU DO.
Instead, get to a shell: Ctrl+Alt+F2. Login as ubuntu with no password.
Mount the broken installation and chroot in:
bash
sudo -i
mount /dev/nvme0n1p2 /mnt/spark
mount --bind /dev /mnt/spark/dev
mount --bind /dev/pts /mnt/spark/dev/pts
mount --bind /proc /mnt/spark/proc
mount --bind /sys /mnt/spark/sys
mount --bind /run /mnt/spark/run
mount /dev/nvme0n1p1 /mnt/spark/boot/efi
chroot /mnt/spark /bin/bash
Generate the missing initramfs:
bash
update-initramfs -c -k 6.17.0-1014-nvidia
(Replace the version with whatever’s missing in your case — compare ls /boot/vmlinuz-* with ls /boot/initrd.img-* to identify which kernel has no initrd.)
Clear the dpkg iF state. This is what tripped me up — the package’s postinst keeps failing because DKMS sees its modules already installed and exits non-zero. Force DKMS past the check:
bash
dkms autoinstall --force -k 6.17.0-1014-nvidia
dpkg --configure -a
Update GRUB:
bash
update-grub
Fix the GRUB timeout while you’re in here, or this can happen to you again:
bash
nano /etc/default/grub
Set:
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5
Then:
bash
update-grub
Exit and reboot:
bash
exit
umount -l /mnt/spark/sys
umount /mnt/spark/proc
umount /mnt/spark/dev/pts
umount /mnt/spark/dev
umount /mnt/spark/boot/efi
umount /mnt/spark
reboot
Pull the USB stick out as it powers down so you don’t boot the installer again.
Hold the kernel afterward
To avoid having the dashboard re-trigger the same broken transition before NVIDIA addresses it:
bash
sudo apt-mark hold linux-image-6.17.0-1014-nvidia
sudo apt-mark hold linux-image-nvidia-hwe-24.04
Verify with apt-mark showhold. Unhold (apt-mark unhold) when you’re ready to attempt the update again, and consider running it via terminal apt upgrade rather than the dashboard so you can see error output and defer the reboot if anything looks wrong.
Two things that will save your time if this hits you
-
Have an ARM64 Linux live USB on hand before you need it. Building one when your dev box is already a brick is annoying. Make one now and stash it.
-
Edit
/etc/default/grubto set a non-zeroGRUB_TIMEOUTon a working system, today. If you’ve never touched it, it’s almost certainly0and you have no remote recovery path if a future kernel update goes sideways. Set it to 5, runsudo update-grub, done.
Hope this helps someone.