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!
Наверняка почти у каждого пользователя ОС Linux и ОС Windows, а я имею в виду именно тех, у кого, в силу ряда причин, установлены обе системы, время от времени возникал вопрос: «А нельзя ли, черт возьми, придумать способ, с помощью которого можно было бы устанавливать эти системы в произвольном порядке? Без порчи настроек загрузчика?» Ведь если ставим сначала Windows а потом Linux всё хорошо — линуксовый загрузчик (например GRUB) обычно подхватывает bootmgr. Если ставить в обратном порядке то увы. Даже с использованием GPT + EFI. В случае с EFI нет опасности перезаписи MBR, зато таки есть один нюанс, который лично мне не нравится — установщик Windows в режиме EFI хоть и не перезаписывает сектора диска своим кодом, но зато переопределяет NVRAM, подсовывая туда путь к своему загрузчику. Так что функционал GBUB всё равно приходится восстанавливать. В настройках штатного установщика нет опций для кастомизации процесса установки загрузчика. А что если… не использовать стандартный установщик?! Ну, или почти не использовать…
И такой способ есть. И основан он на технологии установки Windows, которую мы имеем в её дистрибутивах начиная с «семерки». Способ работает для случая Windows версий 7/8/8.1/10, как в случае с MBR + BIOS системы, так в случае с EFI + GPT. Установить систему можно как в раздел HDD, так и на VHD. При этом функционал установщика нужен нам в общем-то для запуска программы настройки BCD-хранилища конфигурации загрузчика. Вместо установочного диска можно использовать загрузочный носитель на основе WinPE. Если бы утилитам bcdedit.exe и BootICE была *nix альтернатива, весь процесс развертывания системы можно было бы вообще выполнить в среде Linux.
Предположим у вас имеется компьютер, с установленным на HDD загрузчиком GRUB2 и свободным разделом, отформатированном в NTFS. Устанавливать будем Windows 7 Ultimate SP1. Для этого потребуются:
- Установочный диск с виндой
- Чистая флешка объемом >= 4 Gb
- Архиватор 7-zip соответствующей разрядности
- Утилита BootICE, желательна, но совершенно не обязательна, можно обойтись и bcdedit.exe, входящим в дистрибутив винды
1. Создаем загрузочную флешку
Дело в том, что семерка не хочет устанавливаться в EFI-режиме с DVD. Вот не хочет и всё. К тому же, на установочном носителе нам понадобятся дополнительные утилиты, которые туда надо поместить, а в случае с флешкой это несколько проще, чем в случае с DVD.
Монтируем установочный образ с виндой, допустим он лежит у нас в /home/$USER/install с именем win7-setup.iso
$ mkdir ~/iso
$ sudo mount -t udf ~/install/win7-setup.iso ~/iso
Вставляем флешку в USB-порт. Допустим, она получила имя устройства /dev/sdb. Выполним её разметку в формате MBR
$ sudo fdisk /dev/sdb
Создем на флешке один единственный раздел. После чего форматируем её в FAT
$ sudo mkfs.vfat /dev/sdb1
Копируем содержимое дистрибутива винды на флешку
$ mkdir /tmp/flash
$ sudo mount /dev/sdb1 /tmp/flash -o uid=1000,gid=100,fmask=113,dmask=002
$ cp -rv ~/iso/* /tmp/flash/
Скопируем конфиги EFI-загрузчика на уровень выше
$ cp -rv ~/tmp/flash/efi/microsoft/* ~/tmp/flash/efi/
Теперь нам нужен EFI-загрузчик винды. Его придется выцарапать из дистрибутива. Это легко сделать с помощью архиватора 7-zip, который имеется в репозитории extra/p7zip. Все содержимое дистрибутива винды сжато в образ wim-формата находится на установочном DVD в файле source/install.wim. Обычно этот образ имеет следующую структуру
В каталогах с именами в виде цифр 1-4 находятся разные редакции винды. Чтобы выбрать нужную надо посмотреть внутрь файла с именем [1].xml. Распакуем его в /tmp
$ cd /tmp
$ 7z e ~/iso/sources/install.wim [1].xml
и посмотрим с помощью какого-нибудь браузера, ибо в текстовом редакторе он выглядит ужасно, а специального редактора xml у меня в наличии не оказалось. Каждую редакцию винды описывают структурой вида
где нода EDITIONID указывает на редакцию. Параметр INDEX — как раз номер каталога, в котором валяется нужная редакция. Итак, мне нужна Ultimate, а это индекс 4. Соответсвенно выковыриваем загрузчик оттуда
$ 7z e ~/iso/sources/install.wim 4/Windows/Boot/EFI/bootmgfw.efi
Оки, теперь перенесем полученный файл на флешку
$ mv bootmgfwm.efi /tmp/flash/efi/boot/bootx64.efi
Порядок, теперь у нас в наличии загрузочная флешка для установки винды. Теперь добавим на неё необходимые для установки утилиты — виндозную версию архиватора 7-zip и утилиту BootICE. Архиватор качаем с официального сайта и распаковываем на флешку в каталог utils
$ mkdir -p /tmp/flash/utils/7-Zip/
$ cd /tmp/flash/utils/7-Zip/
$ 7z x ~/downloads/7z1602-x64.exe
Туда же помещаем и bootice
$ cp ~/install/BOOTICEx64.exe /tmp/flash/utils
Уф, всё, отмонтируем флешку
$ cd ~
$ sudo umount /tmp/flash/
Перезагружаемся. Если у вас система с EFI и съемные диски стоят в приоритете загрузки, то компьютер загрузится в установку винды автоматом. Если же появилось таки меню GRUB, ничего страшного, жмем «С» и в консоли набиваем команду exit. Вас вывалит в меню EFI, где выбираем загрузку с флешки. Если же ваша система с BIOS, то тут чуть сложнее, ибо мы не стали заморачиваться с настройкой MBR на флешке. Тогда в консоли GRUB даем команду ls — появится список всех дисков и разделов. Находим нашу флешку, она отобразится в виде (hdX, msdosY), где X, Y — номер диска и раздела соответственно. Теперь вбиваем в консоли команды
grub> set root=hdX,Y
grub> ntldr /bootmgr
grub> boot
Начнется загрузка установщика винды. Он то загрузится, но нам он и не нужен — мы всё будем делать руками. Чтобы стало понятно, что к чему, придется рассмотреть некоторую теорию
2. О развертывании Windows из WIM-образа и капризном нраве Sysprep
Начиная с семерки установка Windows заключается в следующих этапах
- Разметка диска в соответствии с архитектурой системы инициализации оборудования. Если BIOS — установщик размечает диск в MBR. При наличии активной EFI — разметка будет GPT.
- Распаковка образа install.wim в выбранный для установки раздел
- Установка загрузчика и перезагрузка
- Инициализация оборудования. Ребут
- Локализация, ввод ключа, окончание настройки системы
Это стандартный путь. У нас же диск уже размечен. И нам не нужна автоматическая установка загрузчика — мы поставим его вручную. Разметка диска должна удовлетворять следующим требованиям
- Если система с EFI на диске должен присутствовать FAT-раздел с типом 0xEF. Если у нас уже установлен линукс с EFI-загрузчиком, то таковой раздел уже имеется
- Если система с BIOS, то раздел, в котором располагается загрузчик, а это наш NTFS-раздел должен быть активным. Это очень важно! Почему, будет объяснено ниже.
Таким образом, перед распаковкой системы мы должны убедится в том, что перечисленные требования выполнены. После того, как мы распакуем все файл системы и установим загрузчик, система перезагрузиться. После перезагрузки запустится утилита Sysprep, среди прочего настраивающая оборудования и проверяющая конфигурацию системы. Так вот, если в режиме EFI Sysprep не найдет загрузчик и его конфигурацию в EFI-разделе по пути EFI/microsof/boot, а в системе с BIOS каталог Boot и bootmgr будут лежать в неактивном разделе, то Sysprep завершится с ошибкой sysprep generalize error, а в лог, расположенный по адресу WindowsPanthersysperr.log выплюнет что-то похожее на
2015-03-11 16:55:42, Error [0x0e00b3] TOOL Sysprep_Specialize_Bcd: There was an error opening the system store. Status=[0xC0000098]
2015-03-11 16:55:42, Error [0x0f0082] SYSPRP LaunchDll:Failure occurred while executing 'c:WindowsSystem32spbcd.dll,Sysprep_Specialize_Bcd', returned error code 1006
2015-03-11 16:55:42, Error [0x060435] IBS Callback_Specialize: An error occurred while either deciding if we need to specialize or while specializing; dwRet = 0x3ee
и никакие танцы с бубном нам уже не помогут. Винда требует, чтобы загручик лежал в загрузочном разделе и точка. В случае с BIOS просто делаем активным раздел NTFS в котором лежит винда и туда же кладем и загрузчик. Грузится будем всё равно с помощью GRUB, а ему все равно, какой раздел будет активным. В случае с EFI загрузчик придется положить рядом с GRUB в EFI-разделе.
3. Распаковка системы
Итак, определимся, куда мы хотим ставить винду. Можно поставить в NTFS-раздел, а можно и в VHD-диск. Это уж как вам хочется. Я буду показывать процесс на примере с виртуальной машиной EFI, имеющей следующую разметку
The protective MBR's 0xEE partition is oversized! Auto-repairing.
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): p
Disk /dev/loop1: 104857600 sectors, 50.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 0D217C93-6699-435A-9BBB-61DFAA6F30B7
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 104857566
Partitions will be aligned on 2048-sector boundaries
Total free space is 4029 sectors (2.0 MiB)
Number Start (sector) End (sector) Size Code Name
1 2048 206847 100.0 MiB EF00 EFI system partition
2 206848 104855551 49.9 GiB 0700 Basic data partition
На этом диске нет линукса, установлен только GRUB в раздел с EFI. Если мы ставим систему непосредственно в NTFS-раздел, то загружаемся с флешки, дожидаемся запуска программы установки и жмем Shift + F10, чтобы вызвать консоль. Запускаем утилиту diskpart и смотрим список подключенных томов
X:sources> diskpart
DISKPART> list vol
Видим, что флешка (объемом 8 Гб) подключена как диск C:, а раздел для установки вовсе не смонтирован. Непорядок. Делаем так
DISKPART> sel vol 3
DISKPART> remove
DISKPART> assign letter=E
DISKPART> sel vol 1
DISKPART> assign letter=C
DISKPART> list vol
DISKPART> sel vol 2
DISKPART> assign letter=F
Вот теперь порядок, диск на который будем ставить винду стал диском C:, флешка — диском E:, а EFI-раздел — диском F:
Если же мы хотим поставить систему на VHD, то делаем так
DISKPART> sel vol 3
DISKPART> remove
DISKPART> assign letter=E
DISKPART> sel vol 1
DISKPART> assign letter=G
DISKPART> exit
Для порядка создаем каталог с образами
X:sources> md G:vhd
X:sources> diskpart
Создаем виртуальный диск, создаем на нем разметку GPT и раздел NTFS и монтируем его к C:
DISKPART> create vdisk file="G:vhdwin7.vhd" maximum=25600 type=fixed
DISKPART> attach vdisk
DISKPART> clean
DISKPART> convert gpt
DISKPART> create part primary
DISKPART> format fs=ntfs quick
DISKPART> assign letter=C
EFI-раздел монтируем к F:
DISKPART> sel vol 2
DISKPART> assign letter=F
Получаем такую картину
Очень важно! Убеждаемся в том, что EFI-раздел отформатирован именно в FAT, а не в FAT32. Иначе Sysprep не простит нам этой ошибки. Если на компе уже есть линукс, то настройки будут верны.
Теперь распаковываем дистрибутив на диск C:
X:sources> E:
E:> utils7-Zip7zFM.exe
Откроется GUI архиватора 7-zip. В нем открываем каталог E:sources, находим там файл install.wim
Правой кнопкой на этом файле вызываем контектстное меню и переходим по 7-zip -> Открыть архив. Появится содержимое образа.
Лезем в папку 4 — там лежит Ultimate
Выделяем всё Ctrl + A и жмем кнопку «Извлечь». Появится окно, где нам предложат указать путь распаковки
Указываем корень диска C: и жмем ОК.
Ну и теперь, как говорится: «Откиньтесь на спинку кресла и…»
4. Установка и настройка загрузчика
Итак, после некоторого время ожидания распаковка окончена. И вот тут, вот в этом месте винда обчно делает бяку, а именно портит MBR или перенастраивает NVRAM. Но мы не дадим ей этого сделать — мы установим загрузчик вручную.
В случае с EFI, переходим на раздел EFI, смонтированный к F: и создаем необходимые пути и копируем файлы загрузчика
E:> F:
F:> mkdir EFImicrosoftboot
F:> xcopy C:WindowsBootEFI* F:EFImicrosoftboot /s /e
F:> mkdir EFImicrosoftbootFonts
F:> xcopy C:WindowsBootFonts* F:EFImicrosoftbootFonts /s /e
F:> copy C:WindowsSystem32configBCD-Template F:EFImicrosoftbootBCD
Отлично, загрузчик скопирован. Теперь настроим его
F:> E:utilsBOOTICEx64.exe
Открываем файл F:EFIMicrosoftBootBCD. В случае установки на раздел, его параметры задаются так
Если же мы устанавливали систему на VHD, то настройки будут такими
Важно! Имя вторичного загрузчика для EFI-системы winload.efi, для BIOS-системы — winload.exe.
В случае, если мы устанавливаем BIOS-систему установка загрузчика будет выглядеть так
F:> mkdir C:Boot
F:> xcopy C:WindowsBootPCAT* C:Boot /s /e
F:> mkdir C:BootFonts
F:> xcopy C:WindowsBootFonts* C:BootFonts /s /e
F:> copy C:Bootbootmgr C:bootmgr
F:> copy C:WindowsSystem32configBCD-Template C:BootBCD
Важно! Раздел, смонтированный к C: (там где размещен загрузчик) обязан быть активным! Убедитесь в этом перед перезагрузкой!
Настройку выполняем так же точно, используя BootICE.
Ну, вроде все. Закрываем все окна и идем в ребут. Флешку можно вытащить из компа.
5. Скрестим пальцы да вознесем молитвы тебе, о Великий и Ужасный Sysprep…!
GRUB у нас еще не настроен пункта для винды в меню нет. Как только появится меню GRUB жмем «C». В консоли набираем
grub> set root=hdX,Y
grub> chainloader /EFI/Microsoft/Boot/bootmgfw.efi
grub> boot
X, Y — соответственно диск и раздел, где лежит загрузчик. Это в случае EFI. В случае с BIOS делаем так
grub> set root=hdX,Y
grub> ntldr /bootmgr
grub> boot
X, Y — диск и раздел с NTFS. Там где распакована винда и лежит её загрузчик.
В режиме EFI вместо логотипа винды я увидел черный экран, так как не нашел в дистрибутиве билиотеки bootres.dll, которую надо поместить в папку EFIMictosoftBootResourses. В случае с BIOS всё в порядке — знакомая эмблема «семерки». А потом в обоих случаях увидим это
Это работает Sysprep. На 57% моргнет экран — настраивается видяха. И если мы все сделали верно, то надпись «Применение параметров системы» повисит довольно долго, потом система сообщит, что установка будет продолжена после перезагрузки. Если мы где-то напортачили с установкой загрузчика — неправильный EFI раздел или неактивный NTFS, то тогда будет ошибка Но мы молодцы и у нас все получится, и после очередной перезагрузки мы увидим это
а потом, наконец вот это
Дальше все как при обычной, штатной установке.
6. Настраиваем GRUB
Обратили внимание на то, что каждый раз мы грузим систему из консоли GRUB руками. Это очень хорошо — значит ни MBR ни NVRAM не перезаписаны коварным майкрософтом. Настало время грузится в арч и добавить в меню GRUB новый пункт
menuentry 'Windows 7 Ultimate SP1 (EFI)' {
set root=hdX,Y
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
в случае EFI. Или
menuentry 'Windows 7 Ultimate SP1' {
set root=hdX,Y
ntldr /bootmgr
}
в случае BIOS. Применяем настройки GRUB и перезагружаемся и видем систему в пункте меню загрузки
после выбора которого получаем загруженную Windows
Заключение
Упреждая гнев профессиональных win-админов, скажу сразу — я знаю о DISM. Именно информация об этой системе и привела меня к описанному решению. Цель была одна — выяснить сколько нужно возможностей собственно Windows для установки Windows.
Оказалось вот что — для установки Windows её среда необходима только для одного — настройки BCD-хранилища. Всё. Остальное можно сделать из среды любой другой операционной системы.
Если написать аналог bcdedit.exe под Linux, то установить Windows можно будет с линуксового Live-носителя.
- I have installed Windows 10
- I have installed Linux Mint Silvia and I have chosen a device for boot loader installation — sda.
- There is not Windows 10 in grub menu when the system starts
- I have booted via Linux Mint live USB.
- I Do step by step https://howtoubuntu.org/how-to-repair-restore-reinstall-grub-2-with-a-ubuntu-live-cd
- But it still no Windows 10 in grub menu
- I have booted via live windows 10 USB.
- With restoration tools, I have chosen the command line
- I have fixed Mbr by console command bootrec /FixMbr
- Ok, windows 10 is loading by there is no Grub.
- I have repeated steps 4 and 5
- There is no result
Also, I have tried to change grub config with this answer
https://askubuntu.com/questions/661947/add-windows-10-to-grub-os-list#answer-977251 — But in this case, There is Windows 10 — but when I chose — I will recursively going to grub
And with this answer
https://askubuntu.com/questions/661947/add-windows-10-to-grub-os-list#answer-890562
I have an error message when chose Windows 10 — There is no bootmgr directory
Thanks @Kinnectus for help
Also, I have tried
sudo os-prober
And getting
/dev/sda1:FreeDOS:FreeDOS:chain
/dev/sda2:FreeDOS:FreeDOS1:chain
And then I have tried
sudo update-grub
And getting
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.10.0-38-generic
Found initrd image: /boot/initrd.img-4.10.0-38-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
Found FreeDOS on /dev/sda1
Found FreeDOS on /dev/sda2
done
Unfortunately — there is not Windows 10 in grub menu
Also, I have fdisk output.
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 16779263 16777216 8G c W95 FAT32 (LBA)
/dev/sda2 * 16779264 33556479 16777216 8G c W95 FAT32 (LBA)
/dev/sda3 33556480 770219115 736662636 351,3G 7 HPFS/NTFS/exFAT
/dev/sda4 770220030 976771071 206551042 98,5G 5 Extended
/dev/sda5 770220032 976771071 206551040 98,5G 83 Linux
Partition 4 does not start on physical sector boundary.
There is an issue.
Maybe the problem is with this issue?
Please, help me, I am stucking with this a whole day.
I completely have no idea, what am I doing wrong.
Многие новички и опытные пользователи 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 рекомендуется отключить эту технологию.
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .
Об авторе
Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.
It looks like you’ve followed an old guide that expects Windows to use MBR partitioning.
The «invalid signature» error suggests Secure Boot is enabled. When Secure Boot is enabled, all bootloaders must be signed with a private key, and a matching public key must be included in the Secure Boot variables in the firmware NVRAM. GRUB is dutifully reading the first sector of the partition you’ve specified, but since it does not contain the appropriate Secure Boot signature, the firmware refuses to execute it.
Secure Boot requires native UEFI-style boot as a prerequisite. You may be able to disable Secure Boot on your system, but since GRUB already starts for you, there is probably no need to do that.
Your insmod part_gpt
suggest you expect the disk to have a GPT-style partitioning which usually goes together with UEFI boot style, but on the other hand, set root=(hd0,msdos2)
expects a MBR partition.
On my Debian system with GPT partitioning, the set root
line reads: set root='hd0,gpt1'
. If your system uses GPT partitioning, use the gptN
partition identifiers instead of msdosN
.
Also chainloader +1
tells GRUB to read the boot block from the first block of the partition; in UEFI native boot, there is no such thing. To boot Windows in UEFI mode, the set root
line should point to the EFI System Partition that contains the Windows bootloader, and the chainloader line should be chainloader /EFI/Microsoft/Boot/bootmgfw.efi
.
It looks like you’ve followed an old guide that expects Windows to use MBR partitioning.
The «invalid signature» error suggests Secure Boot is enabled. When Secure Boot is enabled, all bootloaders must be signed with a private key, and a matching public key must be included in the Secure Boot variables in the firmware NVRAM. GRUB is dutifully reading the first sector of the partition you’ve specified, but since it does not contain the appropriate Secure Boot signature, the firmware refuses to execute it.
Secure Boot requires native UEFI-style boot as a prerequisite. You may be able to disable Secure Boot on your system, but since GRUB already starts for you, there is probably no need to do that.
Your insmod part_gpt
suggest you expect the disk to have a GPT-style partitioning which usually goes together with UEFI boot style, but on the other hand, set root=(hd0,msdos2)
expects a MBR partition.
On my Debian system with GPT partitioning, the set root
line reads: set root='hd0,gpt1'
. If your system uses GPT partitioning, use the gptN
partition identifiers instead of msdosN
.
Also chainloader +1
tells GRUB to read the boot block from the first block of the partition; in UEFI native boot, there is no such thing. To boot Windows in UEFI mode, the set root
line should point to the EFI System Partition that contains the Windows bootloader, and the chainloader line should be chainloader /EFI/Microsoft/Boot/bootmgfw.efi
.
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,6227 gold badges33 silver badges47 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,5612 gold badges22 silver badges40 bronze badges
answered Apr 15, 2019 at 6:33
1
У меня есть два жестких диска в ноутбуке. На одном установлена 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:WINDOWSsystem32>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