Dual Boot - Fedora listed in Grub, Windows 10 not listed

Running 42, Fedora (Ultramarine) on one ssd, fresh install of Win 10 on another (I use the windows 10 for printing & games as the office I work at has special printer drivers that keep record and charge for documents printed) Grub shows linux, sees windows but doesn’t show up as a menu item.. I can hammer F8 and boot to win, but it would be nice to have it on grub. Desktop puter

MOUNTPOINTS
sda
└─sda1
ntfs Photography 1E30F53C30F51C09
sdb
├─sdb1
│ vfat FAT32 6C7D-51DF
├─sdb2

├─sdb3
│ ntfs 0CBA8E5ABA8E4066
└─sdb4
ntfs EE0053DE0053ABF9
sdc
├─sdc1
│ ntfs Windows XP 602C122A2C11FC2A
└─sdc2
ntfs Media 9E9E3F989E3F67C3
sdd
├─sdd1
│ vfat FAT32 8798-488D 579.5M 3%
/boot/efi
├─sdd2
│ ext4 1.0 4522d59e-a832-45a4-a0bb-1138c64a9909 274.5M 65%
/boot
└─sdd3
btrfs ul e7e6a256-af67-45b7-8c67-8b109e34ba1f 93.6G 60%
/home

/
sr0
zram0
swap 1 zram0 875ba0a9-8555-4086-a1d1-cd7a17436c18
[SWAP]

/etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=“$(sed ‘s, release .*$, ,g’ /etc/system-release)”
GRUB_DEFAULT=saved
GRUB_DISABLE-SUBMENU=true
GRUB_TERMINAL_OUTPUT=“console”
GRUB_CMDLINE_LINUX=“rhgb quiet rd.driver.blacklist=nouveau,nova_core modprobe.blacklist=nouveau,nova_core”
GRUB_DISABLE_RECOVERY=“true”
GRUB_ENABLE_BLSCFG=true

So I guess the output of os-prober shows your Windows EFI partition?

If you run sudo grep -iA5 os-prober /boot/grub2/grub.cfg, does it show anything Windows-related in the os-prober section of the config?

If not, have you run grub2-mkconfig -o /boot/grub2/grub.cfg since installing Windows?

Caveat: I don’t know if Ultramarine has changed anything around GRUB, so I’m answering as if this were Fedora.

/dev/sdb1@/efi/Microsoft/Boot/bootmgfw.efi:Windows Boot Manager:Windows:efi

BEGIN /etc/grub.d/30_os-prober

menuentry ‘Windows Boot Manager (on /dev/sdb1)’ --class windows --class os $menuentry_id_option ‘osprober-efi-6C7D-51DF’ {
insmod part_gpt
insmod fat
set root=‘hd1,gpt1’
if [ x$feature_platform_search_hint = xy ]; then

END /etc/grub.d/30_os-prober

BEGIN /etc/grub.d/30_uefi-firmware

if [ “$grub_platform” = “efi” ]; then
if [ fwsetup --is-supported ]; then
menuentry ‘UEFI Firmware Settings’ $menuentry_id_option ‘uefi-firmware’ {

❯ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file …
Found Windows Boot Manager on /dev/sdb1@/efi/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for UEFI Firmware Settings …
done

Yes, notes listed thank you for your help

The only thing that jumps out is this:

That should be with all underscores and no hyphens, so GRUB_DISABLE_SUBMENU=true.

As written, it’s probably not actually disabling the submenu, so Windows might be going into a submenu?

Try fixing that line and doing another grub2-mkconfig.

That is my typo as I wasn’t able to copy the code at that moment for some reason.

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=“$(sed ‘s, release .*$,g’ /etc/system-release)”
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT=“console”
GRUB_CMDLINE_LINUX="rhgb quiet rd.driver.blacklist=nouveau,nova_core modprobe.blacklist=nouvea>
GRUB_DISABLE_RECOVERY=“true”
GRUB_ENABLE_BLSCFG=true

Then I can’t see anything obviously wrong :frowning:

So when you boot, you see a GRUB menu with all your Ultramarine kernels but literally nothing for Windows?

Correct. I will reboot here shortly and check to see if there are any changes…

here is what grub looks like (I would upload a pic, but am not sure if I can in this forum.)

Ultramarine Linux (6.18.5-100.fc42 .x86_64) 42 (Plasma Edition)
Ultramarine Linux (6.17.7-200.fc42 .x86_64) 42 (Plasma Edition)
Ultramarine Linux (0-rescue-5fe0…) 42 (Plasma Edition)
UEFI Firmware Settings

BLS was overriding GRUB -
GRUB_ENABLE_BLSCFG=false
GRUB_TIMEOUT_STYLE=menu
is the correct entry
then I needed to regenerate so I ran:
sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

/EFI/fedora/grub.cfg is what needed to be updated.

I assume you meant /boot/efi/EFI/fedora/grub.cfg. Normally, that file is a stub that pulls in /boot/grub2/grub.cfg, so replacing the stub with real grub.cfg will work until some update changes the file invoked by the stub.

% sudo cat /boot/efi/EFI/fedora/grub.cfg
search --no-floppy --root-dev-only --fs-uuid --set=dev <UUID>
set prefix=($dev)/grub2
export $prefix
configfile $prefix/grub.cfg
2 Likes

Then I wonder if Ultramarine does something different from Fedora here.

On Fedora, BLS and dual boot are perfectly compatible within the same GRUB config. BLS discovery is handled by section “10_linux” of /boot/grub2/grub.cfg, and booting of other OSes as identified by os-prober is handled by the separate section “30_os-prober”.

Do you know what the previous contents of that file on the EFI partition were? I wonder if in Ultramarine it bypasses /boot/grub2/grub.cfg ? Whereas on Fedora, as @gnwiii says, the EFI partition grub.cfg is simply a stub that chains to the “real” config on the /boot partition.

Thank you again for the help. Well, I plan on doing a clean install of Ultramarine 44 when it is released. I will need to re-configure grub again for that install. God willing I will remember to dig in and we can resurrect this thread to be a help to others.

On fedora that command should give an error to warn the user the file should not be modified and terminate with that message.

$ sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
\\Running `grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg' will overwrite the GRUB wrapper.
Please run `grub2-mkconfig -o /boot/grub2/grub.cfg' instead to update grub.cfg.
GRUB configuration file was not updated.

The appropriate command on fedora is
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
If the command you show actually works then it breaks the automatic grub updates with new kernel upgrades and the user will never be able to boot the newer kernels because it overwrites the stub file shown by @gnwiii above.

Please run cat /boot/efi/EFI/fedora/grub.cfg and if the result appears different than shown by George above then it will need recovery to restore proper kernel updates.

On my fedora system the file /boot/grub2/grub.cfg shows a stanza like this for booting windows.

### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Windows Boot Manager (on /dev/nvme0n1p1)' --class windows --class os $menuentry_id_option 'osprober-efi-42F8-BF3E' {
	insmod part_gpt
	insmod fat
	search --no-floppy --fs-uuid --set=root 42F8-BF3E
	chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
# Other OS found, undo autohiding of menu unless menu_auto_hide=2
if [ "${orig_timeout_style}" -a "${menu_auto_hide}" != "2" ]; then
  set timeout_style=${orig_timeout_style}
  set timeout=${orig_timeout}
fi
### END /etc/grub.d/30_os-prober ###

Note this is significantly different than what you posted above.

The following documentation page suggests the following to update the config:

`sudo grub2-mkconfig -o /etc/grub2.cfg`

`sudo grub2-mkconfig -o /etc/grub2-efi.cfg`

`sudo grub2-mkconfig -o /boot/grub2/grub.cfg` - Legacy boot method for grub update.

It looks like /etc/grub2.cfg and /etc/grub2-efi.cfg are just links to /boot/grub2/grub.cfg, so I guess all 3 of them do the same thing, but I’ve always found that page confusing on which of the 3 commands I should use or if I should do all 3.

You can use any one of the 3 commands at your discretion. Since all update the same file it is only necessary to perform the grub2-mkconfig command once.

Here is what cat /boot/efi/EFI/fedora/grub.cfg spits out:

BEGIN /etc/grub.d/00_header

set pager=1

if [ -f ${config_directory}/grubenv ]; then
load_env -f ${config_directory}/grubenv
elif [ -s $prefix/grubenv ]; then
load_env
fi
if [ “${next_entry}” ] ; then
set default=“${next_entry}”
set next_entry=
save_env next_entry
set boot_once=true
else
set default=“${saved_entry}”
fi

if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option=“–id”
else
menuentry_id_option=“”
fi

export menuentry_id_option

if [ “${prev_saved_entry}” ]; then
set saved_entry=“${prev_saved_entry}”
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi

function savedefault {
if [ -z “${boot_once}” ]; then
saved_entry=“${chosen}”
save_env saved_entry
fi
}

function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}

terminal_output console
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=5

Fallback normal timeout code in case the timeout_style feature is

unavailable.

else
set timeout=5
fi

END /etc/grub.d/00_header

BEGIN /etc/grub.d/00_tuned

set tuned_params=“”
export tuned_params
set tuned_initrd=“”
export tuned_initrd

END /etc/grub.d/00_tuned

BEGIN /etc/grub.d/01_users

if [ -f ${prefix}/user.cfg ]; then
source ${prefix}/user.cfg
if [ -n “${GRUB2_PASSWORD}” ]; then
set superusers=“root”
export superusers
password_pbkdf2 root ${GRUB2_PASSWORD}
fi
fi

END /etc/grub.d/01_users

BEGIN /etc/grub.d/08_fallback_counting

insmod increment

Check if boot_counter exists and boot_success=0 to activate this behaviour.

if [ -n “${boot_counter}” -a “${boot_success}” = “0” ]; then

if countdown has ended, choose to boot rollback deployment,

i.e. default=1 on OSTree-based systems.

if [ “${boot_counter}” = “0” -o “${boot_counter}” = “-1” ]; then
set default=1
set boot_counter=-1

otherwise decrement boot_counter

else
decrement boot_counter
fi
save_env boot_counter
fi

END /etc/grub.d/08_fallback_counting

BEGIN /etc/grub.d/10_linux

menuentry ‘Ultramarine Linux (6.18.5-100.fc42.x86_64) 42 (Plasma Edition)’ --class ultramarine --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option ‘gnulinux-6.18.5-100.fc42.x86_64-advanced-e7e6a256-af67-45b7-8c67-8b109e34ba1f’ {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set root=‘hd3,gpt2’
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd3,gpt2 --hint-efi=hd3,gpt2 --hint-baremetal=ahci3,gpt2 4522d59e-a832-45a4-a0bb-1138c64a9909
else
search --no-floppy --fs-uuid --set=root 4522d59e-a832-45a4-a0bb-1138c64a9909
fi
echo ‘Loading Linux 6.18.5-100.fc42.x86_64 …’
linux /vmlinuz-6.18.5-100.fc42.x86_64 root=UUID=e7e6a256-af67-45b7-8c67-8b109e34ba1f ro rootflags=subvol=root rhgb quiet rd.driver.blacklist=nouveau,nova_core modprobe.blacklist=nouveau,nova_core
echo ‘Loading initial ramdisk …’
initrd /initramfs-6.18.5-100.fc42.x86_64.img
}
menuentry ‘Ultramarine Linux (6.17.7-200.fc42.x86_64) 42 (Plasma Edition)’ --class ultramarine --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option ‘gnulinux-6.17.7-200.fc42.x86_64-advanced-e7e6a256-af67-45b7-8c67-8b109e34ba1f’ {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set root=‘hd3,gpt2’
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd3,gpt2 --hint-efi=hd3,gpt2 --hint-baremetal=ahci3,gpt2 4522d59e-a832-45a4-a0bb-1138c64a9909
else
search --no-floppy --fs-uuid --set=root 4522d59e-a832-45a4-a0bb-1138c64a9909
fi
echo ‘Loading Linux 6.17.7-200.fc42.x86_64 …’
linux /vmlinuz-6.17.7-200.fc42.x86_64 root=UUID=e7e6a256-af67-45b7-8c67-8b109e34ba1f ro rootflags=subvol=root rhgb quiet rd.driver.blacklist=nouveau,nova_core modprobe.blacklist=nouveau,nova_core
echo ‘Loading initial ramdisk …’
initrd /initramfs-6.17.7-200.fc42.x86_64.img
}
menuentry ‘Ultramarine Linux (0-rescue-5fe0745918ac49769478b88fd695eb7e) 42 (Plasma Edition)’ --class ultramarine --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option ‘gnulinux-0-rescue-5fe0745918ac49769478b88fd695eb7e-advanced-e7e6a256-af67-45b7-8c67-8b109e34ba1f’ {
load_video
insmod gzio
insmod part_gpt
insmod ext2
set root=‘hd3,gpt2’
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd3,gpt2 --hint-efi=hd3,gpt2 --hint-baremetal=ahci3,gpt2 4522d59e-a832-45a4-a0bb-1138c64a9909
else
search --no-floppy --fs-uuid --set=root 4522d59e-a832-45a4-a0bb-1138c64a9909
fi
echo ‘Loading Linux 0-rescue-5fe0745918ac49769478b88fd695eb7e …’
linux /vmlinuz-0-rescue-5fe0745918ac49769478b88fd695eb7e root=UUID=e7e6a256-af67-45b7-8c67-8b109e34ba1f ro rootflags=subvol=root rhgb quiet rd.driver.blacklist=nouveau,nova_core modprobe.blacklist=nouveau,nova_core
echo ‘Loading initial ramdisk …’
initrd /initramfs-0-rescue-5fe0745918ac49769478b88fd695eb7e.img
}

END /etc/grub.d/10_linux

BEGIN /etc/grub.d/10_reset_boot_success

Hiding the menu is ok if last boot was ok or if this is a first boot attempt to boot the entry

if [ “${boot_success}” = “1” -o “${boot_indeterminate}” = “1” ]; then
set menu_hide_ok=1
else
set menu_hide_ok=0
fi

Reset boot_indeterminate after a successful boot

if [ “${boot_success}” = “1” ] ; then
set boot_indeterminate=0

Avoid boot_indeterminate causing the menu to be hidden more than once

elif [ “${boot_indeterminate}” = “1” ]; then
set boot_indeterminate=2
fi

Reset boot_success for current boot

set boot_success=0
save_env boot_success boot_indeterminate

END /etc/grub.d/10_reset_boot_success

BEGIN /etc/grub.d/12_menu_auto_hide

if [ x$feature_timeout_style = xy ] ; then
if [ “${menu_show_once}” ]; then
unset menu_show_once
save_env menu_show_once
set timeout_style=menu
set timeout=60
elif [ “${menu_auto_hide}” -a “${menu_hide_ok}” = “1” ]; then
set orig_timeout_style=${timeout_style}
set orig_timeout=${timeout}
if [ “${fastboot}” = “1” ]; then
# timeout_style=menu + timeout=0 avoids the countdown code keypress check
set timeout_style=menu
set timeout=0
else
set timeout_style=hidden
set timeout=1
fi
fi
fi

END /etc/grub.d/12_menu_auto_hide

BEGIN /etc/grub.d/14_menu_show_once

if [ x$feature_timeout_style = xy ]; then
if [ “${menu_show_once_timeout}” ]; then
set timeout_style=menu
set timeout=“${menu_show_once_timeout}”
unset menu_show_once_timeout
save_env menu_show_once_timeout
fi
fi

END /etc/grub.d/14_menu_show_once

BEGIN /etc/grub.d/20_linux_xen

END /etc/grub.d/20_linux_xen

BEGIN /etc/grub.d/20_ppc_terminfo

END /etc/grub.d/20_ppc_terminfo

BEGIN /etc/grub.d/25_bli

if [ “$grub_platform” = “efi” ]; then
if [ ! insmod bli ]; then
echo “bli module not available”
fi
fi

END /etc/grub.d/25_bli

BEGIN /etc/grub.d/30_os-prober

menuentry ‘Windows Boot Manager (on /dev/sdb1)’ --class windows --class os $menuentry_id_option ‘osprober-efi-6C7D-51DF’ {
insmod part_gpt
insmod fat
set root=‘hd1,gpt1’
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd1,gpt1 --hint-efi=hd1,gpt1 --hint-baremetal=ahci1,gpt1 6C7D-51DF
else
search --no-floppy --fs-uuid --set=root 6C7D-51DF
fi
chainloader /efi/Microsoft/Boot/bootmgfw.efi
}

Other OS found, undo autohiding of menu unless menu_auto_hide=2

if [ “${orig_timeout_style}” -a “${menu_auto_hide}” != “2” ]; then
set timeout_style=${orig_timeout_style}
set timeout=${orig_timeout}
fi

END /etc/grub.d/30_os-prober

BEGIN /etc/grub.d/30_uefi-firmware

if [ “$grub_platform” = “efi” ]; then
if [ fwsetup --is-supported ]; then
menuentry ‘UEFI Firmware Settings’ $menuentry_id_option ‘uefi-firmware’ {
fwsetup
}
fi
fi

END /etc/grub.d/30_uefi-firmware

BEGIN /etc/grub.d/35_fwupd

END /etc/grub.d/35_fwupd

BEGIN /etc/grub.d/40_custom

This file provides an easy way to add custom menu entries. Simply type the

menu entries you want to add after this comment. Be careful not to change

the ‘exec tail’ line above.

menuentry “Windows 10” {
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root 6C7D-51DF
chainloader /EFI/Microsoft/Boot/boormgfw.efi
}

END /etc/grub.d/40_custom

BEGIN /etc/grub.d/41_custom

if [ -f ${config_directory}/custom.cfg ]; then
source ${config_directory}/custom.cfg
elif [ -z “${config_directory}” -a -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg
fi

END /etc/grub.d/41_custom