2

I've installed Arch on a partition, and installed grup as the wiki says

grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

Now I only get Archlinux and Advanced options and no Windows.

Here's my parted -l output:

Model: ATA Hitachi HTS54757 (scsi)
Disk /dev/sda: 750GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  135MB   134MB                         bios_grub
 2      135MB   269MB   134MB                   Mi    msftres
 3      269MB   86.2GB  85.9GB  ntfs            Ba    msftdata
 4      86.2GB  129GB   43.2GB  ext4            misc
 6      129GB   236GB   107GB   ntfs                  msftdata
 7      236GB   343GB   107GB   ntfs                  msftdata
 5      343GB   394GB   50.8GB  ext4
 8      394GB   403GB   9000MB  linux-swap(v1)
 9      403GB   507GB   103GB   ext4

And lsblk -f :

NAME   FSTYPE LABEL         UUID                                 MOUNTPOINT
sda                                                              
|-sda1                                                           
|-sda2                                                           
|-sda3 ntfs   Windows       02F00D3CF00D3785                     /media/Windows
|-sda4 ext4                 25bc874b-1a89-4ff9-a01e-ca39e28155d9 
|-sda5 ext4                 342ebed5-9592-4246-bdc2-4cd5c5ee92d5 /
|-sda6 ntfs   Programming   01CE50F6C84EAFE0                     /media/Programming
|-sda7 ntfs   Entertainment 01CE50F6CC660CE0                     /media/Entertainment
|-sda8 swap                 374052bf-9a06-4c34-a1dc-616967b6fe4f [SWAP]
`-sda9 ext4   misc2         15b7261e-39a6-4668-9f22-a7c3096a6af5 /media/misc2
sr0 

My /boot/grub/grub.cfg content:

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
insmod part_gpt
insmod part_msdos
if [ -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="0"
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
}

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_gpt
insmod ext2
set root='hd0,gpt5'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  342ebed5-9592-4246-bdc2-4cd5c5ee92d5
else
  search --no-floppy --fs-uuid --set=root 342ebed5-9592-4246-bdc2-4cd5c5ee92d5
fi
    font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=en_US
  insmod gettext
fi
terminal_input console
terminal_output gfxterm
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/10_linux ###
menuentry 'Arch Linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-342ebed5-9592-4246-bdc2-4cd5c5ee92d5' {
    load_video
    set gfxpayload=keep
    insmod gzio
    insmod part_gpt
    insmod ext2
    set root='hd0,gpt5'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  342ebed5-9592-4246-bdc2-4cd5c5ee92d5
    else
      search --no-floppy --fs-uuid --set=root 342ebed5-9592-4246-bdc2-4cd5c5ee92d5
    fi
    echo    'Loading Linux linux ...'
    linux   /boot/vmlinuz-linux root=UUID=342ebed5-9592-4246-bdc2-4cd5c5ee92d5 rw  quiet
    echo    'Loading initial ramdisk ...'
    initrd  /boot/intel-ucode.img /boot/initramfs-linux.img
}
submenu 'Advanced options for Arch Linux' $menuentry_id_option 'gnulinux-advanced-342ebed5-9592-4246-bdc2-4cd5c5ee92d5' {
    menuentry 'Arch Linux, with Linux linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-advanced-342ebed5-9592-4246-bdc2-4cd5c5ee92d5' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_gpt
        insmod ext2
        set root='hd0,gpt5'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  342ebed5-9592-4246-bdc2-4cd5c5ee92d5
        else
          search --no-floppy --fs-uuid --set=root 342ebed5-9592-4246-bdc2-4cd5c5ee92d5
        fi
        echo    'Loading Linux linux ...'
        linux   /boot/vmlinuz-linux root=UUID=342ebed5-9592-4246-bdc2-4cd5c5ee92d5 rw  quiet
        echo    'Loading initial ramdisk ...'
        initrd  /boot/intel-ucode.img /boot/initramfs-linux.img
    }
    menuentry 'Arch Linux, with Linux linux (fallback initramfs)' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-fallback-342ebed5-9592-4246-bdc2-4cd5c5ee92d5' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_gpt
        insmod ext2
        set root='hd0,gpt5'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  342ebed5-9592-4246-bdc2-4cd5c5ee92d5
        else
          search --no-floppy --fs-uuid --set=root 342ebed5-9592-4246-bdc2-4cd5c5ee92d5
        fi
        echo    'Loading Linux linux ...'
        linux   /boot/vmlinuz-linux root=UUID=342ebed5-9592-4246-bdc2-4cd5c5ee92d5 rw  quiet
        echo    'Loading initial ramdisk ...'
        initrd  /boot/intel-ucode.img /boot/initramfs-linux-fallback.img
    }
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

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

### 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.
### 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 ###

Content of /etc/default/grub:

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Arch"
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

# Preload both GPT and MBR modules so that they are not missed
GRUB_PRELOAD_MODULES="part_gpt part_msdos"

# Uncomment to enable Hidden Menu, and optionally hide the timeout count
#GRUB_HIDDEN_TIMEOUT=5
#GRUB_HIDDEN_TIMEOUT_QUIET=true

# Uncomment to use basic console
GRUB_TERMINAL_INPUT=console

# Uncomment to disable graphical terminal
#GRUB_TERMINAL_OUTPUT=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
GRUB_GFXMODE=auto

# Uncomment to allow the kernel use the same resolution used by grub
GRUB_GFXPAYLOAD_LINUX=keep

# Uncomment if you want GRUB to pass to the Linux kernel the old parameter 
# format "root=/dev/xxx" instead of "root=/dev/disk/by-uuid/xxx" 
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
GRUB_DISABLE_RECOVERY=true

# Uncomment and set to the desired menu colors.  Used by normal and wallpaper 
# modes only.  Entries specified as foreground/background.
#GRUB_COLOR_NORMAL="light-blue/black"
#GRUB_COLOR_HIGHLIGHT="light-cyan/blue"

# Uncomment one of them for the gfx desired, a image background or a gfxtheme
#GRUB_BACKGROUND="/path/to/wallpaper"
#GRUB_THEME="/path/to/gfxtheme"

# Uncomment to get a beep at GRUB start
#GRUB_INIT_TUNE="480 440 1"

#GRUB_SAVEDEFAULT="true"
Rafael Adel
  • 1,261
  • 2
  • 13
  • 27

2 Answers2

0

Thankfully I have experienced this myself and its not a serious issue. Within the grub configuration, there will be a section for the different menu options. By default the windows option will have a # infront of each line (think its 4 or 5 lines in total). I'd like to provide you with more detail however I am not able to do so on my current setup.

0

You have a GPT partition table. Windows does not support booting from a GPT-partitioned system disk using legacy BIOS. Only these combinations are valid:

  • BIOS-style boot and MBR partitioning
  • UEFI-style boot and GPT partitioning

While Linux can do UEFI+MBR and BIOS+GPT, Microsoft explicitly documents Windows does not support those combinations.

It looks like you converted the existing UEFI ESP partition (sda1) into a bios_grub partition, overwriting the Windows UEFI bootloader on that partition. The \EFI\Microsoft\Boot directory on the UEFI ESP includes a file named BCD which contains information unique to your specific installation, and so it cannot be recovered from a generic installation media: it must be recreated. Fortunately the recovery tools on the Windows installation media can usually do this fairly painlessly.

But even if the ESP partition was intact, the i386-pc version of GRUB used for BIOS-style booting (using 16-bit code) will not be able to chainload a UEFI bootloader which is using modern 64-bit code. The rEFInd UEFI boot manager can in some cases transition from UEFI mode to legacy BIOS compatibility mode to boot an OS in BIOS-style, but such a transition is essentially one-way and it does not work on all systems because of UEFI firmware implementation differences.

The x86_64-efi version of GRUB (used when booting GRUB UEFI-style) has no problems chainloading the Windows UEFI bootloader.

When planning to set up multi-boot with 2 or more OS alternatives on modern x86_64 systems, you should always try to have all the OSs use the same boot style (either all BIOS or all UEFI). Linux grub-mkconfig will usually run os-prober, which will usually find Windows and automatically add a boot entry for it if and only if it uses the same boot style as the installed version of GRUB.

Mixing different boot styles will usually cause extra complications. At minimum, you'll usually have to use the BIOS settings to toggle between the boot styles when switching from one OS to another: you won't easily be able to have all the OSs in a single convenient boot menu.

You are definitely not the first one to make this mistake, and you won't be the last either. (This is why I wrote this answer to an almost 5 years old question.)

telcoM
  • 87,318
  • 3
  • 112
  • 232