PopOS Boot Failure After Adding Second NVMe Drive
PopOS Boot Failure After Adding Second NVMe Drive
Problem Statement
PopOS fails to boot with error ALERT! /dev/nvme0n1p5 does not exist. Dropping to a shell! after installing a second NVMe drive.
Root Cause
When a second NVMe drive is added, Linux device naming can change:
Before: First NVMe = /dev/nvme0n1
After: First NVMe = /dev/nvme1n1 (second drive takes nvme0n1)
PopOS has a hardcoded device path in /boot/efi/EFI/Pop_OS-[UUID]/cmdline that overrides all other boot configurations.
Quick Fix Procedure (Single Boot / PopOS as Primary)
Step 1: Boot Into PopOS
Remove the second NVMe drive temporarily
Boot into PopOS normally
Open terminal as root: sudo su
Step 2: Identify the Problem File
# Find your PopOS UUID directory
ls /boot/efi/EFI/ | grep Pop_OS
# Check the problematic cmdline file
cat /boot/efi/EFI/Pop_OS-*/cmdline
If output shows /dev/nvme0n1p5 or similar hardcoded path, proceed to fix.
Step 3: Get Your Root Partition UUID
# Find the UUID of your PopOS root partition
blkid | grep "TYPE=\"ext4\""
# Look for the partition that's currently mounted as /
Step 4: Fix the cmdline File
# Replace [YOUR-UUID] with actual UUID from step 3
echo "root=UUID=[YOUR-UUID] ro quiet loglevel=0 systemd.show_status=false splash" > /boot/efi/EFI/Pop_OS-*/cmdline
# Verify the fix
cat /boot/efi/EFI/Pop_OS-*/cmdline
Step 5: Update initramfs (Optional but Recommended)
update-initramfs -u -k all
Step 6: Test
# Shutdown
shutdown -h now
Reconnect the second NVMe drive
Boot normally - PopOS should now work
Multi-Boot Setup: Booting Pop!_OS from Another Linux Distribution's GRUB
If you're dual-booting Pop!_OS with another Linux distribution (like Garuda, Manjaro, Arch, etc.) that uses GRUB as the primary bootloader, you need additional steps.
The GRUB os-prober Problem
When GRUB's os-prober detects Pop!_OS, it creates boot entries with hardcoded device paths:
linux /boot/vmlinuz root=/dev/nvme0n1p5
Even though GRUB uses UUID for the search command, the root= kernel parameter is hardcoded, causing the same boot failure when NVMe devices reorder.
Complete Fix for Multi-Boot GRUB Setup
Step 1: Boot into your GRUB-based Linux distribution
Boot into your primary Linux distribution (the one with GRUB, e.g., Garuda, Arch, Manjaro).
Step 2: Identify your Pop!_OS partition
lsblk -f
Look for the ext4 partition that contains Pop!_OS (usually /dev/nvme0n1p5 or similar). Note its UUID.
Example output:
nvme0n1
├─nvme0n1p1 vfat FAT32 EFI D875-322B
├─nvme0n1p5 ext4 1.0 5c6578bb-18e0-48b1-b41b-714e75bd386c
Step 3: Fix the Pop!_OS cmdline file
# Get the UUID of your Pop!_OS partition
sudo blkid /dev/nvme0n1p5
# Update cmdline file (replace YOUR-UUID with actual UUID)
sudo bash -c 'echo "root=UUID=YOUR-UUID ro quiet loglevel=0 systemd.show_status=false splash" > /boot/efi/EFI/Pop_OS-YOUR-UUID/cmdline'
# Verify the fix
sudo cat /boot/efi/EFI/Pop_OS-YOUR-UUID/cmdline
Step 4: Mount and chroot into Pop!_OS
# Create mount point and mount Pop!_OS root
sudo mkdir -p /mnt/popos
sudo mount /dev/nvme0n1p5 /mnt/popos
# Bind necessary directories
sudo mount --bind /dev /mnt/popos/dev
sudo mount --bind /proc /mnt/popos/proc
sudo mount --bind /sys /mnt/popos/sys
sudo mount --bind /boot/efi /mnt/popos/boot/efi
# Enter chroot
sudo chroot /mnt/popos
# Fix PATH if needed
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Step 5: Update initramfs in chroot
# Update initramfs (warnings about firmware and NVRAM are normal in chroot)
update-initramfs -u -k all
# Update Pop!_OS boot configuration
kernelstub -v
# Exit chroot
exit
Step 6: Unmount Pop!_OS
sudo umount /mnt/popos/boot/efi
sudo umount /mnt/popos/dev
sudo umount /mnt/popos/proc
sudo umount /mnt/popos/sys
sudo umount /mnt/popos
Step 7: Disable os-prober in GRUB
Edit GRUB configuration:
sudo vim /etc/default/grub
Ensure this line exists or add it:
GRUB_DISABLE_OS_PROBER=true
Save and exit.
Step 8: Create custom GRUB entries
Edit the custom GRUB file:
sudo vim /etc/grub.d/40_custom
Add these entries at the end (replace UUIDs and kernel versions with your actual values):
menuentry "Pop!_OS 22.04 (Custom - UUID Boot)" {
search --no-floppy --fs-uuid --set=root YOUR-POPOS-UUID
linux /boot/vmlinuz-6.16.3-76061603-generic root=UUID=YOUR-POPOS-UUID ro quiet loglevel=0 systemd.show_status=false splash nvidia-drm.modeset=1
initrd /boot/initrd.img-6.16.3-76061603-generic
}
menuentry "Windows Boot Manager" {
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root YOUR-EFI-PARTITION-UUID
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
To find the correct kernel version:
sudo ls /mnt/popos/boot/vmlinuz-*
To find EFI partition UUID:
sudo blkid /dev/nvme0n1p1
Save and exit.
Step 9: Make custom GRUB file executable
sudo chmod +x /etc/grub.d/40_custom
Step 10: Update GRUB
sudo update-grub
You should see output indicating that os-prober is disabled and your custom entries are added.
Step 11: Verify GRUB configuration
sudo cat /boot/grub/grub.cfg | grep -A 5 "Pop!_OS"
Verify that only your custom entry exists with root=UUID= (not root=/dev/nvme0n1p5).
Step 12: Reboot and test
sudo reboot
Select "Pop!_OS 22.04 (Custom - UUID Boot)" from the GRUB menu. Pop!_OS should now boot successfully with both NVMe drives connected.
Why This Multi-Boot Fix Works
Disabled os-prober: Prevents GRUB from auto-generating broken entries with hardcoded device paths
Custom GRUB entry: Uses UUID-based root parameter that works regardless of device ordering
Fixed cmdline file: Ensures Pop!_OS's own boot configuration also uses UUID
Updated initramfs: Ensures the boot image has the latest configuration
Verification Commands
From initramfs Emergency Shell
If you get dropped to initramfs, check:
# See what boot parameters kernel received
cat /proc/cmdline
# List available devices
ls /dev/nvme*
# Check partition table
cat /proc/partitions
From Working System
# Verify boot parameters are using UUID
cat /boot/efi/EFI/Pop_OS-*/cmdline
cat /boot/efi/loader/entries/Pop_OS-current.conf
# Check current kernelstub config
sudo kernelstub -p
Why Standard Fixes Don't Work
Fix Attempted | Why It Fails |
|---|---|
Update GRUB | PopOS uses systemd-boot, not GRUB |
Edit | The |
Run | Updates wrong config, cmdline takes precedence |
Edit | Only affects post-boot mounting, not initial boot |
Rebuild initramfs | Kernel parameters from cmdline override everything |
Use os-prober (multi-boot) | Generates entries with hardcoded device paths |
Prevention
Always use UUID instead of device paths:
✅ root=UUID=5d5e01e1-baee-48ea-86d5-b6a0c6639adb
❌ root=/dev/nvme0n1p5
File Locations Reference
File | Purpose |
|---|---|
| CRITICAL - Direct kernel parameters |
| Systemd-boot entry config |
| Kernelstub configuration |
| Filesystem mount configuration |
| Custom GRUB entries (multi-boot) |
| GRUB configuration (multi-boot) |
Emergency Boot (If Fix Hasn't Been Applied)
From initramfs prompt:
# Wait for devices to initialize
sleep 5
# List available NVMe devices to find correct one
ls /dev/nvme*
# Mount correct root (adjust device and partition number as needed)
# Try nvme0n1p5 first, if that fails try nvme1n1p5
mount /dev/nvme1n1p5 /root
exit
Troubleshooting Multi-Boot Issues
If Pop!_OS still won't boot after following multi-boot steps:
Check if you booted the correct GRUB entry: Make sure you selected "Pop!_OS 22.04 (Custom - UUID Boot)" not the os-prober auto-detected entry
Verify cmdline file wasn't overwritten:
sudo cat /boot/efi/EFI/Pop_OS-YOUR-UUID/cmdline
It should show root=UUID=... not root=/dev/...
Check kernel version in custom GRUB entry matches:
sudo ls /boot/efi/EFI/Pop_OS-YOUR-UUID/
Ensure vmlinuz and initrd filenames in your custom GRUB entry match the actual files
Verify os-prober is actually disabled:
sudo cat /etc/default/grub | grep OS_PROBER
Should show GRUB_DISABLE_OS_PROBER=true
Notes
The cmdline file in the EFI directory is specific to PopOS's boot method
This file is read by the EFI stub loader before any other configuration
NVRAM errors in chroot are normal and can be ignored
Firmware warnings during initramfs updates are cosmetic and can be ignored
In multi-boot setups, keeping os-prober disabled prevents future issues
Custom GRUB entries need manual updates when Pop!_OS kernel is updated
Summary
Single Boot (Pop!_OS as primary):
Fix cmdline file with UUID
Update initramfs
Reboot with both drives
Multi-Boot (GRUB from another distro):
Fix cmdline file with UUID
Chroot and update initramfs
Disable os-prober in GRUB
Create custom GRUB entries with UUID
Update GRUB
Reboot and use custom entry