Загрузочное меню UEFI 101
При загрузке UEFI могут использоваться два boot-menu:
меню firmware, хранящееся в NVRAM. Можно вызвать при включении компьютера по hotkey (F8/Esc/etc). Отображается в настройках Gen 2 VM Hyper-V (при этом можно менять порядок загрузки, но не сами записи).
меню загрузчика (опционально). В Linux это меню GRUB, в Windows - bootmgr (отображается, если содержит больше одной записи). Современное ядро Linux может загружаться напрямую без GRUB.
В firmware загрузка настраивается через текстовые переменные:
Boot####
- загрузочная записьBootOrder
- упорядоченный список записей Boot####BootCurrent
- запись, с которой загружена системаBootNext
- запись, с которой однократно будет загружена система после перезагрузки
Первоначально firmware добавляет записи Boot####
для подключенных поддерживающих загрузку устройств (DVD, HDD, USB, Network).
При загрузке с диска происходит поиск на нем GPT раздела типа EFI system partition (ESP), с которого запускается загрузчик EFI\Boot\bootx64.efi
(имя файла зависит от аппаратной платформы). Обычно этот раздел отформатирован в FAT32, так как большинство прошивок UEFI не поддерживают чтение других файловых систем (хотя и могли бы).
Созданные Rufus загрузочные UEFI-флешки с Windows содержат основной NTFS раздел с дистрибутивом (FAT32 не поддерживает файлы размером больше 4Gb) и скрытый FAT32 ESP раздел с фирменным EFI загрузчиком, поддерживающим чтение NTFS.
Загрузчик ОС может добавить (и обычно добавляет) в firmware новую запись Boot####
:
Windows: HD(1,GPT,E935CDDD-9506-45D3-A96B-9354674BA581,0x800,0x32000)/\EFI\Microsoft\Boot\bootmgfw.efi
Linux: HD(1,GPT,F3275A6A-A4B2-4AD4-A8C1-D74B9C4E9691,0x800,0x12C000)/\EFI\redos\shimx64.efi
Загрузчик shimx64.efi
может быть подписан цифровой подписью для работы с Secure boot, его единственная функция - запустить grubx64.efi из текущей директории. grubx64.efi не подписан, так как его содержимое может изменяться.
В некоторых случаях при переносе диска между ПК или VM в новой системе ОС не загружается. Например, если в NVRAM старой системы была настроенная запись Boot####
, а стандартный раздел EFI boot поврежден или не содержит загрузчик в стандартном расположении. В этом случае необходимо или восстановить запись утилитами bcdedit/efibootmgr, или, в случае VM, переносить ее через export/import вместе с nvram.
Посмотреть загрузочные записи firmware
Windows
bcdedit /enum firmware
bcdedit /enum "{fwbootmgr}"
###(displayorder = BootOrder)###
Linuxefibootmgr -v
Однократно загрузиться с конкретной записи
Windows
bcdedit /set {fwbootmgr} bootsequence {GUID}
bcdedit /set {fwbootmgr} bootsequence {bootmgr}
###(bootsequence = BootNext)###
Linuxefibootmgr --bootnext 0003
Изменить порядок загрузки
Windows
bcdedit /set {fwbootmgr} displayorder {98b6343e-bc5c-11ef-8148-00155d518900}
bcdedit /set {fwbootmgr} displayorder {bootmgr} /addfirst
Linuxefibootmgr --bootorder 0003,0000,0001
Почитать:
https://uefi.org/specs/UEFI/2.10/03_Boot_Manager.html
https://www.rodsbooks.com/refind/
Если в чем-то ошибаюсь, буду признателен вашим комментариям.