Как добавить Windows 10 в GRUB

У меня есть два жестких диска в ноутбуке. На одном установлена Windows 10, а на другом Ubuntu 16. Windows 10 устанавливалась как обновление с Windows 7. Windows 7 была предустановлена на заводе. Ubuntu 16 ставилась на чистый жесткий диск.

Для начала посмотрим, что у нас есть:

$ sudo lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL
NAME                    FSTYPE        SIZE MOUNTPOINT LABEL
sda                                 465,8G            
├─sda1                  vfat         19,5G            RECOVERY
├─sda2                  ntfs        445,8G            Windows 10
└─sda3                  ntfs          450M            
sdb                                 232,9G            
├─sdb1                  vfat          512M /boot/efi  
├─sdb2                  ext2          488M /boot      
└─sdb3                  crypto_LUKS 231,9G            
  └─sda3_crypt          LVM2_member 231,9G            
    ├─ubuntu--vg-root   ext4          224G /          
    └─ubuntu--vg-swap_1 swap            8G            
      └─cryptswap1      swap            8G [SWAP]     
sr0                                  1024M            

Тут мы видим два раздела: sdb2 (/boot) и sdb1 (/boot/efi):

$ sudo tree /boot/
/boot/
├── abi-4.4.0-21-generic
├── abi-4.4.0-34-generic
├── config-4.4.0-21-generic
├── config-4.4.0-34-generic
├── efi
│   └── EFI
│       └── ubuntu
│           ├── fw
│           ├── fwupx64.efi
│           ├── grub.cfg
│           ├── grubx64.efi
│           ├── MokManager.efi
│           └── shimx64.efi
├── grub
│   ├── fonts
│   │   └── unicode.pf2
│   ├── grub.cfg
│   ├── grubenv
│   ├── locale
│   │   ├── en_AU.mo
│   │   ├── en_CA.mo
│   │   ├── en_GB.mo
│   │   └── ru.mo
│   ├── unicode.pf2
│   └── x86_64-efi
├── initrd.img-4.4.0-21-generic
├── initrd.img-4.4.0-34-generic
├── lost+found
├── memtest86+.bin
├── memtest86+.elf
├── memtest86+_multiboot.bin
├── System.map-4.4.0-21-generic
├── System.map-4.4.0-34-generic
├── vmlinuz-4.4.0-21-generic
├── vmlinuz-4.4.0-34-generic
└── vmlinuz-4.4.0-34-generic.efi.signed

EFI предназначен для замены BIOS. /boot/efi - это системный загрузочный раздел создаваемый, когда мат. плата ноутбука использует UEFI вместо BIOS (подробнее).

Также я воспользовался скриптом Boot Info Script. Вот его результаты:

                  Boot Info Script 0.61      [1 April 2012]


============================= Boot Info Summary: ===============================

 => Windows is installed in the MBR of /dev/sda.
 => No boot loader is installed in the MBR of /dev/sdb.

sda1: __________________________________________________________________________

    File system:       vfat
    Boot sector type:  Windows 7: FAT32
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  
    Boot files:        /bootmgr /boot/bcd

sda2: __________________________________________________________________________

    File system:       ntfs
    Boot sector type:  Windows Vista/7: NTFS
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  
    Boot files:        /bootmgr /Boot/BCD /Windows/System32/winload.exe

sda3: __________________________________________________________________________

    File system:       ntfs
    Boot sector type:  Windows Vista/7: NTFS
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  
    Boot files:        

sdb1: __________________________________________________________________________

    File system:       vfat
    Boot sector type:  FAT32
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  
    Boot files:        

sdb2: __________________________________________________________________________

    File system:       ext2
    Boot sector type:  -
    Boot sector info: 
    Operating System:  
    Boot files:        /grub/grub.cfg

sdb3: __________________________________________________________________________

    File system:       crypto_LUKS
    Boot sector type:  Unknown
    Boot sector info: 

ubuntu-vg-root': _______________________________________________________________

    File system:       
    Boot sector type:  Unknown
    Boot sector info: 
    Mounting failed:   mount: unknown filesystem type ''

ubuntu-vg-swap_1': _____________________________________________________________

    File system:       
    Boot sector type:  Unknown
    Boot sector info: 
    Mounting failed:   mount: unknown filesystem type ''
mount: unknown filesystem type ''

Из этого становится ясно, что Windows установлена в MBR на /dev/sda. А /grub/grub.cfg расположен на sdb2.

Узнаем UUID от раздела с меткой "Windows 10":

$ sudo blkid /dev/sda2
/dev/sda2: LABEL="Windows 10" UUID="8684C04C84C04103" TYPE="ntfs" PARTUUID="76692ca8-02"

Путем экспериментов я выяснил, что в скрипте /etc/grub.d/40_custom срабатывает следующее условие:

if [ "${grub_platform}" == "efi" ]; then
fi

И не срабатывает следующее условие:

if [ "${grub_platform}" == "pc" ]; then
fi

Также в ходе одного из экспериментов я получил ошибку:
"/boot/grub/x86_64-efi/ntldr.mod not found"

Из этого можно сделать вывод, что у меня UEFI загруза Ubuntu

Следующая команда это подтверждает (подробнее):

$ [ -d /sys/firmware/efi ] && echo UEFI || echo BIOS
UEFI

Я не уверен, что Windows 10 у меня установлена в UEFI режиме. Возможно GRUB может загружать только системы установленные в том же режиме, в котором он сам запущен.

Да, действительно Windows работает в устаревшем режиме.

MSINFO32

UEFI - это интерфейс между операционной системой и микропрограммами, управляющими низкоуровневыми функциями оборудования. Получается Ubuntu у меня работает с новым UEFI, а Windows с legacy BIOS.

Установим новую загрузочную конфигурацию на диск C: из под Windows:

C:\WINDOWS\system32>bcdboot C:\Windows /s C: /f uefi
Файлы загрузки успешно созданы.

Я пробовал добавить в файл /etc/grub.d/40_custom следующую настройку (подробнее), но дальше логотипа Windows 10 загрузка не идет:

menuentry "Windows 10 (BCD-UEFI configuration on system drive /dev/sda2)" --class windows --class os {
    insmod part_msdos
    insmod ntfs
    insmod search_fs_uuid
    insmod chain

    set root='hd0,msdos2'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos2 --hint-efi=hd0,msdos2 --hint-baremetal=ahci0,msdos2  8684C04C84C04103
    else
      search --no-floppy --fs-uuid --set=root 8684C04C84C04103
    fi

    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

Вот здесь пишут, что нельзя мешать режимы Windows in BIOS/CSM/legacy mode и Ubuntu in EFI/UEFI mode. И нужно переустанавливать одну из ОС. Или как-то по другому переключаться.


--