Linux – Dual boot Arch and Windows 10 with GRUB

arch linuxgrublinuxmulti-bootwindows

I've been using Ubuntu for a while and recently decided to start using Arch. I have both a 120GB SSD and 1TB HDD in my system. When installing Arch on my SSD, I created partitions for /boot /home / (root) as well as a swap partition. I also have Windows 10 installed on my HDD using the default partitions. I would like to be able to dual boot between the 2 operating systems. I installed GRUB to my SSD on /dev/sda, but now when I boot into GRUB, I only see the option to boot into Arch, not Windows. I was wondering how I could boot into Windows via GRUB.

I have a default "/etc/grub.d/40_custom" file:

exec tail -n +3 $0
# This file provides an easy way to add custom menu entries
.  Simply type the
# menu entries you want to add after this comment.  Be care
ful not to change
# the 'exec tail' line above.

When I run "lsblk", I get:

sda      8:0    0 111.8G  0 disk 
├─sda1   8:1    0   200M  0 part /boot
├─sda2   8:2    0    12G  0 part [SWAP]
├─sda3   8:3    0    25G  0 part /
└─sda4   8:4    0  74.6G  0 part /home
sdb      8:16   0 931.5G  0 disk 
├─sdb1   8:17   0   499M  0 part 
├─sdb2   8:18   0   100M  0 part 
├─sdb3   8:19   0    16M  0 part 
└─sdb4   8:20   0 930.9G  0 part

Running "fdisk -l" gives me:

Disk /dev/sdb: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 47A5839B-C531-4BEE-A083-BD0C5CF4524A

Device       Start        End    Sectors   Size Type
/dev/sdb1     2048    1023999    1021952   499M Windows rec
/dev/sdb2  1024000    1228799     204800   100M EFI System
/dev/sdb3  1228800    1261567      32768    16M Microsoft r
/dev/sdb4  1261568 1953523711 1952262144 930.9G Microsoft b

Disk /dev/sda: 111.8 GiB, 120034123776 bytes, 234441648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x1c797ba1

Device     Boot    Start       End   Sectors  Size Id Type
/dev/sda1           2048    411647    409600  200M 83 Linux
/dev/sda2         411648  25577471  25165824   12G 83 Linux
/dev/sda3       25577472  78006271  52428800   25G 83 Linux
/dev/sda4       78006272 234441647 156435376 74.6G 83 Linux

Any help would be appreciated, thanks!

Best Answer

As described here, you need to do the following (The following must be done as root on your Arch OS):

As I can assume from your Output /dev/sdb2 seems to be your Windows-Bootloader so the First step will be:

$ mkdir /mnt/windows
$ mount /dev/sdb2 /mnt/windows
$ grub-probe --target=fs_uuid /mnt/windows/EFI/Microsoft/Boot/bootmgfw.efi

Copy the Output of the last Command to a File and proceed with this:

$ grub-probe --target=hints_string /mnt/windows/EFI/Microsoft/Boot/bootmgfw.efi

Also copy the output to the File. After that run the following to unmount the Partition

$ umount /mnt/windows
$ rmdir /mnt/windows

After that open the File /boot/grub/custom.cfg with your preferred editor and add the Following Lines:

if [ "${grub_platform}" == "efi" ]; then
    menuentry "Microsoft Windows Vista/7/8/8.1 UEFI/GPT" {
        insmod part_gpt
        insmod fat
        insmod search_fs_uuid
        insmod chain
        search --fs-uuid --set=root $hints_string $fs_uuid
        chainloader /EFI/Microsoft/Boot/bootmgfw.efi

Where $hints_string is the second Output and $fs_uuid is the first one.

At least run this to update your Grub:

$ grub-mkconfig -o /boot/grub/grub.cfg

After reboot your Grub should contain the Entry for Windows, for more information about how to configure your Grub see this Page

Related Question