Silverblue 32 - Formatted EFI partition during Install, Cannot boot Windows [fixed]

Previously I have had Fedora installed on one HDD and Windows on another SSD to get around the issue with Anaconda struggling with EFI Windows installs.

This time I decided to try again to install on same drive as Windows and to click “Format” for the EFI partition as read on a random Google search (but didnt read well enough to realise that was for the non-dual boot case).

Now (surprise surprise), only Fedora is showing in the boot entries.

Googling around, I cannot seem to figure out how to restore the Windows Boot entry in the Grub menu.

All guides seem to be for Standard Grub2 and not for Grub with BLS enabled, though I am not sure if they would work with BLS disabled either.

I could use a Windows restore disk to restore the WIndows EFI, but that will leave me at step 0 with no Grub/access to silverblue.

So questions are:

  1. How do I add Windows 10 to the boot list? do I need to restore the Windows EFI first?
  2. with Boot Loader Spec how do I set the default boot entry?
  3. In normal Fedora you could change the setting in etc/kernel/default to choose whether default boot entry is updated on kernel update. How does this work for silverblue?

You should create a secondary dedicated EFI partition for Silverblue, mount it on /boot/efi using fstab and migrate the EFI directory in /boot/efi/EFI.

You would restore your Windows EFI stuff in the original EFI partition, but I’m fairly sure the Windows restore disk might not be particularly fond of two EFI partitions existing in your drive so I would suggest taking a backup of your Silverblue EFI first, then temporarily nuking the partition, restoring the original EFI and then recreating and populating the Silverblue one.

I’m not sure about whether you’ll need any special workarounds for GRUB to identify your Windows boot entry. Mine just does it as far as I can tell, but both of my EFI partitions are located on separate drives.

I’m not sure about the boot order mechanism used in Boot Loader Spec.
I skimmed through their spec page but nothing popped out and I don’t remember previously reading about it either.
I think it’s the last one you boot with, but I could be wrong.
There’s also this GRUB_DEFAULT=saved line in /etc/default/grub that probably suggests the above case, but I’m sure somebody more knowledgeable than me will soon come up with the actual details.

If you really need to get this working fast and nobody steps in to provide additional doc links you might just decide to nuke the whole Silverblue installation, restore Windows and reinstall Silverblue, this time creating a dedicated EFI partition for it in the process.
It’s not the way stuff is usually solved on Linux, but since this a new and probably not particularly modified installation it might actually be worth it.

I’m still interested in the details of this. Please keep this thread updated.

I have fixed the Windows boot but now I cannot select grub.

To fix the Windows boot loader from a Windows USB installer I ran the following:

  1. SHIFT + F10 to open a terminal
  2. diskpart
  3. list disk (will return with a numbered list of disks)
  4. select disk N (number from step 3)
  5. list volume (will give drive letters for partitions - lets say X for windows partition)
  6. exit
  7. bcdboot X:\windows

Once done, restart.

Next step is to use a Live CD/another linux install to see what is in the boot partition:

UPDATE

I see that in the boot/ folder I have 3 folders:

  1. BOOT
  2. fedora
  3. Microsoft.

Ok, update. From a live CD I ran efibootmgr and it had both Windows (0000) and Fedora (0001) listed.

I can choose which boot loader to use using efibootmgr -o 1,0 (for fedora) or efibootmgr -o 0,1 (for Windows).

However when choosing fedora, grub does not list windows. I think I just need to update the grub config now.

After setting fedora as the boot entry from efibootmgr (make sure you boot the lviecd in UEFI mode!), I ran:

grub2-mkconfig -o /boot/efi/EFI/Fedora/grub.cfg

Grub now also shows Windows in its menu.

grub2-set-default to set the windows entry to default has worked.

Only remaining question are how to keep it as default after updates. Will need to wait for an update before I can test what the current behaviour is.

@kon14 thanks for the pointers.

AFAIK the boot loader spec that is implemented in fedora is not the same as the one on the systemd page. https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault which states Fedora has implemented https://www.freedesktop.org/wiki/MatthewGarrett/BootLoaderSpec/

I am unsure if the differences have been reconciled or whether they make the implementations incompatible.

Only remaining questions are how to set that as default and to keep it as default after updates.

By default I assume you’re still talking about the boot entry order?
I’ll try and find some extra info about this tomorrow.
It’s surprisingly hard to search for such niche setups online using mere keywords, especially when there’s a bunch of related projects and configs that happen to be completely unrelated :confused:.

I updated my previous post to say that grub2-set-default followed by how the windows entry shows on grub worked.

I didnt even need to remake the config file after running that command with the correct boot entry. Or rather, I forgot to, and it still worked.

I have since also updated silverblue to todays update and the windows option remained as default.

So no need to update /etc/kernel/default as is necessary for normal workstation install.

As for boot loader spec, it seems the boot entries are in boot/loader.1 folder, so it seems to not follow either spec?

Silverblue is a bit different than standard workstation in how it handles the BLS since it boots up differently. Since you have solved this, could you indicate that on the original post to show others that may have your same issue as you stated here, the solution that you found worked?

OK Full Solution - or how I got Dual boot working with Silverblue 32 on a GPT/EFI system with Windows 10

There is an issue with the installer in at least Fedora 31 and 32 where if you are installing to a dual boot configuration with a pre-existing GPT/UEFI system where the /boot/efi folder contains some content the installer will place the required files in the wrong directory: https://github.com/rhinstaller/anaconda/pull/2329

To get around this I formatted the /boot/efi partition during install. Silverblue now worked, but the Windows Boot loader entry was removed.

Requirements:

  1. USB with Silverblue version 32
  2. USB with Windows 10 Installer. Download the media creation tool from Microsoft Website. It probably needs to be done on Windows for the USB version, though ISO version can probably be done on linux and burnt to CD/DVD.
  3. EFI based live USB (you need access to efibootmgr on the command line)

Install Silverblue

When installing silverblue, choose custom partitioning, and from there click to automatically create partitions.

From existing Partitions select /boot/efi. On the right hand side click the tick box that says format partition.

Install Silverblue as normal with above change. There will be other guides out there of how to partition or create space for silverblue before installing etc.

After install, you will be able to boot into Silverblue only.

Reboot into Windows Installer

After you have installed Silverblue, reboot into the Windows installer.

To fix the Windows boot loader from a Windows USB installer I ran the following:

SHIFT + F10 to open a terminal
diskpart
list disk (will return with a numbered list of disks)
select disk N (number from step 3)
list volume (will give drive letters for partitions - lets say X for windows partition)
exit
bcdboot X:\windows

Once done, restart. You will boot into Windows only and not get a grub prompt.

Reboot into Linux Live Distro

I booted into Fedora 32 workstation. Any live distro will work as long as it is booted in UEFI mode and has efibootmgr installed (or installable).

  1. From Command line:
    sudo efibootmgr

    BootCurrent: 0002
    Timeout: 0 seconds
    BootOrder: 0000,0001…
    Boot0000* Windows Boot Manager
    Boot0001* Fedora
    Boot0002…

  2. from the output make sure both fedora and Windows Boot Manager are listed. Note the last digit of each (or if other entries are similar, the full 4 digit sequence). You need to set the correct sequence. Here Fedora is 1 and Windows is 0:

    sudo efibootmgr -o 1,0

  3. Unhide the Grub Menu to allow easier selection of boot entry

    sudo grub2-editenv - set menu_auto_hide=0

  4. Recreate the Grub boot list - this should now detect Windows and add it to the boot loader:

    sudo grub2-mkconfig -o /boot/efi/EFI/Fedora/grub.cfg

  5. Check the current entries in Grub config:

    sudo grep -P "submenu|^menuentry" /boot/efi/EFI/fedora/grub.cfg | cut -d "'" -f2

  6. Copy the entry for the Windows Boot loader and to set it as the default entry:

    sudo grub2-set-default "Windows Boot Manager (on /dev/sda2)"

  7. Check if Windows has been set as default boot option. Either by restarting or running:

    sudo grub2-editenv - list

  8. I cannot remember having to run this again, but it might help fix any problems:

    sudo grub2-mkconfig -o /boot/efi/EFI/Fedora/grub.cfg

3 Likes

Can you please paste your tree /boot and lsblk?

I kind of b0rked* my ESP partition, and tried to re-create it, so even though Silverblue does boot correctly, rpm-ostree is not happy with it, and I can’t update the system.

  • well, for some reason my Silverblue F32 USB, made from the iso, will not boot in UEFI mode, and I can’t reinstall in UEFI mode. I installed in legacy boot mode.