PopOS Boot Failure After Adding Second NVMe Drive

    A
    Arkadyuti Sarkar
    7 min read30 views
    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 /etc/default/grub

    The cmdline file takes precedence

    Run kernelstub

    Updates wrong config, cmdline takes precedence

    Edit /etc/fstab

    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

    /boot/efi/EFI/Pop_OS-[UUID]/cmdline

    CRITICAL - Direct kernel parameters

    /boot/efi/loader/entries/Pop_OS-current.conf

    Systemd-boot entry config

    /etc/kernelstub/configuration

    Kernelstub configuration

    /etc/fstab

    Filesystem mount configuration

    /etc/grub.d/40_custom

    Custom GRUB entries (multi-boot)

    /etc/default/grub

    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

    Share this post: