Windows 10 will, for the most part, be added to grub boot menu by the os-prober automajically.
For my specific setup I wanted to completely hide grub menu and automatically boot windows unless a hotkey was pressed to boot Ubuntu. So in my specific case os-prober isn’t an option because the most important step in hiding the grub menu, which most answers I found neglect to mention, is to set the disable os-prober flag or the menu WILL be shown until os-prober completes.
It took considerably longer than I had anticipated to get right because there are so many partial answers out there but most are version dependant and can lead you astray. I spent a lot of time trying write my own grub menu entry trying use grub commands that didn’t exist like ntdlr. Another caveat is that the chainloader functions on my grub try to boot bios not efi and will not work.(Im sure I was doing something wrong?)
In the end the solution was actually simple as the scripts that make your /boot/grub/grub.cfg do most of the work for you in finding UUIDS for your boot partitions. So you can skip the fdisk and blkid steps most people mention.
So step 1 is to make sure /boot/grub/grub.cfg is current using update-grub to make .cfg file. In terminal
sudo update-grub
Step 2 is to add custom menu entries in /etc/grub.d/40_custom. Don’t waste time trying to write your own simply open /boot/grub/grub.cfg search «menuentry» and copy the automatically generated entries.
The first in the list will be ubuntu mine looks like
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-9e66eed6-e672-49ff-a07c-afdc00809148' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 9e66eed6-e672-49ff-a07c-afdc00809148
else
search --no-floppy --fs-uuid --set=root 9e66eed6-e672-49ff-a07c-afdc00809148
fi
linux /boot/vmlinuz-5.4.0-39-generic root=UUID=9e66eed6-e672-49ff-a07c-afdc00809148 ro quiet splash $vt_handoff
initrd /boot/initrd.img-5.4.0-39-generic
}
Windows will be similar. Copy both to /etc/grub.d/40_custom. The only change I made for Ubuntu is to add the —hotkey=key flag which will make grub boot the os associated with that hotkey.
menuentry 'Ubuntu2' --class ubuntu --class gnu-linux --class gnu --class os --hotkey=u $menuentry_id_option 'gnulinux-simple-9e66eed6-e672-49ff-a07c-afdc00809148' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 9e66eed6-e672-49ff-a07c-afdc00809148
else
search --no-floppy --fs-uuid --set=root 9e66eed6-e672-49ff-a07c-afdc00809148
fi
linux /boot/vmlinuz-5.4.0-39-generic root=UUID=9e66eed6-e672-49ff-a07c-afdc00809148 ro quiet splash $vt_handoff
initrd /boot/initrd.img-5.4.0-39-generic
}
I use —hotkey=u here to set Ubuntu boot hotkey to u.
Then I tweaked the Windows entry, replacing $menuentry_id_option withe the grub —id flag.
menuentry "Windows 10" --class windows --class os --id windows-custom {
insmod part_gpt
insmod fat
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 0EAE-C882
else
search --no-floppy --fs-uuid --set=root 0EAE-C882
fi
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
I used —id windows-custom. Save chages to /etc/grub.d/40_custom.
Finally open /etc/default/grub and add
GRUB_DISABLE_OS_PROBER=true
change GRUB_DEFAULT=0
to GRUB_DEFAULT=windows-custom
and change GRUB_TIMEOUT=10
to your choice of timings I use 0.5 just to give myself a little extra time to hit u to boot Ubuntu after POST.
Hopefully this saves someone a bit of headache, cheers!
На ssd стояла windows 10.
Разбил hdd под установку linux mint, но после его установки загружалась только windows 10. Решил это чистой установкой Linux, установщик разбил диск как ему надо. Как итог linux грузится, windows 10 — нет, и кроме того не могу войти в настройки bios: меню загрузки там пустое, bios setup не открывается.
В меню загрузки grub есть только linux.
Есть ли способ добавить windows в меню загрузчика grub, как убедиться, что она сможет запуститься, и это не убьет работающий Linux?
Grub выглядит так:
По команде lsblk результат такой:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 465,8G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
└─sda2 8:2 0 465,3G 0 part /
sdb 8:16 0 118G 0 disk
├─sdb1 8:17 0 117,2G 0 part
└─sdb2 8:18 0 790M 0 part
Для диска, на котором лежит windows: blkid /dev/sdb1
Device Boot Start End Sectors Size Id Type
/dev/sdb1 * 2048 245839254 245837207 117,2G 7 HPFS/NTFS/exFAT
/dev/sdb2 245839872 247457791 1617920 790M 27 Hidden NTFS WinRE
blkid /dev/sdb1. Странный лейбл раздела с windows 10. Критично ли это?
/dev/sdb1: LABEL="M-PM-^TM-PM-8M-QM-^AM-PM-:" UUID="2EE6EE17E6EDDF59" TYPE="ntfs" PARTUUID="d7209484-01"
upd
Добавил руками пункт загрузки в grub как написано в статье.
menuentry "Windows 10" {
insmod ntfs
set root='(hd1,1)'
search --no-floppy --fs-uuid --set 2EE6EE17E6EDDF59
chainloader +1
}
При выборе — error: invalid EFI file path.
ps. Если бы была возможность зайти в bios, с удовольствием бы снес все и накатил заново винду (или восстановил с загрузочной флешки). С проблемой столкнулся не впервые, но в прошлый раз пришлось прибегнуть к прошивке bios на программаторе. Хотелось бы обойтись без такой хирургии, тк не желательно отдавать ноут на несколько дней.
У меня есть два жестких диска в ноутбуке. На одном установлена 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»
Следующая команда это подтверждает (подробнее):
$ [ -d /sys/firmware/efi ] && echo UEFI || echo BIOS
UEFI
Я не уверен, что Windows 10 у меня установлена в UEFI режиме. Возможно GRUB может загружать только системы установленные в том же режиме, в котором он сам запущен.
Да, действительно Windows работает в устаревшем режиме.
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. И нужно переустанавливать одну из ОС. Или как-то по другому переключаться.
—
- EFI Partition vs /boot partition
- ubuntu appears in BIOS menu (UEFI)
- https://wiki.debian.org/GrubEFIReinstall
- Add Windows 10 to GRUB OS list
- Trying to dual boot Ubuntu 14.10 with Windows 10, last one not detected
- https://wiki.debian.org/DualBoot/Windows10
- Windows installed in UEFI-GPT Mode menu entry
- Ошибка при загрузки второй ОС через GRUB с Ubuntu 14.04.
- Installing Ubuntu on a Pre-Installed Windows 10 with UEFI
Многие новички и опытные пользователи Linux держат также установленной на своем компьютере операционную систему Windows, например, последней, десятой версии. Новичкам это нужно чтобы иметь запасную операционную систему, к которой они смогут вернуться, если их Linux сломается. А для опытных пользователей важно программное обеспечение, которое не поддерживается ни в Linux, ни даже с помощью эмулятора Wine, а таких программ достаточно много.
Но временами случается такая ситуация, что загрузчик Grub не распознает установленную Windows и не отображает ее в списке систем для загрузки. В этой статье мы рассмотрим почему возникает ошибка grub не видит Windows 10 и как ее решить.
Причин такой ошибки может быть несколько, начиная от того, что система установлена на другом жестком диске, и заканчивая неизвестными глюками пакета os-prober, который и занимается определением операционных систем в Linux. Также, если у вас есть несколько версий Windows на компьютере, то программа может видеть только одну из них.
Сначала можно попытаться сделать наш с Windows раздел более видимым для программы. Для этого примонтируйте его в какую-либо папку. Например, в /mnt/:
sudo mount -t ntfs-3g -o ro /dev/sda1
Я предполагаю, что система Windows установлена на разделе, который определяется в Linux, как /dev/sda1. Дальше запустите утилиту os-prober:
sudo os-prober
Если программа обнаружит Windows, то вам останется обновить конфигурацию загрузчика Grub:
sudo update-grub
Или:
sudo grub2-mkconfig -o /boot/grub/grub.cfg
Если же этот способ не сработает, а он, скорее всего, не сработает, то вам останется только вручную добавить пункт меню для Windows. Это не самое простое, но зато эффективное решение. Сначала нам нужно узнать UUID раздела диска, на который установлена Windows, например, /dev/sda1:
blkid /dev/sda1
Затем откройте файл /etc/grub.d/40_custom и добавьте туда такой код:
menuentry "Windows 10" {
insmod ntfs
set root='(hd0,1)'
search --no-floppy --fs-uuid --set B4A6AEB7A6AE7A0E
chainloader +1
}
Если кратко, то здесь мы устанавливаем в качестве корня первый раздел первого диска, а затем указываем загрузчику, что нужно найти раздел с нужным нам UUID. Затем передаем управление загрузчику на этом разделе с помощью chainloader. Дальше осталось обновить конфигурацию Grub:
sudo update-grub
Мы использовали такой метод потому что теперь настройка не собьется после обновления ядра или другого процесса, инициализирующего обновление конфигурации. Потому что если бы мы добавили эти строки в /boot/grub/grub.cfg, то они были бы перезаписаны если не при первом, то при одном из следующих обновлений системы.
Когда конфигурация обновлена вы можете перезагрузить компьютер и загружать Windows с помощью нового пункта. Таким образом, можно добавить несколько пунктов, только для разных разделов нужно указывать их UUID.
Выводы
В этой небольшой статье мы разобрали что делать когда у вас возникнет ошибка grub не видит windows 10 и какими способами ее можно исправить. На самом деле решение очень простое, если вы не используете систему с UEFI. В варианте с EFI загрузка Windows управляется не Grub, а загрузчиком UEFI, но при использовании Linux рекомендуется отключить эту технологию.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Об авторе
Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.
I just installed Arch Linux and with GRUB and want to add my windows 10 with EFI partition to grub.
Now I have Arch installed on the hard drive /dev/sdc/
with a EFI system on /dev/sdc1
. On an other hard drive I have Windows 10 installed where the efi drive is /dev/sda1
.
I tried to follow the arch wiki but could not find out were to get the EFI system partition for the command esp/EFI/Microsoft/Boot/bootmgfw.efi
. Do I have to mount the windows 10 drive if yes where should I mount it to?
asked Mar 19, 2018 at 21:00
Get the UUID with: sudo grub-probe -t fs_uuid -d /dev/sda1
and then add an entry for Windows at the end of your grub.cfg:
menuentry "Windows 10" {
insmod part_gpt
insmod fat
insmod search_fs_uuid
insmod chain
search --fs-uuid --no-floppy --set=root XXXXXXXXX
chainloader (${root})/efi/Microsoft/Boot/bootmgfw.efi
}
Prvt_Yadav
5,7827 gold badges32 silver badges48 bronze badges
answered May 20, 2018 at 7:31
Mark RoiMark Roi
1641 silver badge11 bronze badges
Normally grub-mkconfig
should auto-detect dual booted operating systems (via the os-prober
utility). This, however, requires you to have the Windows drive mounted. For example, try this:
$ mkdir -p /mnt/windows
$ mount /dev/sda1 /mnt/windows
$ grub-mkconfig -o /boot/grub/grub.cfg
It should now automatically detect your Windows installation and you should be able to boot into Windows.
Another important thing to note regarding the previous answer to this question: you should never manually edit /boot/grub/grub.cfg
, since it can easily be overwritten by tools like grub-mkconfig
(and the syntax isn’t really all that intuitive either way).
fra-san
9,9512 gold badges21 silver badges42 bronze badges
answered Apr 15, 2019 at 6:33
1
You must log in to answer this question.
Not the answer you’re looking for? Browse other questions tagged
.
Not the answer you’re looking for? Browse other questions tagged
.