В этой статье мы разберемся, как восстановить загрузчик Windows 10 или 11 на современном компьютере, на котором используется UEFI интерфейс вместо классического BIOS и таблица разделов диска GPT (вместо MBR). Повреждение загрузчика Windows может быть вызвано установкой второй ОС (Dual Boot — конфигурация), повреждением файловой систему, некорректным восстановлении Windows после сбоя, удалением скрытых разделов, вирусом-вымогателем и рядом других причин.
Данная статья содержит подробную пошаговую процедуру восстановления поврежденного или удаленного загрузчика ОС в Windows 11/10/8.1 и Windows Server 2022/2019/2016/2012R2 на компьютерах, которые работают в нативном (не legacy) режиме UEFI. Инструкцию можно использовать как для восстановления бинарных файлов загрузчика Windows, так и конфигурационного файла загрузчика EFIMicrosoftBootBCD (в случаях, когда Windows не загружается из-за отсутствия или повреждения файла конфигурацией загрузка BCD.
Содержание:
- Не загружается Windows: Boot configuration data is missing EFIMicrosoftBootBCD
- Автоматическое восстановление загрузчика Windows
- Ручное восстановление загрузчика Windows с помощью BCDBoot
Не загружается Windows: Boot configuration data is missing EFIMicrosoftBootBCD
UEFI компьютер с Windows, установленной в наивном режиме, не сможет загрузиться при повреждении EFI загрузчика Windows. При попытке загрузиться с диска с повреждённым или отсутствующим EFI загрузчиком появится BSOD (синий экран смерти) с ошибкой:
The boot configuration data for your PC is missing or contains errors. File :EFIMicrosoftBootBCD Error code: 0xc000000f
или
Error code: 0xc000014c
В русской версии Windows ошибка может быть такая:
Ваш компьютер нуждается в ремонте Данные конфигурации загрузки для вашего ПК отсутствуют или содержат ошибки Файл:EFIMicrosoftBootBCD Код ошибки: 0xc000000f
Эта ошибка говорит о повреждении или даже полном удалении конфигурации загрузчика Windows — Boot Configuration Data (BCD). Если вы попытаетесь восстановить загрузчик на UEFI компьютере с помощью утилиты
bcdedit
, вы получите такую ошибку:
The boot configuration data store could not be found. The requested system device cannot be found.
Дело в том, что если Windows 10/11 установлена в нативном режиме UEFI на GPT диск, то EFI загрузчик Windows (Windows Boot Manager) хранит программу управления загрузкой и конфигурацию BCD на отдельном скрытом разделе EFI (размером 100 мб с файловой системой FAT32). Утилита bcdedit не видит этот EFI раздел, и соответственно не может управлять конфигурацией загрузчика на нем.
Если при загрузке Windows появляется только черный экран с надписью “Operating System not found”, скорее всего у вас полностью удален загрузчик Windows. Следуйте инструкции по ссылке.
Автоматическое восстановление загрузчика Windows
Процедура автоматического восстановления загрузчика, зашитая в среду восстановления Windows (WinRe), как правило, в таких случаях бессильна. Но попробовать все-же стоит:
- Загрузитесь с диска загрузочного диска, диска восстановления или установочной флешки с Windows 10 или 11;
- На экране установки нажмите кнопку Восстановление системы;
- Затем выберите пункт Поиск и устранение неисправностей -> Восстановление при загрузке и выберите ОС, загрузчик которой нужно попытаться восстановить;
- Но скорее всего результат будет отрицательный: Восстановление при загрузке не удалось восстановить компьютер
Ручное восстановление загрузчика Windows с помощью BCDBoot
Перейдем к процедуре ручного восстановления EFI загрузчика Windows на UEFI компьютере.
Для восстановления конфигурации загрузчика (BCD), вам нужно загрузить компьютер с оригинального установочного диска с Windows (диска восстановления или специально подготовленной установочной USB флешки с Windows ). После загрузки в среде восстановления нужно открыть окно командной строки: выберите Восстановление системы -> Диагностика -> Командная строка (System Restore -> Troubleshoot -> Command Prompt).
Командную строку также можно запустить, если у вас под рукой есть только установочный диск с Windows. Для этого достаточно на самом первом этапе установки Windows (при выборе языка и раскладки клавиатуры) нажать комбинацию клавиш Shift+F10 (или Shift+Fn+F10 на некоторых моделях ноутбуков).
В открывшейся командной строке выполните запустите утилиту управления дисками, набрав команду:
diskpart
Выведите список дисков в системе:
list disk
На этом этапе очень важно определить тип таблицы разделов на диске, на котором установлена Windows: MBR или GPT. Дело в том, что EFI загрузчик используется только на дисках с GPT разметкой.
Если у диска в столбце Gpt указана звездочка (
*
), тогда на диске используется таблица разделов GPT, если нет – MBR.
Если с помощью diskpart вы определили, что на вашем диске используется GPT разметка, следуйте дальнейшим шагам инструкции по восстановлению загрузчика.
Если у вас разметка MBR, тогда данная инструкция не применима к вашему компьютеру. Скорее всего у вас компьютер с BIOS, или в настройках UEFI включен режим совместимости Legacy/Compatibility Support Module/CSM.
На MBR дисках загрузчик хранится на отдельном разделе System Reserved, а не на EFI разделе (ни в коем случае не конвертируйте таблицу разделов MBR в GPT, пока не исправите загрузчик!!) Используйте другую инструкцию по восстановлению BCD загрузчика на MBR (Master Boot Record) диске.
Выберите диск, на котором установлена ваша Windows (если жесткий диск в системе один, его индекс должен быть равен 0):
sel disk 0
Выведите список томов и разделов в системе:
list partition
list volume
В нашем примере видно, что загрузочный раздел EFI имеет индекс Partition2 (он же Volume 5 с меткой Hidden). Проще всего определить EFI размер по файловой системе FAT32, размеру 100 Мб (это стандартный минимальный размер для Windows компьютеров, в редких случая размер раздела может быть). Чаще всего для него используется метка — System EFI или ESP/ EFI System Partion).
В нашем примере основной раздел, на который установлена Windows, имеет индекс volume 2, отформатирован в файловая система NTFS и ему назначена буква C:.
В вашем случае назначенная буква диске может отличаться. Это зависит, как вы загрузили свой компьютер в среде WinPE. Проще всего определить его по размеру. Если вы не уверены, нужно проверить что на этом диске есть каталог Windows. Выйдите из утилиты diskpart (команда exit) и выполните команду:
dir C:
Убедитесь, что на этом диске есть каталоги
Windows
,
Program Files
,
Users
и прочие.
Если этих каталогов нет, значит вашему диску с Windows назначена другая буква диска. Проверьте содержимоет дисков с другими буквами.
Запомните букву диска, назначенную разделу с Windows, чуть ниже мы будем использовать ее в качестве одного из аргументов команды bcdboot.
В таблице также обязательно должен быть раздел MSR (Microsoft System Reserved) размером 16 мб в Windows 10/11 (или 128 Мб в Windows 8.1).
Назначьте скрытому EFI разделу произвольную букву диска (например, M:):
select volume 5
assign letter M:
Должна появится строка, свидетельствующая об успешном назначении буквы диска разделу EFI:
DiskPart successfully assigned the drive letter or mount point.
Завершите работу с diskpart:
exit
Перейдите в каталог с загрузчиком на скрытом разделе:
cd /d m:efimicrosoftboot
В данном случае M: это буква диска, присвоенная разделу EFI чуть выше. Если каталог EFIMicrosoftBoot отсутствует
The system cannot find the path specified
), попробуйте следующие команды:
cd /d M:Boot
или
cd /d M:ESDWindowsEFIMicrosoftBoot
На этом этапе многие рекомендуют выполнить следующие команды, которые должны перезаписать загрузочную запись раздела, найти установленные Windows и добавить их в BCD:
bootrec /fixboot
bootrec /scanos
bootrec /rebuildbcd
или даже:
bootrec /FixMbr
(восстановление MBR записи для GPT диска выглядит странным)
Все эти команды применимы только для дисков с MBR. Если ваш компьютер загружается в UEFI режиме, то на нем обязательно используется таблица разделов GPT (как раз наш случай). Поэтому при запуске команд
bootrec
вы увидите ошибку:
access is denied
Для исправления загрузочных записей на EFI разделе нужно использовать утилиту
BCDBoot
, а не bootrec.
Утилита BCDBoot позволяет восстановить файлы загрузчика на EFI разделе, скопировав их системного каталога на разделе с Windows. Конфигурация загрузчика BCD пересоздается с помощью шаблона %WINDIR%System32ConfigBCD-Template.
С помощью команды
attrib
снимите атрибуты скрытый, read-only и системный с файла BCD:
attrib BCD -s -h -r
Удалите текущий файл с конфигурацией BCD, переименовав его (так вы сохраните старую конфигурацию в качестве резервной копии):
ren BCD BCD.bak
С помощью утилиты bcdboot.exe нужно скопировать из системного каталога критические файлы среды загрузки UEFI в загрузочный EFI раздел и пересоздать конфигурацию загрузчика в хранилище BCD:
bcdboot C:Windows /l en-us /s M: /f ALL
где,
- C:Windows – путь к корневому системному каталогу Windows на диске (это ваш диск, на который была установлена ваша Windows, мы узнали его ранее с помощью команды diskpart);
- /f ALL – означает, что необходимо скопировать файлы среды загрузки Windows, включая файлы для компьютеров с UEFI и BIOS (теоретическая возможность загружаться на EFI и BIOS системах). Чтобы скопировать только EFI загрузчик, используйте команду /f UEFI;
- /l en-us — определяет языковой стандарт, который используется при инициализации хранилища BCD. По умолчанию используется en-US — английский язык (США);
- /s M: — скопировать файлы EFI загрузчика на указанный раздел;
- /с – эта новая опция BCDBoot в Windows 10, которая позволяет перезатереть имеющиеся загрузочные записи при создании нового хранилища (в том числе debugsettings). Используйте этот параметр, чтобы игнорировать старые настройки и создать полностью чистую конфигурацию BCD загрузчика;
- /v – используется для включения режима вывода подробной информации BCDBoot..
Теперь, если выполнить команду bcdedit, вы увидите следующую картину:
В секции диспетчера загрузки Windows (Windows Boot Manager) должна появится запись, указывающая на полный путь к файлу управления загрузкой UEFI. В этом примере он находится на разделе 2 (
partition=DeviceHarddiskVolume2
), путь
EFIMICROSOFTBOOTBOOTMGFW.EFI
.
Windows Boot Manager -------------------- identifier {bootmgr} device partition=DeviceHarddiskVolume2 path EFIMicrosoftBootbootmgfw.efi description Windows Boot Manager locale en-US inherit {globalsettings} bootshutdowndisabled Yes default {CURRENT} resumeobject {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} displayorder {default} toolsdisplayorder {memdiag} timeout 30 Windows Boot Loader ------------------- identifier {current} device partition=C: path Windowssystem32winload.efi description Windows Server 10 locale en-US inherit {bootloadersettings} recoverysequence {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} recoveryenabled Yes isolatedcontext Yes allowedinmemorysettings 0x15000075 osdevice partition=C: systemroot Windows resumeobject {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
В секции Windows Boot Manager должен быть указан путь к EFI разделу (
=DeviceHarddiskVolume2
), путь к файлу управления загрузкой (bootmgfw.efi). В секции Windows Boot Loader указан раздел Windows и путь к EFI загрузчику Windows (
Windowssystem32winload.efi
). При включении компьютер передаст управление диспетчеру загрузки EFI, который запустит загрузчик Windows.
Возможные ошибки:
Перезагрузите компьютер, отключите загрузочный диск. Если вы все сделали правильно, в выборе устройств загрузки должен появиться пункт Windows Boot Manager в котором можно выбрать загрузку нужной операционной системы. Ваш EFI загрузчик и конфигурация BCD успешно восстановлены!
В некоторых случаях после восстановления BCD загрузчика, при загрузке Windows появляется ошибка
BAD SYSTEM CONFIG INFO
. Чтобы исправить ошибку:
Убедитесь, что вы не вносили недавно изменения в настройки UEFI
Загрузитесь с установочной/загрузочной флешки и измените конфигурацию загрузчика командами:
-
bcdedit /deletevalue {default} numproc
-
bcdedit /deletevalue {default} truncatememory
#1 2022-02-13 18:00:28
- mohammadreza99a
- Member
- Registered: 2022-02-13
- Posts: 10
Grub does not detect Windows UEFI but efibootmgr finds it
This problem is getting kind of repetitive but I couldn’t actually find a solution to my specific problem. I have installed Arch along side Windows and I have made a FAT32 partition which host Grub and Windows boot loader. The problem is that when I run efibootmgr, the Windows shows up but when I run os-prober, there is nothing and hence my grub can’t detect Windows boot loader. I can boot into Windows only if I put my BIOS priority to Windows. I have checked and I have Windows installed with UEFI. Does anybody know what could be the cause of this problem?
Here are some outputs.
For efibootmgr I get:
BootCurrent: 0001
Timeout: 0 seconds
BootOrder: 2001,0001,0003,2002,2003
Boot0001* Arch_Linux HD(1,GPT,576e6cae-b67b-584b-886d-aa127636a7cc,0x800,0x82000)/File(EFIArch_Linuxgrubx64.efi)
Boot0003* Windows Boot Manager HD(1,GPT,576e6cae-b67b-584b-886d-aa127636a7cc,0x800,0x82000)/File(EFIMicrosoftBootbootmgfw.efi)RC
Boot2001* EFI USB Device RC
Boot2002* EFI DVD/CDROM RC
Boot2003* EFI Network RC
For lsblk I get:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1 259:0 0 953.9G 0 disk
├─nvme0n1p1 259:1 0 260M 0 part /boot/efi
├─nvme0n1p2 259:2 0 300.6G 0 part /run/media/mohammadreza/Windows
├─nvme0n1p3 259:3 0 251G 0 part /run/media/mohammadreza/Partition1
├─nvme0n1p4 259:4 0 151G 0 part /run/media/mohammadreza/Partition2
├─nvme0n1p5 259:5 0 150G 0 part /
├─nvme0n1p6 259:6 0 93G 0 part /home
└─nvme0n1p7 259:7 0 8G 0 part [SWAP]
#3 2022-02-13 22:50:23
- mohammadreza99a
- Member
- Registered: 2022-02-13
- Posts: 10
Re: Grub does not detect Windows UEFI but efibootmgr finds it
os-prober was enabled by default in /etc/default/grub. I have tried to add manually the Windows boot loader to grub but it does not work. Could it be related to some kind of mount issues?
#4 2022-02-15 06:37:14
- Head_on_a_Stick
- Member
- From: London
- Registered: 2014-02-20
- Posts: 6,829
- Website
Re: Grub does not detect Windows UEFI but efibootmgr finds it
How exactly did you attempt to manually add the Windows menuentry? Please post the configuration file that was added or edited and also the full content of /boot/grub/grub.cfg,
Please also share the output of
#5 2022-02-17 11:35:31
- mohammadreza99a
- Member
- Registered: 2022-02-13
- Posts: 10
Re: Grub does not detect Windows UEFI but efibootmgr finds it
Here is the output of
/dev/nvme0n1p7: UUID="522fb482-ee75-40c8-9819-d0078a04c71f" TYPE="swap" PARTUUID="443d2b6c-d02d-564b-ac4c-38062f147832"
/dev/nvme0n1p5: UUID="fc20a978-2012-456d-8a38-debbddc18320" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="260fd788-e554-554d-9659-cec33efe8f16"
/dev/nvme0n1p3: LABEL="Partition1" BLOCK_SIZE="512" UUID="A4EC3CE6EC3CB500" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="87f2f298-8c1e-41b8-9d28-3d65efa000cb"
/dev/nvme0n1p1: LABEL_FATBOOT="NO_LABEL" LABEL="NO_LABEL" UUID="E23D-EDCC" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="576e6cae-b67b-584b-886d-aa127636a7cc"
/dev/nvme0n1p6: UUID="0e15e6f2-5842-4f47-a24e-b04c51f1f07e" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="8e420e0c-19e6-6048-a0f8-0d79e82fa411"
/dev/nvme0n1p4: LABEL="Partition2" BLOCK_SIZE="512" UUID="A0507F78507F53CE" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="756fa30e-9fa5-42c1-88f5-4843d5e30960"
/dev/nvme0n1p2: LABEL="Windows" BLOCK_SIZE="512" UUID="9E9044E49044C50D" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="6e3de74a-3ed0-4bcb-a711-acf4adb4f13b"
To add the entry menu for windows, I put blew code into
:
#!/bin/sh
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 careful not to change
# the 'exec tail' line above.
if [ "${grub_platform}" == "efi" ]; then
menuentry "Microsoft Windows Vista/7/8/8.1 UEFI/GPT" {
insmod part_gpt
insmod fat
insmod chain
search --no-floppy --fs-uuid --set=root $hints_string $fs_uuid
chainloader /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi
}
fi
and after this i ran the command
and here is the content of my
#
# 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
search --no-floppy --fs-uuid --set=root fc20a978-2012-456d-8a38-debbddc18320
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
insmod part_gpt
insmod ext2
search --no-floppy --fs-uuid --set=root fc20a978-2012-456d-8a38-debbddc18320
insmod gfxmenu
loadfont ($root)/usr/share/grub/themes/Vimix/dejavu_32.pf2
loadfont ($root)/usr/share/grub/themes/Vimix/dejavu_sans_12.pf2
loadfont ($root)/usr/share/grub/themes/Vimix/dejavu_sans_14.pf2
loadfont ($root)/usr/share/grub/themes/Vimix/dejavu_sans_16.pf2
loadfont ($root)/usr/share/grub/themes/Vimix/dejavu_sans_24.pf2
loadfont ($root)/usr/share/grub/themes/Vimix/dejavu_sans_48.pf2
loadfont ($root)/usr/share/grub/themes/Vimix/terminus-12.pf2
loadfont ($root)/usr/share/grub/themes/Vimix/terminus-14.pf2
loadfont ($root)/usr/share/grub/themes/Vimix/terminus-16.pf2
loadfont ($root)/usr/share/grub/themes/Vimix/terminus-18.pf2
insmod jpeg
insmod png
set theme=($root)/usr/share/grub/themes/Vimix/theme.txt
export theme
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-fc20a978-2012-456d-8a38-debbddc18320' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
search --no-floppy --fs-uuid --set=root fc20a978-2012-456d-8a38-debbddc18320
echo 'Loading Linux linux ...'
linux /boot/vmlinuz-linux root=UUID=fc20a978-2012-456d-8a38-debbddc18320 rw quiet resume=UUID=522fb482-ee75-40c8-9819-d0078a04c71f loglevel=3 audit=0
echo 'Loading initial ramdisk ...'
initrd /boot/intel-ucode.img /boot/amd-ucode.img /boot/initramfs-linux.img
}
submenu 'Advanced options for Arch Linux' $menuentry_id_option 'gnulinux-advanced-fc20a978-2012-456d-8a38-debbddc18320' {
menuentry 'Arch Linux, with Linux linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-advanced-fc20a978-2012-456d-8a38-debbddc18320' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
search --no-floppy --fs-uuid --set=root fc20a978-2012-456d-8a38-debbddc18320
echo 'Loading Linux linux ...'
linux /boot/vmlinuz-linux root=UUID=fc20a978-2012-456d-8a38-debbddc18320 rw quiet resume=UUID=522fb482-ee75-40c8-9819-d0078a04c71f loglevel=3 audit=0
echo 'Loading initial ramdisk ...'
initrd /boot/intel-ucode.img /boot/amd-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-fc20a978-2012-456d-8a38-debbddc18320' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
search --no-floppy --fs-uuid --set=root fc20a978-2012-456d-8a38-debbddc18320
echo 'Loading Linux linux ...'
linux /boot/vmlinuz-linux root=UUID=fc20a978-2012-456d-8a38-debbddc18320 rw quiet resume=UUID=522fb482-ee75-40c8-9819-d0078a04c71f loglevel=3 audit=0
echo 'Loading initial ramdisk ...'
initrd /boot/intel-ucode.img /boot/amd-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/30_uefi-firmware ###
menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware' {
fwsetup
}
### END /etc/grub.d/30_uefi-firmware ###
### 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 ###
#6 2022-02-17 11:45:14
- V1del
- Forum Moderator
- Registered: 2012-10-16
- Posts: 18,248
Re: Grub does not detect Windows UEFI but efibootmgr finds it
You need to actually write out the entry to standard out e.g.
echo 'menuentry "Microsoft Windows Vista/7/8/8.1 UEFI/GPT" {
insmod part_gpt
insmod fat
insmod chain
search --no-floppy --fs-uuid --set=root $hints_string $fs_uuid
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}'
Note that i dropped the /boot/efi from the chainloader line because you need to write paths relative to the ESP root.
Also grub-mkconfig without the -o argument will write to stdout, make sure you properly write the correct config file as well.
#7 2022-02-17 14:54:52
- mohammadreza99a
- Member
- Registered: 2022-02-13
- Posts: 10
Re: Grub does not detect Windows UEFI but efibootmgr finds it
I did this and the problem is that when I click on the Windows entry in grub menu, it says that this path does not exist. Why this is happening? Because I can enter to Windows if I just change boot orders in my BIOS. Is this happening because the Windows boot loader is not correctly put into the correct path ?
Here is the content of my /boot/ folder:
drwx------ - root 1 Jan 1970 efi
drwxr-xr-x - root 17 Feb 15:51 grub
.rw-r--r-- 51k root 10 Feb 14:22 amd-ucode.img
.rw------- 24M root 16 Feb 22:07 initramfs-linux-fallback.img
.rw------- 6.8M root 16 Feb 22:06 initramfs-linux.img
.rw-r--r-- 4.7M root 8 Feb 22:07 intel-ucode.img
.rw-r--r-- 10M root 16 Feb 22:05 vmlinuz-linux
Last edited by mohammadreza99a (2022-02-17 14:59:10)
#8 2022-02-17 15:14:22
- Head_on_a_Stick
- Member
- From: London
- Registered: 2014-02-20
- Posts: 6,829
- Website
Re: Grub does not detect Windows UEFI but efibootmgr finds it
V1del wrote:
You need to actually write out the entry to standard out.
No, the stanza can be added directly, as stated on the linked ArchWiki page.
mohammadreza99a wrote:
when I click on the Windows entry in grub menu, it says that this path does not exist.
Please share the updated /boot/grub/grub.cfg that contains the Windows entry.
Did you replace $hints_string & $fs_uuid with the actual, correct string & UUID? The ArchWiki page shows how to do that.
mohammadreza99a wrote:
Is this happening because the Windows boot loader is not correctly put into the correct path ?
Check under /boot/efi and see if /EFI/Mircosoft/Boot/bootmgfw.efi is present. It should be there, the Arch & Windows NVRAM entries are both using the same PARTUUID (/dev/nvme0n1p1).
#9 2022-02-17 17:15:11
- V1del
- Forum Moderator
- Registered: 2012-10-16
- Posts: 18,248
Re: Grub does not detect Windows UEFI but efibootmgr finds it
@HoaS if you directly edit /boot/grub.cfg sure, if you intend /etc/grub.d/40_custom to be picked up by grub-mkconfig you’ll definitely need to echo out the intended text somewhere. But still yes, the correct replacement variables have to be replaced anyway.
#10 2022-02-17 17:23:00
- Head_on_a_Stick
- Member
- From: London
- Registered: 2014-02-20
- Posts: 6,829
- Website
Re: Grub does not detect Windows UEFI but efibootmgr finds it
V1del wrote:
if you intend /etc/grub.d/40_custom to be picked up by grub-mkconfig you’ll definitely need to echo out the intended text somewhere
Nope:
archie:~$ cat /etc/grub.d/40_custom
#!/bin/sh
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 careful not to change
# the 'exec tail' line above.
menuentry "Microsoft Windows Vista/7/8/8.1 UEFI/GPT" {
insmod part_gpt
insmod fat
insmod chain
search --no-floppy --fs-uuid --set=root $hints_string $fs_uuid
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
archie:~$ doas grub-mkconfig 2>/dev/null | grep -A6 Vista
menuentry "Microsoft Windows Vista/7/8/8.1 UEFI/GPT" {
insmod part_gpt
insmod fat
insmod chain
search --no-floppy --fs-uuid --set=root $hints_string $fs_uuid
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
archie:~$
Even 40_custom disagrees with you
#11 2022-02-17 18:42:38
- V1del
- Forum Moderator
- Registered: 2012-10-16
- Posts: 18,248
Re: Grub does not detect Windows UEFI but efibootmgr finds it
I stand corrected
#12 2022-02-17 19:54:06
- mohammadreza99a
- Member
- Registered: 2022-02-13
- Posts: 10
Re: Grub does not detect Windows UEFI but efibootmgr finds it
Head_on_a_Stick wrote:
Did you replace $hints_string & $fs_uuid with the actual, correct string & UUID? The ArchWiki page shows how to do that.
While running grub-probe —target=hints_string /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi in order to get$hints_string, I get this error:
grub-probe: warning: unknown device type nvme0n1.
For $fs_uuid I get a response.
I mean this is just a warning but it is weird that there is not any output.
#13 2022-02-17 20:02:39
- mohammadreza99a
- Member
- Registered: 2022-02-13
- Posts: 10
Re: Grub does not detect Windows UEFI but efibootmgr finds it
mohammadreza99a wrote:
Head_on_a_Stick wrote:
Did you replace $hints_string & $fs_uuid with the actual, correct string & UUID? The ArchWiki page shows how to do that.
While running grub-probe —target=hints_string /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi in order to get$hints_string, I get this error:
grub-probe: warning: unknown device type nvme0n1.
So I have a fix for this issus. What i did was to copy the output in the wiki and I changed hd0 to nvme0n1 and I can finally successfully load into Windows from Grub. But the main issus always remains. The fact that os-prober is not able to find Windows loader.
Here is my /etc/grub.d/40_custom for those that might have the same issus:
#!/bin/sh
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 careful not to change
# the 'exec tail' line above.
if [ "${grub_platform}" == "efi" ]; then
menuentry "Microsoft Windows Vista/7/8/8.1 UEFI/GPT" {
insmod part_gpt
insmod fat
insmod chain
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt1 --hint-efi=nvme0n1,gpt1 --hint-baremetal=ahci0,gpt1 E23D-EDCC
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
fi
Thank you both for helping me.
Last edited by mohammadreza99a (2022-02-17 20:02:58)
#14 2022-02-17 20:29:41
- Head_on_a_Stick
- Member
- From: London
- Registered: 2014-02-20
- Posts: 6,829
- Website
Re: Grub does not detect Windows UEFI but efibootmgr finds it
The —hint options are only needed if you have multiple partitions with the same filesystem UUID.
All I have ever needed is
menuentry 'Windows' {
search.fs_uuid $uuid
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
search.fs_uuid is an alias for search —fs-uuid and the root variable is the presumed default.
Basically I’ve lost my Windows 8 boot option and the boot repair from Windows installation media doesn’t fix the problem.
I know this is more-or-less a Windows’ problem but I’m seeking a efibootmgr
solution rather than a solution that uses the much more awkward Windows based bcdedit
command. Hence I ask here instead of super user.
The detailed background is here, basically my system was initial setup in BIOS/MBR/CSM mode, Windows 10 is refusing to be installed there, so I have to converted my MBR disk to GPT. I got everything on the Linux side working afterward, but fixing Windows boot via Windows installation media failed.
- All my Linux OS/partitions were found by
update-grub
, but my Windows 8 is missing from the GRUB menu. - The
os-prober
was not able to list/find my Windows 8 either.
I hope the fix is simply adding my Windows 8 back as an boot entry using efibootmgr
, but this is where I got lost and need help. Again further detailed like current partition schema can be found here. Thx.
Maybe my Windows 8 was installed in BIOS/MBR/CSM mode, and has no EFI booting capability as I don’t see a /EFI
directory within it? Here are all root level directories in my Windows 8 partition:
$Recycle.Bin/ ProgramData/
$WINDOWS.~BT/ Programs/
$Windows.~WS/ Recovery/
BOOTNXT Recovery.txt
BOOTSECT.BAK System Volume Information/
Boot/ Tmp/
Documents and Settings/ Users/
ESD/ Windows/
Intel/ bootmgr
Program Files/ pagefile.sys
Program Files (x86)/ swapfile.sys
Or maybe I don’t need efibootmgr
at all, just a custom entry in /etc/grub.d/40_custom
like the following?
menuentry "Windows 8 BIOS MBR" {
insmod part_msdos
insmod ntldr
insmod ntfs
ntldr (hd0,msdos1)/bootmgr
}
В этой статье мы разберемся, как восстановить загрузчик Windows 10 на современном компьютере, на котором используется интерфейс UEFI вместо BIOS и таблица разделов диска GPT (вместо MBR). Повреждение загрузчика Windows может быть вызвано установкой второй ОС (Dual Boot — конфигурация), некорректными действиями “специалиста” при восстановлении системы после сбоя, удалением “лишних” данных на скрытых разделах, вирусом-вымогателем и рядом других причин.
Данная статья описывает пошаговую процедуру восстановления поврежденного или удаленного загрузчика ОС в Windows 10 и Windows 8.1 на компьютерах, которые работают в нативном (не legacy) режиме UEFI. Инструкция должна помочь, если Windows не загружается из-за отсутствия или повреждения файла с конфигурацией загрузки EFIMicrosoftBootBCD.
Ошибка загрузки The boot configuration data for your PC is missing: EFIMicrosoftBootBCD.
Компьютер с UEFI Windows 10, установленной в нативном режиме, при повреждении EFI загрузчика Windows не сможет загрузится. При этом при попытке загрузки появляется BSOD (синий экран смерти) с ошибкой:
The boot configuration data for your PC is missing or contains errors.
File :EFIMicrosoftBootBCD
Error code: 0xc000000f
или
Error code: 0xc000014c
В русской версии Windows ошибка может быть такая:
Ваш компьютер нуждается в ремонте Данные конфигурации загрузки для вашего ПК отсутствуют или содержат ошибки Файл:EFIMicrosoftBootBCD Код ошибки: 0xc000000f
Эта ошибка говорит о повреждении или даже полном удалении конфигурации загрузчика Windows — Boot Configuration Data (BCD). Если вы попытаетесь восстановить загрузчик на UEFI компьютере с помощью утилиты bcdedit , вы получите такую ошибку:
The boot configuration data store could not be found.
The requested system device cannot be found.
Дело в том, что если Windows 10 установлена в нативном режиме UEFI на GPT диск, то EFI загрузчик Windows 10 (Windows Boot Manager) хранит программу управления загрузкой и конфигурацию BCD на отдельном скрытом разделе EFI (размером 100 мб с файловой системой FAT32). Утилита bcdedit не видит этот EFI раздел, и соответственно не может управлять конфигурацией загрузчика на нем.
Если при загрузке Windows появляется только черный экран с надписью “Operating System not found”, скорее всего у вас полностью удален загрузчик Windows. Следуйте инструкции по ссылке.
Процедура автоматического восстановления загрузчика, зашитая в среду восстановления Windows (WinRe), как правило, в таких случаях бессильна. Но попробовать все-же стоит:
- Загрузитесь с диска загрузочного диска, диска восстановления или установочной флешки с Windows 10;
- На экране установки нажмите кнопку Восстановление системы;
- Затем выберите пункт Поиск и устранение неисправностей -> Восстановление при загрузке и выберите ОС, загрузчик которой нужно попытаться восстановить;
- Но скорее всего результат будет отрицательный: Восстановление при загрузке не удалось восстановить компьютер
Ручное восстановление загрузчика Windows с помощью BCDBoot.
Перейдем к процедуре ручного восстановления EFI загрузчика Windows на компьютере с UEFI.
Для восстановления конфигурации загрузчика (BCD), вам нужно загрузить компьютер с оригинального установочного диска с Windows (диска восстановления или специально подготовленной загрузочной флешки). После загрузки в среде восстановления нужно открыть окно командной строки: выберите Восстановление системы -> Диагностика -> Командная строка (System Restore -> Troubleshoot -> Command Prompt).
Командную строку также можно запустить, если у вас под рукой есть только установочный диск с Windows. Для этого достаточно на самом первом этапе установки Windows (при выборе языка и раскладки клавиатуры) нажать комбинацию клавиш Shift+F10 (или Shift+Fn+F10 на некоторых моделях ноутбуков).
В открывшейся командной строке выполните запустите утилиту управления дисками, набрав команду:
diskpart
Выведите список дисков в системе:
list disk
На этом этапе очень важно определить тип таблицы разделов на диске, на котором установлена Windows: MBR или GPT. Дело в том, что EFI загрузчик используется только на дисках с GPT разметкой.
Если у диска в столбце Gpt указана звездочка ( * ), тогда используется таблица разделов GPT, если нет – MBR.
Если с помощью diskpart вы определили, что на вашем диске используется GPT разметка, следуйте дальнейшим шагам инструкции по восстановлению загрузчика.
Если у вас разметка MBR – данная инструкция не применима к вашему компьютеру. Скорее всего у вас компьютер с BIOS, или в настройках UEFI включен режим совместимости Legacy/Compatibility Support Module/CSM.
На MBR дисках загрузчик хранится на отдельном разделе System Reserved, а не на EFI разделе (ни в коем случае не конвертируйте таблицу разделов MBR в GPT, пока не исправите загрузчик!!) Используйте другую инструкцию по восстановлению BCD загрузчика на MBR (Master Boot Record) диске.
Выберите диск, на котором установлена ваша Windows (если жесткий диск в системе один, его индекс должен быть равен 0):
sel disk 0
Выведите список томов и разделов в системе:
list partition
list volume
В нашем примере видно, что загрузочный раздел EFI (его можно определить по размеру 100 Мб, и файловой системе FAT32, чаще всего его метка — System EFI) имеет индекс Partition2 (он же Volume 5 с меткой Hidden). Основной раздел с установленной системой Windows (это может быть, как Windows 10, так и Windows 8.1) — volume 2 с файловой системой NTFS. Также обязательно должен быть MSR (Microsoft System Reserved) раздел размером 16 мб в Windows 10 ( или 128 Мб в Windows 8.1).
Если у вас отсутствует отдельный EFI или MSR раздел, их можно пересоздать вручную. Смотрите инструкцию по восстановлению удаленного загрузочного EFI и MSR разделов.
Назначьте скрытому EFI разделу произвольную букву диска (например, M:):
select volume 5
assign letter M:
Должна появится строка, свидетельствующая об успешном назначении буквы диска разделу EFI:
DiskPart successfully assigned the drive letter or mount point.
Завершите работу с diskpart:
exit
Перейдите в каталог с загрузчиком на скрытом разделе:
cd /d m:efimicrosoftboot
В данном случае M: это буква диска, присвоенная разделу EFI чуть выше. Если каталог EFIMicrosoftBoot отсутствует (ошибка The system cannot find the path specified ), попробуйте следующие команды:
cd /d M:Boot
или
cd /d M:ESDWindowsEFIMicrosoftBoot
На этом этапе многие рекомендуют выполнить следующие команды, которые должны перезаписать загрузочную запись раздела, найти установленные Windows и добавить их в BCD:
bootrec /fixboot
bootrec /scanos
bootrec /rebuildbcdили даже:
bootrec /FixMbr (восстановление MBR записи для GPT диска выглядит странным)
Все эти команды применимы только для дисков с MBR. Если ваш компьютер загружается в UEFI режиме, то на нем обязательно используется таблица разделов GPT (как ращ наш случай). Поэтому при запуске команд bootrec вы увидите ошибку: access is denied
Для исправления загрузочных записей на EFI разделе нужно использовать утилиту BCDBoot.
Утилита BCDBoot позволяет восстановить файлы загрузчика на системном разделе, скопировав их системного каталога на разделе с Windows. Конфигурация загрузчика BCD пересоздается с помощью шаблона %WINDIR%System32ConfigBCD-Template.
С помощью команды attrib снимите атрибуты скрытый, read-only и системный с файла BCD:
attrib BCD -s -h -r
Удалите текущий файл с конфигурацией BCD, переименовав его (так вы сохраните старую конфигурацию в качестве резервной копии):
ren BCD BCD.bak
С помощью утилиты bcdboot.exe нужно пересоздать хранилище BCD, скопировав файлы среды загрузки UEFI в загрузочный раздел из системного каталога:
bcdboot C:Windows /l en-us /s M: /f ALL
где,
- C:Windows – путь к каталогу на диске, на котором установлена ваша Windows 10;
- /f ALL – означает что необходимо скопировать файлы среды загрузки Windows, включая файлы для компьютеров с UEFI или BIOS (теоретическая возможность загружаться на EFI и BIOS системах). Чтобы скопировать только EFI загрузчик, используйте команду /f UEFI.
- /l en-us — тип системной локали. По умолчанию используется en-us — английский язык (США)
- /с – эта новая опция BCDBoot в Windows 10, которая позволяет перезатереть имеющиеся загрузочные записи при создании нового хранилища (в том числе debugsettings). Используйте этот параметр, чтобы игнорировать старые настройки и создать полностью чистую конфигурацию BCD загрузчика;
- /v – используется для включения режима вывода подробной информации BCDBoot.
Совет. В случае использования русской версии Windows 10 команда будет другая:
bcdboot C:Windows /L ru-ru /S M: /F ALL
Теперь, если выполнить команду bcdedit, вы увидите следующую картину:
В секции диспетчера загрузки Windows (Windows Boot Manager) должна появится запись, указывающая на полный путь к файлу управления загрузкой UEFI. В этом примере он находится на разделе 2 (partition=DeviceHarddiskVolume2 ), путь EFIMICROSOFTBOOTBOOTMGFW.EFI.
Возможные ошибки:
- BFSVC Error: Could not open the BCD template store. status – [c000000f] – проверьте правильность введенной команды. Возможно у вас установлена локализованная версия Windows. В этом случае нужно правильно указать код языка системы (local language code). Утилита bcdboot копирует файлы шаблонов BCD из каталога WindowsSystem32Config. Если BCD шаблоны в этой папке повреждены или удалены, попробуйте проверить целостность системных файлов в офлайн режиме с помощью утилиты sfc (понадобится установочный диск с Windows – диск D:): sfc /scanow /OFFBOOTDIR=C: /OFFWINDIR=D:WINDOWS
- BFSVC Error: Error copying boot files Last Error = 0x570 – попробуйте выполнить проверку диска с помощью команды CHKDSK M: /F
- BFSVC Error: Failed to set element application device. Status = [c000000bb] – проверьте с помощью chkdsk.exe разделы с EFI и Windows 10. Проверьте, что снят атрибут скрытый и системный у файла BCD. Удалите его: attrib
-s -h EFIMicrosoftBootBCD
del EFIMicrosoftBootBCD
- Failure when initializing library system volume – проверьте, что вы используете правильный FAT32 раздел с EFI (возможно у вас из несколько).
Перезагрузите компьютер, отключите загрузочный диск. Если вы все сделали правильно, в выборе устройств загрузки должен появиться пункт Windows Boot Manager в котором можно выбрать загрузку нужной ОС. Ваш EFI загрузчик и конфигурация BCD успешно восстановлены!
dual boot on notebook hp 250 g6: the solution step by step
(a) prepare BIOS etc.
- BIOS boot: legacy boot off
- BIOS boot: secure boot off
- BIOS boot bootsequence: put your live media (USB Stick for me) before harddisk/SSD
- Window: Fast Boot off (beim drücken des Netzschalters: herunterfahren)
- shut down completely
(b) install linux
here I faced the problem, that the normal installation got stuck installing grub2 and/or general protection fault. Thus I need to install without grub
- boot from live usb, configure correct keyboard, prepare/delete partitions etc.
- in a terminal enter: ubiquity -b . This starts mint installation with the usual panels but without boot installation
(c) install grub
- find the EFI partition (small partition dos formatted, in my case sda1
- sudo mkdir /boot/efi
- sudo mount /dev/sda1 /boot/efi
- install grub-efi (e.g. using synaptic). Because we mounted the EFI partition, it will try an EFI installation and gets stuck, just kill it.
(d) activate grub
if you boot now, you land in windows. Because we havn’t found anything that works, we will use a dirty trick: overwrite the windows loader by grub in the efi partition. Everything here is done in Linux on the live USB (adapted from UEFI Dual boot in HP computer )
- running linux from live USB install grub as described above. As described it does not finisch, but now we find grub on the EFI ( EFI/ubuntu/grubx64.efi )
- sudo cp -1 /boot/efi/EFI external; this is for anxious guys like me: copy the whole EFI partition to an external media (like USB or other PC in the network), soi I have a backup in case I destroyed too much
- cd /boot/efi/EFI; sudo cp -a Microsoft MicrosoftOrig because we do our dirty trick in the folder Microsoft, we need a copy of it to boot Windows later on
- find the window loader in the EFI partition, in my case EFI/Microsoft/Boot/bootmgfw.efi
- cd /boot/efi/EFI; sudo cp ubuntu/grubx64.efi Microsoft/Boot copy grub to folder with windows loader
- cd /boot/efi/EFI/Microsoft/Boot; mv bootmgfw.efi bootmgfw.efi.orig; mv grubx64.efi bootmgfw.efi copy grub over windows boot loader (anxious as ever, I renamed it beforehand)
- its a good idea to rename/remove also EFI/Microsoft/Boot/bootmgr.efi, otherwise it will confuse later grub-mkconfig
(e) boot linux from grub shell
if you remove the live USB and boot now, you land in the grub shell (no longer windows ! )
I booted from grub to linux, because I wanted to know as soon as possible, if my linux installed on SSD is running correctly. Alternatively, you could do the next paragraph (f) from the live USB.
I used Terminal Inflection: Instigating a Manual Boot from the GRUB Prompt where you find further details
- grub uses an american keyboard. I didn’t bother to configure my swiss keyboard, but just looked at the american keyboard layout
- ls to see all partitions grub knows about. In my case (hd0,gpt1) etc.
- ls (hd0, gpt1)/ try through all partitions until you find the EFI partition and the linux partition — in my case (hd0,gpt1) and (hd0,gpt5)
- set root=(hd0,gpt5) – this specifies the partition from which to load the images.
- linux /vmlinuz ro root=/dev/sda5 – Load this Linux kernel, with arguments — /vmlinuz is normally a link to the last installed kernel
- initrd /initrd.img – load this Initial RAM disk. this is normally alink to the img of the last installed kernel
- boot – tell grub to boot with the above specs
(f) configure grub — to linux
This configuration is done running the new linux the SSD.
- install grub-efi as explained in a paragraph (c)
- To do this from the live USB you must tell the installer to work for a different linux installation.
- This is done by apt-get -o root=/dev/sda5 install grub-efi
- I’m not sure about the exact syntax, I havn’t used it yet
- as explained this will not finish, but it started to build a config file /boot/grub/grub.cfg.new — if you don’t find the file try update-grub or grub-mkconfig
- cd /boot/grub; sudo mv grub.cfg.new grub.cfg — rename the partly built config file to be active
- sudo grub-update
Now the system boots directly to the new linux on the SSD — at least it did for me
(g) configure grub — show menu
- switch off hidden timeout in /etc/default/grub by prepending a # to the pertinent line. Then it’s only a comment and looks like
- I also changed in the same file a set the timeout (how many seconds to show menu before booting to default) to a shorter delay
- if the notebook comes back from hibernation, grub uses the timeout after error (30 secs), which I also change
- sudo grub-update
Now, booting shows the grub menu and gives me 3 seconds to choose something, before it boots the new linux
(h) configure grub — add windows
- edit /etc/grub.d/40_custom to yield
Code: Select all
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 careful not to change # the 'exec tail' line above. menuentry 'Windows 10' { insmod part_gpt insmod fat set root='hd0,gpt1' chainloader /EFI/MicrosoftOrig/Boot/bootmgfw.efi }
remember, (hd0,gpt1) is my EFI partition and /EFI/MicrosoftOrig/Boot/bootmgfw.efi the windows loader copied to a new location in paragraph (d3)
- sudo grub-update
Booting shows the grub menu and me choose between windows and linux. Everything runs ok, until …..
(h) cleanup packages
Software update or Synaptic no longer worked. They complained about broken packages and told me to fix it by sudo dpkg —configure -a. However, dpkg tries to finish installation of grub-efi and, of course, gets stuck forever. I had to manually remove several packages
- sudo dpkg -r grub-efi removes the package
- sudo dpkg —configure -a if it finishes ok we are done. If it gets stuck again, it mentioned a (dependent) package (e.g. grub-efi-amd64) ==> restart by step 1 above for this package.
suprise ! Mint update, package manager etc. work, Grub boots with the menu I wish. Even a new linux kernel is automatically integrated.
(i) warning — conclusion
I do not expect an update of grub itself or of the windows loader to work automatically — probably manual steps from this script are necessary. Thus
- carefully, document what you had to do, you might need it again, probably when you already forgot some crucial details. Also, if necessary, please document for the community. e.g. in this post.
- once the system runs, backup everything
If you know what to do, type fast and everything works ok, you can do this script in an hour. However, neither was true, when i unpacked my new notebook — 10 days ago.
Last edited by wlkl on Fri Aug 31, 2018 7:40 am, edited 16 times in total.
Как устроена загрузка современных ОС? Как при установке системы настроить загрузку посредством UEFI, не утонув в руководствах и ничего не сломав?
Я обещал «самое краткое руководство». Вот оно:
- Создаём на диске таблицу разделов GPT
- Создаём FAT32-раздел на пару сотен мегабайт
- Скачиваем из интернета любой UEFI-загрузчик
(нам нужен сам загрузчик, это один бинарный файл!) - Переименовываем и кладем этот файл на созданный раздел по адресу /EFI/Boot/bootx64.efi
- Создаём текстовый конфиг, кладем его там, где загрузчик ожидает его увидеть
(настройка и местоположение конфига зависят от конкретной реализации загрузчика, эта информация доступна в интернете) - После перезагрузки видим меню загрузчика
(Если на диске установлена Windows 8 или 10 — с большой вероятностью это руководство сокращается до пунктов 3 — 5.)
TL;DR не надо прописывать путь к загрузчику в новых загрузочных записях UEFI — надо файл загрузчика расположить по стандартному «пути по-умолчанию», где UEFI его найдет, и вместо загрузочного меню UEFI пользоваться меню загрузчика, которое гораздо проще и безопаснее настраивается
Как делать не надо
Есть, на самом-то деле, несколько способов настроить UEFI-загрузку. Я начну с описания других вариантов — чтобы было понятно, как (и почему) делать не надо. Если вы пришли за руководством — мотайте в самый низ.
Не надо лезть в NVRAM и трогать efivars
Наиболее «популярная» процедура установки загрузчика в систему такова: установщик ОС создаёт специальный раздел, на нём — структуру каталогов и размещает файлы загрузчика. После этого он с помощью особой утилиты (efibootmgr в linux, bcdedit в windows) взаимодействует с прошивкой UEFI-чипа, добавляя в неё загрузочную запись. В этой записи указывается путь к файлу загрузчика (начиная от корня файловой системы) и при необходимости — параметры. После этого в загрузочном меню компьютера появляется опция загрузки ОС. Для linux существует возможность вообще обойтись без загрузчика. В загрузочной записи указывается путь сразу к ядру вместе со всеми параметрами. Ядро должно быть скомпилировано с опцией EFISTUB (что давно является стандартом для большинства дистрибутивов), в этом случае оно содержит в себе заголовок «исполняемого файла EFI», позволяющий прошивке его запускать без внешнего загрузчика.
При старте системы, когда пользователь выбирает нужную ему загрузочную запись, прошивка UEFI сперва ищет на прописанном в этой записи диске особый EFI-раздел, обращается к файловой системе на этом разделе (обязательно FAT или FAT32), и запускает загрузчик. Загрузчик считывает из файла настроек свой конфиг, и либо грузит ОС, либо предоставляет загрузочное меню. Ничего не замечаете? Да, у нас два загрузочных меню — одно на уровне прошивки чипа UEFI, другое — на уровне загрузчика. В реальности о существовании второго пользователи могут даже не догадываться — если в меню всего один пункт, загрузчик Windows начинает его грузить без лишних вопросов. Увидеть экран с этим меню можно, если поставить вторую копию Windows или просто криво её переустановить.
Обычно для управления загрузочными записями руководства в интернете предлагают взаимодействовать с прошивкой UEFI. Есть аж пять основных вариантов, как это можно сделать: efibootmgr под linux, bcdedit в windows, какая-то софтина на «Маках», команда bcfg утилиты uefi shell (запускается из-под UEFI, «на голом железе» и без ОС, поскольку скомпилирована в том самом особом формате) и для особо качественных прошивок — графическими средствами UEFI (говоря популярным языком, «в настройках BIOS»).
За всеми вышенаписанными «многобуков» вы могли легко упустить такую мысль: пользователь, чтобы изменить настройки программной части (например, добавить параметр запуска ОС), вынужден перезаписывать flash-память микросхемы на плате. Есть ли тут подводные камни? О да! Windows иногда способна сделать из ноутбука кирпич, linux тоже, причём разными способами. Качество прошивок часто оставляет желать лучшего — стандарты UEFI либо реализованы криво, либо не реализованы вообще. По логике, прошивка обязана переживать полное удаление всех переменных efivars без последствий, не хранить в них критичных для себя данных и самостоятельно восстанавливать значения по-умолчанию — просто потому что пользователь имеет к ним доступ, и вероятность их полного удаления далека от нуля. Я лично в процессе экспериментов неоднократно (к счастью, обратимо) «кирпичил» свой Lenovo — из загрузочного меню исчезали все пункты, включая опцию «зайти в настройки».
Работа с загрузочными записями UEFI — тоже не сахар. К примеру, утилита efibootmgr не имеет опции «редактировать существующую запись». Если ты хочешь немного изменить параметр ядра — ты удаляешь запись целиком и добавляешь её снова, уже измененную. При этом строка содержит в себе двойные и одинарные кавычки, а также прямые и обратные слеши в не особо очевидном порядке. Когда я наконец заставил эту магию работать — я сохранил её в виде bash-скриптов, которые до сих пор валяются у меня в корневой ФС:
efibootmgr -c -L "Archlinux (debug)" -l 'EFIarchlinuxvmlinuz-linux' -u "root=/dev/mapper/vg1-lvroot rw initrd=EFIarchlinuxinitramfs-linux.img systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M enforcing=0"
Не надо использовать GRUB
Это чёртов мастодонт, 90% функциональности которого предназначено для дисков с MBR. Для настройки необходимо отредактировать ряд файлов, после чего выполнить команду генерации конфига. На выходе получается огромная малопонятная нормальному человеку простыня. В составе — гора исполняемых файлов. Ставится командой, которую просто так из головы не возьмешь — надо обязательно лезть в документацию
grub-install --target=x86_64-efi --efi-directory=esp_mount --bootloader-id=grub
Для сравнения — самый простенький UEFI-bootloader, который есть в составе пакета systemd, ставится командой
bootctl install --path=/boot
Эта команда делает ровно две вещи: копирует исполняемый файл загрузчика на EFI-раздел и добавляет свою загрузочную запись в прошивку. А конфиг для неё занимает ровно СЕМЬ строчек.
«Самое краткое руководство» — чуть более подробно
Загрузочное меню надо реализовывать на уровне загрузчика — править текстовые конфиги гораздо проще и безопасней.
Загрузочная запись нам не нужна — дело в том, что при выставлении в настройках BIOS загрузки с диска прошивка UEFI сначала ищет на нём EFI-раздел, а затем пытается исполнить файл по строго фиксированному адресу на этом разделе: /EFI/Boot/BOOTX64.EFI
Что такое «EFI-раздел»? В теории, он должен иметь особый тип «EFI System» (ef00). На практике, годится первый раздел на GPT-диске, отформатированный в FAT32 и имеющий достаточно места, чтобы разместить загрузчик и вспомогательные файлы (если есть).
Пункт 3: «Скачиваем из интернета любой UEFI-загрузчик». Что это значит? Загрузчик — это просто исполняемый файл определенного формата, к которому в комплекте идет конфиг. К примеру, если у вас есть под рукой установленный пакет с systemd — файл загрузчика можно найти по адресу /usr/lib/systemd/boot/efi/systemd-bootx64.efi, переименовать его в bootx64.efi и скопировать в /EFI/Boot/ на EFI-разделе. Нет под рукой systemd? Скачайте архив с сайта Archlinux. Или с репозитария Ubuntu. Или Debian. Есть под рукой система с Windows? Возьмите виндовый загрузчик оттуда, тоже сгодится )) Если сумеете настроить, я честно говоря не пробовал.
Пункт 4: «Настроить конфиг». Как и обычная программа, когда загрузчик запускается — он ожидает найти по определенным путям файлы конфигурации. Обычно эту информацию легко найти в интернете. Для загрузчика systemd-boot нам необходимо в корне EFI-раздела создать каталог «loader», а в нём файл «loader.conf» с тремя строчками (привожу свои):
default archlinux
timeout 10
editor 1
Параметр editor отвечает за возможность отредактировать пункт загрузочного меню перед запуском.
Рядом с loader.conf необходимо создать каталог entries — один файл в нём будет отвечать за одну загрузочную запись в boot-меню. У меня там один файл arch.conf с таким содержанием:
title Arch Linux
linux /efi/archlinux/vmlinuz-linux
initrd /efi/archlinux/initramfs-linux.img
options root=/dev/mapper/vg1-lvroot rw initrd=EFIarchlinuxintel-ucode.img
Я не упомянул, но довольно очевидно — ядро и initramfs должны лежать в одной файловой системе с загрузчиком, то есть на EFI-разделе. Пути к ним в конфигах отсчитываются от корня этой ФС.
Другие загрузчики
systemd-boot очень простой и предоставляет спартанского вида чёрно-белое меню. Есть варианты красивей, если душа просит красоты.
rEFind — очень красивый загрузчик. Скачать можно тут в виде deb-пакета. Использую на своём ноуте. Умеет создавать загрузочное меню автоматически, без конфига — просто сканируя файлы.
Clover. Позволяет выставлять нативное разрешение экрана, имеет поддержку мыши на экране загрузки, разные темы оформления. Дефолтная тема ужасна, конфиг в виде xml нечитаем, настроить не смог.
Различные неочевидные последствия
Вы можете легко попробовать эту схему в работе. Берёте USB-флешку, форматируете в таблицу разделов GPT, создаете FAT-раздел и копируете туда загрузчик. Комп сможет с неё стартовать.
Если просто скопировать на такую флешку boot-раздел установленного linux — система будет спокойно загружаться с флешки, не видя разницы.
n00b
Joined: 06 Mar 2021
Posts: 45
Posted: Thu Jun 24, 2021 3:53 pm Post subject: os-prober does not detect windows bootloader | ||||
|
||||
When I run grub-mkconfig -o /boot/grub/grub.cfg I get no warning or error. It does not find any windows bootloader even though all partitions are mounted:
output of fdisk -l:
The windows bootloader called bootmgfw.efi which it was supposed to see is located on the partition in C:Windows/Boot/EFI/ folder. |
Advocate
Joined: 23 Mar 2019
Posts: 3279
n00b
Joined: 06 Mar 2021
Posts: 45
Posted: Thu Jun 24, 2021 8:28 pm Post subject: | ||
|
||
output of efibootmgr -v:
Which is weird I no longer have Fedora or Pop_Os! installed on the system. Doing efibootmgr -n 99e275e7-75a0-4b37-a2e6-c5385e6c00cb gives me this error: There’s no Microsoft just Windows/boot/EFI/windowsbootloader Should I copy whole boot folder in my /boot/EFI/ ? I previously had Fedora on one SSD and windows on the other and the installator put the windows bootloader in grub with no problem… |
Advocate
Joined: 23 Mar 2019
Posts: 3279
Posted: Thu Jun 24, 2021 8:29 pm Post subject: | ||||
|
||||
No no try To remove old fedora and pop-os do this
Last edited by alamahant on Thu Jun 24, 2021 8:51 pm; edited 1 time in total |
n00b
Joined: 06 Mar 2021
Posts: 45
n00b
Joined: 06 Mar 2021
Posts: 45
Advocate
Joined: 23 Mar 2019
Posts: 3279
n00b
Joined: 06 Mar 2021
Posts: 45
Posted: Thu Jun 24, 2021 8:58 pm Post subject: | ||
|
||
I copied the Boot folder in /boot/EFI/Microsoft
After I rerun grub-mkconfig -o /boot/grub/grub.cfg nothing new happens, Im missing the last line about ading the windows bootloader entry…
|
Advocate
Joined: 23 Mar 2019
Posts: 3279
n00b
Joined: 06 Mar 2021
Posts: 45
Posted: Sat Jun 26, 2021 6:23 pm Post subject: | ||
|
||
So creating a file at /etc/grub.d/40_custom with this would do the trick?
|
n00b
Joined: 06 Mar 2021
Posts: 45
Display posts from previous:
Alright, I just upgraded Windows 10 to Windows 11, and it instantly deleted my opensuse-secure
boot entry. I lost access to openSUSE Tumbleweed. Thanks Microsoft! Assh.les.
Anyway, the solutions being suggested everywhere said «Just boot the installation ISO, chroot into the system, and reinstall grub2». I thought that was way too excessive.
There are two super simple ways to fix it instead:
Method 1: The absolute easiest method.
-
Boot ANY Linux live environment. Doesn’t even have to be openSUSE’s installer.
-
Run
sudo efibootmgr -v
to look at your current boot entries, to see what’s currently registered in EFI. In my case, I still had «opensuse», but «opensuse-secure» had been nuked by Windows (as.h.les… cough). -
Now, it’s very easy. Just use ANY technique you want, to find your
/boot/efi/EFI
partition (your Linux EFI partition). In my case, I used GNOME Disks to look at all partitions marked as being «Type: EFI System», and saw that it was on/dev/nvme1n1p6
, meaning the 6th partition of the 1st NVME SSD. -
Next, you just have to type one easy command to create the bootloader entry. The only hard part of the command below is that you CANNOT (CANNOT CANNOT CANNOT CANNOT CANNOT!!!) give it the
nvme1n1p6
orsda6
or whatever PARTITION as part of the device name. The partition must be given as a separate parameter instead. -
So, for my system where the Linux EFI was on
nvme1n1p6
, it means my device isnvme1n1
and my partition is6
. If it had been on a SATA drive such assda2
, it would have meant the device issda
and partition is2
. This is all you HAVE TO understand. If you try giving the fullnvme1n1p6
or whatever as the disk parameter, then your UEFI will NOT be able to find your Linux EFI partition, so it’s super important to understand this concept. -
Alright… To restore the UEFI boot entry, just run this command, adapted for your own drive (
-d
parameter) and partition (-p
parameter):sudo efibootmgr -c -w -L "opensuse-secure" -d /dev/nvme1n1 -p 6 -l "/EFI/OPENSUSE/SHIM.EFI"
(this is correct for both 32-bit and 64-bit). -
That’s it. Your «secure boot» bootloader is restored.
-
If you also need to restore your non-secure bootloader, the command is almost the same, but is like this instead:
sudo efibootmgr -c -w -L "opensuse" -d /dev/nvme1n1 -p 6 -l "/EFI/OPENSUSE/GRUBX64.EFI"
(if you’re on 32-bit, the bootloader file is namedGRUB.EFI
instead, so just remove theX64
from the-l
parameter if you are on 32-bit). -
You can run
sudo efibootmgr -v
to look at your current boot entries again. It should now show the new entries. Your UEFI firmware will now be able to find your Linux system again!
This recovery method will work for the most common types of bootloader damage: Loss of the UEFI boot entry registration (due to accidents, or BIOS updates/resets, or Windows installations, etc). It will not work if GRUB itself is corrupted. But that’s extremely rare in comparison, and those will require the tedious «reinstall openSUSE bootloader» guides that are easy to find.
Have fun!
Method 2: Suggested by Vogtinator and MasterPatricko from openSUSE.
-
Boot ANY Linux live environment with a similar enough kernel. Doesn’t even have to be openSUSE’s installer. It just has to be a similar kernel. And since openSUSE uses modern kernels, any other distro with a modern kernel (such as Fedora) should work!
-
Follow the official openSUSE chroot instructions to mount and access all partitions from your openSUSE system.
-
You are now running the live system’s kernel, but it sees the openSUSE filesystem as its root (
/
) instead. -
Now just run
sudo update-bootloader --install
in the same terminal window, which will automatically repair the EFI entries. -
This method is also able to repair deeper issues with the bootloader and can even reinstall GRUB2 (check the official docs I linked in step 2), so it will be useful if you’ve got a really screwed up system. But first try method 1 which is much easier and less invasive.