📝 How I Successfully Fixed the Dual Boot Menu (Pop! OS + Windows)
Successfully fixed the missing Windows boot option in systemd-boot with Pop!_OS 22.04. Step-by-step guide covering ESP partition issues, windows.conf mistakes, and the final working solution.
🖥️ The Problem
Even after having both Pop!_OS and Windows 11 installed, only Pop!_OS and “Reboot Into Firmware Interface” were showing in the systemd-boot menu. Windows wouldn’t appear as a boot option.
🔧 Step-by-Step Solution
1️⃣ Check if the Windows Boot Loader Exists
1
2
3
sudo mkdir /mnt/nvmeboot
sudo mount /dev/nvme0n1p1 /mnt/nvmeboot
ls /mnt/nvmeboot/EFI/Microsoft/Boot/bootmgfw.efi
✅ If the file /mnt/nvmeboot/EFI/Microsoft/Boot/bootmgfw.efi
exists, the Windows bootloader is present.
2️⃣ Copy the Microsoft Boot Folder to Pop!_OS ESP
1
sudo cp -r /mnt/nvmeboot/EFI/Microsoft /boot/efi/EFI/
This puts the Windows bootloader into Pop’s EFI partition so systemd-boot can find it.
3️⃣ Fix the Loader Entry for Windows
First, open the Windows loader entry:
1
sudo nano /boot/efi/loader/entries/windows.conf
It might look like this:
1
2
3
title Windows 11
efi /EFI/Microsoft/Boot/bootmgfw.efi
options rootfstype=ntfs root=UUID=xxxx
👉 Important: Delete the line starting with options
:
1
options rootfstype=ntfs root=UUID=xxxx
Why? → systemd-boot doesn’t need (and may even break with) the options
line for Windows. Windows handles its own options internally.
So the final windows.conf
should look like:
1
2
title Windows 11
efi /EFI/Microsoft/Boot/bootmgfw.efi
4️⃣ Update systemd-boot Entries
1
2
sudo update-initramfs -c -k all
sudo bootctl update
Optional but recommended:
1
sudo bootctl install
5️⃣ Check Boot Loader Status
1
sudo bootctl status
Make sure it shows both Pop!_OS and Windows 11 in the boot entries.
Or list the loader entries directly:
1
sudo bootctl list
🏁 Final Result
After rebooting, the systemd-boot menu correctly displayed:
1
2
3
4
Pop!_OS
Windows 11
Windows Boot Manager
Reboot Into Firmware Interface
✅ Both OS choices work perfectly. Mission accomplished.
💡 Key Lessons Learned
- Pop!_OS uses systemd-boot, not GRUB.
- Windows loader must be copied to the same ESP Pop!_OS uses.
- The
options
line inwindows.conf
should be removed for systemd-boot compatibility. - BIOS boot priority should point to Linux Boot Manager or the Pop!_OS drive first.
bootctl update
andbootctl install
are essential after changing boot entries.
⚠ What if Windows Updates Break the Boot Entry?
Since the Microsoft bootloader (bootmgfw.efi
) was copied (not symlinked) into Pop!_OS’s ESP (/boot/efi/EFI/Microsoft/
), there’s a possibility that:
- Major Windows updates (especially feature updates) might replace or update the bootloader file only on the original Windows ESP (nvme0n1p1).
- The copied version in the Pop!_OS ESP would then become outdated or invalid.
🔄 How to Fix It (If Windows Stops Booting from systemd-boot Menu):
1️⃣ Boot into Pop!_OS.
2️⃣ Mount the Windows EFI partition again:
1
2
sudo mkdir -p /mnt/windows-esp
sudo mount /dev/nvme0n1p1 /mnt/windows-esp
3️⃣ Re-copy the updated bootloader:
1
sudo cp -r /mnt/windows-esp/EFI/Microsoft/Boot /boot/efi/EFI/Microsoft/
4️⃣ Verify the file exists:
1
ls /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi
5️⃣ Reboot. The Windows entry should work again.
💡 Pro Tip:
This method is robust for most cases. But if you often get large Windows updates or upgrade to new major releases (like from Windows 11 23H2 to 24H2), remember to repeat the copy step.
If you plan to remove Windows completely later, this won’t matter because the copied bootloader will no longer be needed. 🎉