Failed to find the windows efibootmgr

Пошаговая инструкция по восстановлению поврежденного или удаленного загрузчика Windows 10 / 8.1 на компьютере с UEFI при помощи загрузочного или установочного

В этой статье мы разберемся, как восстановить загрузчик 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 (синий экран смерти) с ошибкой:

Ошибка загрузки Windows 8: The boot configuration data for your PC is missing or contains errors. File :EFIMicrosoftBootBCD Error code: 0xc000000f

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), как правило, в таких случаях бессильна. Но попробовать все-же стоит:

  1. Загрузитесь с диска загрузочного диска, диска восстановления или установочной флешки с Windows 10 или 11;
  2. На экране установки нажмите кнопку Восстановление системы;
  3. Затем выберите пункт Поиск и устранение неисправностей -> Восстановление при загрузке и выберите ОС, загрузчик которой нужно попытаться восстановить;Автоматическое восстановление при загрузке
  4. Но скорее всего результат будет отрицательный: Восстановление при загрузке не удалось восстановить компьютервосстановить загрузчик автоматически не удалось

Ручное восстановление загрузчика Windows с помощью BCDBoot

Перейдем к процедуре ручного восстановления EFI загрузчика Windows на UEFI компьютере.

Для восстановления конфигурации загрузчика (BCD), вам нужно загрузить компьютер с оригинального установочного диска с Windows (диска восстановления или специально подготовленной установочной USB флешки с Windows ). После загрузки в среде восстановления нужно открыть окно командной строки: выберите Восстановление системы -> Диагностика -> Командная строка (System Restore -> Troubleshoot -> Command Prompt).

Командную строку также можно запустить, если у вас под рукой есть только установочный диск с Windows. Для этого достаточно на самом первом этапе установки Windows (при выборе языка и раскладки клавиатуры) нажать комбинацию клавиш Shift+F10 (или Shift+Fn+F10 на некоторых моделях ноутбуков).

Коммандная строка восстановление системы Windows 8

В открывшейся командной строке выполните запустите утилиту управления дисками, набрав команду:

diskpart

Выведите список дисков в системе:

list disk

На этом этапе очень важно определить тип таблицы разделов на диске, на котором установлена Windows: MBR или GPT. Дело в том, что EFI загрузчик используется только на дисках с GPT разметкой.

Если у диска в столбце Gpt указана звездочка (
*
), тогда на диске используется таблица разделов GPT, если нет – MBR.

какая таблица разделов на диске 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 и msr разделы в windows10

В нашем примере видно, что загрузочный раздел 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 в winpe

Если этих каталогов нет, значит вашему диску с 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
.

bcdedit вывод конфигурации windows boot manager файл bootmgfw.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 tongue

#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 yikes

#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.

  1. BIOS boot: legacy boot off
  2. BIOS boot: secure boot off
  3. BIOS boot bootsequence: put your live media (USB Stick for me) before harddisk/SSD
  4. Window: Fast Boot off (beim drücken des Netzschalters: herunterfahren)
  5. 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

  1. boot from live usb, configure correct keyboard, prepare/delete partitions etc.
  2. in a terminal enter: ubiquity -b . This starts mint installation with the usual panels but without boot installation

(c) install grub

  1. find the EFI partition (small partition dos formatted, in my case sda1
  2. sudo mkdir /boot/efi
  3. sudo mount /dev/sda1 /boot/efi
  4. 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 )

  1. 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 )
  2. 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
  3. 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
  4. find the window loader in the EFI partition, in my case EFI/Microsoft/Boot/bootmgfw.efi
  5. cd /boot/efi/EFI; sudo cp ubuntu/grubx64.efi Microsoft/Boot copy grub to folder with windows loader
  6. 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)
  7. 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 :D ! )

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

  1. grub uses an american keyboard. I didn’t bother to configure my swiss keyboard, but just looked at the american keyboard layout
  2. ls to see all partitions grub knows about. In my case (hd0,gpt1) etc.
  3. 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)
  4. set root=(hd0,gpt5) – this specifies the partition from which to load the images.
  5. linux /vmlinuz ro root=/dev/sda5 – Load this Linux kernel, with arguments — /vmlinuz is normally a link to the last installed kernel
  6. initrd /initrd.img – load this Initial RAM disk. this is normally alink to the img of the last installed kernel
  7. boot – tell grub to boot with the above specs

(f) configure grub — to linux
This configuration is done running the new linux the SSD.

  1. 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
  2. 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
  3. cd /boot/grub; sudo mv grub.cfg.new grub.cfg — rename the partly built config file to be active
  4. sudo grub-update

Now the system boots directly to the new linux on the SSD :D — at least it did for me

(g) configure grub — show menu

  1. switch off hidden timeout in /etc/default/grub by prepending a # to the pertinent line. Then it’s only a comment and looks like
  2. 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
  3. if the notebook comes back from hibernation, grub uses the timeout after error (30 secs), which I also change
  4. 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

  1. 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)

  2. 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

  1. sudo dpkg -r grub-efi removes the package
  2. 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.

:D suprise :D ! 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

  1. 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.
  2. 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, не утонув в руководствах и ничего не сломав?

Я обещал «самое краткое руководство». Вот оно:

  1. Создаём на диске таблицу разделов GPT
  2. Создаём FAT32-раздел на пару сотен мегабайт
  3. Скачиваем из интернета любой UEFI-загрузчик
    (нам нужен сам загрузчик, это один бинарный файл!)
  4. Переименовываем и кладем этот файл на созданный раздел по адресу /EFI/Boot/bootx64.efi
  5. Создаём текстовый конфиг, кладем его там, где загрузчик ожидает его увидеть
    (настройка и местоположение конфига зависят от конкретной реализации загрузчика, эта информация доступна в интернете)
  6. После перезагрузки видим меню загрузчика
    (Если на диске установлена 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 — система будет спокойно загружаться с флешки, не видя разницы.

View previous topic :: View next topic   Author Message tr1stan
n00b
n00b

Joined: 06 Mar 2021
Posts: 45

PostPosted: Thu Jun 24, 2021 3:53 pm    Post subject: os-prober does not detect windows bootloader Reply with quote

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:

Code:

Generating grub configuration file …

Found linux image: /boot/vmlinuz-5.10.27-gentoo-x86_64

Found initrd image: /boot/initramfs-5.10.27-gentoo-x86_64.img

Warning: os-prober will be executed to detect other bootable partitions.

It’s output will be used to detect bootable binaries on them and create new boot entries.

Adding boot menu entry for UEFI Firmware Settings …

done

output of fdisk -l:

Code:

Disk /dev/nvme1n1: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors

Disk model: KINGSTON SA2000M81000G                 

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disklabel type: gpt

Disk identifier: 3F12D7F7-EE82-4C8F-84C7-D9770F17DEF7

Device         Start        End    Sectors   Size Type

/dev/nvme1n1p1  2048      34815      32768    16M Microsoft reserved

/dev/nvme1n1p2 34816 1953523711 1953488896 931.5G Microsoft basic data

Disk /dev/nvme0n1: 465.76 GiB, 500107862016 bytes, 976773168 sectors

Disk model: KINGSTON SA2000M8500G                   

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disklabel type: gpt

Disk identifier: 0712CE03-1541-4CEC-A818-7BE7541C999C

Device          Start       End   Sectors   Size Type

/dev/nvme0n1p1   2048    264191    262144   128M EFI System

/dev/nvme0n1p2 264192 976773134 976508943 465.6G Linux filesystem

Disk /dev/sda: 953.87 GiB, 1024209543168 bytes, 2000409264 sectors

Disk model: KINGSTON SKC6001

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 4096 bytes

I/O size (minimum/optimal): 4096 bytes / 4096 bytes

Disklabel type: gpt

Disk identifier: 53D73342-7D4B-4A07-B4F1-D98D54182C07

Device     Start        End    Sectors   Size Type

/dev/sda1   2048 2000409230 2000407183 953.9G Linux filesystem

Disk /dev/sdb: 1.82 TiB, 2000398934016 bytes, 3907029168 sectors

Disk model: ST2000DM008-2FR1

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 4096 bytes

I/O size (minimum/optimal): 4096 bytes / 4096 bytes

Disklabel type: gpt

Disk identifier: F37BDEC7-19F2-48B7-95CF-48F0BEBD84D7

Device     Start        End    Sectors  Size Type

/dev/sdb1   2048 3907029134 3907027087  1.8T Linux filesystem

The windows bootloader called bootmgfw.efi which it was supposed to see is located on the

partition in C:Windows/Boot/EFI/ folder.

In my /boot/EFI/ folder is only an entry for gentoo.

Back to top alamahant
Advocate
Advocate

Joined: 23 Mar 2019
Posts: 3279

Back to top tr1stan
n00b
n00b

Joined: 06 Mar 2021
Posts: 45

PostPosted: Thu Jun 24, 2021 8:28 pm    Post subject: Reply with quote

output of efibootmgr -v:

Code:
BootCurrent: 0005

Timeout: 1 seconds

BootOrder: 0005,0002,0003,0009,000F,0007,0004,0000,0001

Boot0000* Windows Boot Manager  VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)WINDOWS………x…B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}…,…………….

Boot0001* Pop!_OS 20.10 VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)

Boot0002* KINGSTON SA2000M8500G BBS(HD,,0x0)..BO

Boot0003* KINGSTON SA2000M81000G        BBS(HD,,0x0)..BO

Boot0004* Fedora        VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)

Boot0005* gentoo        HD(1,GPT,0f9bd712-926c-9744-976b-75840aad1649,0x800,0x40000)/File(EFIgentoogrubx64.efi)

Boot0007* Pop!_OS 20.10 VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)

Boot0009* KINGSTON SKC6001024G  BBS(HD,,0x0)..BO

Boot000F* ST2000DM008-2FR102    BBS(HD,,0x0)..BO

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:

Invalid BootNext value99e275e7-75a0-4b37-a2e6-c5385e6c00cb

^

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…

Back to top alamahant
Advocate
Advocate

Joined: 23 Mar 2019
Posts: 3279

PostPosted: Thu Jun 24, 2021 8:29 pm    Post subject: Reply with quote

No no try

To remove old fedora and pop-os do this

Code:

efibootmgr -b 0004 -B

efibootmgr -b 0007 -B



NOTE:

I made a mistake.

Maybe you should not do anything to your efi partition.

Grub should be able to recognize Windows and create an entry for it.

If it doesnt it means there is something missing.

Do you have ntfs-3g dosfstools installed?

SORRY my bad.

FURTHER EDIT

I have no windows installed in my system but I DO have the Microsoft directory in my ESP and when i update grub i get

Code:

Generating grub configuration file …

Found linux image: /boot/vmlinuz-5.12.13-gentoo

Found initrd image: /boot/intel-uc.img /boot/initramfs-5.12.13-gentoo.img

Found linux image: /boot/vmlinuz-5.12.9-gentoo

Found initrd image: /boot/intel-uc.img /boot/initramfs-5.12.9-gentoo.img

Warning: os-prober will be executed to detect other bootable partitions.

Its output will be used to detect bootable binaries on them and create new boot entries.

Found Windows Boot Manager on /dev/sdb1@/EFI/Microsoft/Boot/bootmgfw.efi



So yes .

Plz make a directory Micrososoft in your ESP and copy the windows «boot» inside «Microsoft»
_________________
:)

Last edited by alamahant on Thu Jun 24, 2021 8:51 pm; edited 1 time in total

Back to top tr1stan
n00b
n00b

Joined: 06 Mar 2021
Posts: 45

Back to top tr1stan
n00b
n00b

Joined: 06 Mar 2021
Posts: 45

Back to top alamahant
Advocate
Advocate

Joined: 23 Mar 2019
Posts: 3279

Back to top tr1stan
n00b
n00b

Joined: 06 Mar 2021
Posts: 45

PostPosted: Thu Jun 24, 2021 8:58 pm    Post subject: Reply with quote

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…

Code:

Found Windows Boot Manager on /dev/sdb1@/EFI/Microsoft/Boot/bootmgfw.efi

:(

Back to top alamahant
Advocate
Advocate

Joined: 23 Mar 2019
Posts: 3279

Back to top tr1stan
n00b
n00b

Joined: 06 Mar 2021
Posts: 45

PostPosted: Sat Jun 26, 2021 6:23 pm    Post subject: Reply with quote

So creating a file at /etc/grub.d/40_custom with this would do the trick?

Code:

menuentry «Windows 10 UEFI/GPT» {

    insmod part_gpt

    insmod search_fs_uuid

    insmod chain

    search —fs-uuid —no-floppy —set=root 3F12D7F7-EE82-4C8F-84C7-D9770F17DEF7

    chainloader ($root)/Windows/Boot/EFI/bootmgfw.efi

}

Back to top tr1stan
n00b
n00b

Joined: 06 Mar 2021
Posts: 45

Back to top

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.

  1. Boot ANY Linux live environment. Doesn’t even have to be openSUSE’s installer.

  2. 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).

  3. 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.

  4. 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 or sda6 or whatever PARTITION as part of the device name. The partition must be given as a separate parameter instead.

  5. So, for my system where the Linux EFI was on nvme1n1p6, it means my device is nvme1n1 and my partition is 6. If it had been on a SATA drive such as sda2, it would have meant the device is sda and partition is 2. This is all you HAVE TO understand. If you try giving the full nvme1n1p6 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.

  6. 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).

  7. That’s it. Your «secure boot» bootloader is restored.

  8. 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 named GRUB.EFI instead, so just remove the X64 from the -l parameter if you are on 32-bit).

  9. 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.

  1. 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!

  2. Follow the official openSUSE chroot instructions to mount and access all partitions from your openSUSE system.

  3. You are now running the live system’s kernel, but it sees the openSUSE filesystem as its root (/) instead.

  4. Now just run sudo update-bootloader --install in the same terminal window, which will automatically repair the EFI entries.

  5. 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.

Like this post? Please share to your friends:
  • Fable 3 тормозит на windows 7
  • Fable 3 сохранения где лежат windows 10
  • Fable 3 не обнаружен cd dvd rom драйв на windows 10
  • Fabfilter pro q 3 скачать торрент windows
  • F8 при загрузке windows 10 что делает