Установка GRUB и настройка загрузочных записейПосле обзора и тестов материнской платы Asus Z9PE-D16/2L, которая стояла в моем домашнем сервере, этот самый сервер перестал загружаться, точнее BIOS в режиме UEFI не видел диски c EFI-разделом с загрузчиком GRUB:

А если включить CSM и режим загрузки дисков UEFI & Legacy (или просто Legacy) то диски появляются в меню загрузки, но загрузится с них не получается:

Давайте отойдем значительно назад, во время когда я написал инструкцию как установить Proxmox в RAID через Debian. Так вот, во время переустановки, Debian почему-то отказался устанавливать GRUB в EFI-раздел и мне пришлось самостоятельно устанавливать GRUB на каждый диск (по-русски здесь), и что самое важное, я вручную установил порядок загрузки дисков при помощи efibootmgr (по-русски можно здесь):
sudo efibootmgr -c -d /dev/sdb -p 1 -L "Linux" -l '\EFI\debian\grubx64.efi'
Мы тогда с ребятами на стриме разбирались в чем дело, но не разобрались, позже я доделал эту историю.
А во время тестов я вынул батарейку, питающую NVRAM (энергозависимая оперативная память BIOS) системной прошивки, и все настройки сбросились.
И здесь я допустил 2 ошибки:
GRUB на сервер с единственной ОС без опции --removableefibootmgrДавайте разбираться как быть в этой ситуации.
Чтобы исправить ситуацию нужно загрузиться с LiveCD. Так как у меня Debian, точнее Proxmox поверх Debian, то я скачал Debian Live Standard редакцию, то есть без рабочих столов, только консоль.
Загружаемся и переключамся на root:
sudo su -
Выведем список дисков при помощи lsblk:
$ sudo lsblk -o NAME,SIZE,TYPE,FSTYPE,PARTLABEL,PARTUUID,PARTTYPE
NAME SIZE TYPE FSTYPE PARTLABEL PARTUUID PARTTYPE
sda 238,5G disk
├─sda1 476M part vfat ESP b90ff200-1234-41f6-acd3-43d0860eb321 c12a7328-f81f-11d2-ba4b-00a0c93ec93b
└─sda2 238G part linux_raid_member ce4b0a0c-1e4f-4593-9726-55694e8583df a19d880f-05fc-4d3b-a006-743f0f84911e
└─md1 237,9G raid1 ext4
sdb 238,5G disk
├─sdb1 476M part vfat ESP 0956121c-3228-4f89-8fce-7d7de9a1fc1f c12a7328-f81f-11d2-ba4b-00a0c93ec93b
└─sdb2 238G part linux_raid_member cc9f8e52-5d88-44d8-82eb-0466a44f395a a19d880f-05fc-4d3b-a006-743f0f84911e
└─md1 237,9G raid1 ext4
sdc 0B disk
sdd 0B disk
sr0 1024M rom
nvme0n1 953,9G disk
└─nvme0n1p1 953,9G part ext4 22af38df-009c-495e-a24b-4a61ee6093c8 0fc63daf-8483-4772-8e79-3d69d8477de4
nvme1n1 953,9G disk
└─nvme1n1p1 953,9G part ext4 5799b3e6-1022-4fa9-90ec-702ff04646a8 0fc63daf-8483-4772-8e79-3d69d8477de4
Здесь видно, что нам нужны диски sda и sdb. Попробуем просмотреть по ним информацию через parted:
$ sudo parted /dev/sdb print
...
Partition Table: gpt
Number Start End Size File system Name Flags
1 1049kB 500MB 499MB fat32 ESP boot, esp
2 500MB 256GB 256GB raid
Или через fdisk:
$ sudo fdisk -l /dev/sda /dev/sdb
Disk /dev/sda: 238,47 GiB, 256060514304 bytes, 500118192 sectors
...
Disklabel type: gpt
...
Device Start End Sectors Size Type
/dev/sda1 2000 976895 974896 476M EFI System
/dev/sda2 976896 500117503 499140608 238G Linux RAID
Disk /dev/sdb: 238,47 GiB, 256060514304 bytes, 500118192 sectors
...
Disklabel type: gpt
...
Device Start End Sectors Size Type
/dev/sdb1 2048 976895 974848 476M EFI System
/dev/sdb2 976896 500117503 499140608 238G Linux RAID
Видно, что оба диска размечены как GPT, и на каждом есть EFI-раздел (примерно такая схема, но без swap):

Если примонтируем любой из EFI-разделов и посмотрим что внутри, то увидим путь /mnt/EFI/debian:
$ sudo /dev/sda1 /mnt
$ ls -la /mnt/EFI/
drwx------ 5 root root 4096 июн 4 21:15 .
drwx------ 3 root root 4096 янв 1 1970 ..
drwx------ 2 root root 4096 окт 18 2024 debian
Запомним и идем дальше.
В документации Debian по UEFI сказано, что UEFI (она же системная прошивка) по умолчанию пытается загрузить загрузчик операционной системы на EFI-разделе по пути /EFI/Boot/BOOTX64.EFI, это некий fallback. А вендоры (поставщики) операционных систем должны создавать загрузчики по пути /EFI/ и самостоятельно заносить информацию о загрузке системы в NVRAM.
Когда мы записываем загрузочную флешку, то на ней создается EFI-раздел куда копируется загрузчик по дефолтному пути /EFI/Boot/BOOTX64.EFI, чтобы любая UEFI-прошивка ее смогла увидеть без проблем.
А теперь представим ситуацию, что у нас несколько систем, и каждый вендор сделал все по документации, сделал свою директорию с загрузчиком на EFI-разделе, добавил запись в NVRAM, которая питается от батарейки на материнской плате. И внезапно батарейка садится и все данные в памяти NVRAM исчезают. Теперь мы не сможем загрузить ни одну операционную систему.
Но судя по все той же документации Debian про UEFI, можно найти информацию, что не все вендоры операционных систем придерживаются спецификации UEFI и создают свои загрузчики по дефолтному пути /EFI/Boot/BOOTX64.EFI.
Например, вот мой ноутбук купленный в 2022 году, изначально на нем стояла Windows, а позже я поставил Ubuntu 22.04 и она разместила свой загрузчик по дефолтному пути:

Теперь мы знаем как устроена загрузка операционной системы и стало понятно, что теперь нужно либо разместить загрузчик по дефолтному пути /EFI/Boot/BOOTX64.EFI либо вручную добавить записи с порядком загрузки операционных систем в NVRAM.
На своем домашнем сервере я сделал первое, так как у меня только одна ОС, но для полноты мы рассмотрим оба варианта.
Для установки загрузчика GRUB есть инструкция в документации Debian, а мы попробуем это повторить, если вы еще не загрузились в LiveCD, то пора это сделать. А потом эти команды::
# может потребоваться установка пакета grub-efi-amd64
# sudo apt update
# sudo apt install grub-efi-amd64
# монтируем корень ОС в /mnt
# у меня корень в рейде, он все-равно смонтируется
sudo mount /dev/md1 /mnt
# создаем директории загрузчиков для обоих дисков
sudo mkdir /mnt/boot/efi/sda1 /mnt/boot/efi/sdb1
# монтируем EFI-разделы в созданные директории
sudo mount /dev/sda1 /mnt/boot/efi/sda1
sudo mount /dev/sdb1 /mnt/boot/efi/sdb1
# монтируем устройства
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
# меняем корень операционной системы на только что сформированную файловую систему в /mnt
sudo chroot /mnt
# устанавливаем GRUB с флагом --removable это установить его по дефолтному пути на диске
grub-install --target=x86_64-efi --efi-directory=/boot/efi/sda1 --bootloader-id=GRUB_A --removable
grub-install --target=x86_64-efi --efi-directory=/boot/efi/sdb1 --bootloader-id=GRUB_B --removable
# обновляем GRUB
update-grub
# выходим из корня собранной файловой системы, т.е. возвращаемся назад
exit
# отмонтируем устройства
sudo umount /mnt/sys
sudo umount /mnt/proc
sudo umount /mnt/dev
# отмонтируем EFI-разделы
sudo umount /mnt/boot/efi/sdb1
sudo umount /mnt/boot/efi/sda1
# отмонтируем корень файловой системы на рейде
sudo umount /mnt
# перезагрузка
reboot
Теперь в BIOS будут доступны диски для загрузки ОС.
Раз уж зашла речь про загрузку, то давайте быстренько разберем как при помощи efibootmgr настроить загрузку с дисков:
Так мы можем узнать текущий список загрузки:
$ sudo efibootmgr -v
BootCurrent: 0002
Timeout: 1 seconds
BootOrder: 0001,0002,0003
Boot0001* UEFI: VendorCoProductCode 2.00 PciRoot(0x0)/Pci(0x1a,0x0)/USB(0,0)/USB(1,0)/HD(1,MBR,0x3d78d776,0x19fc,0x2540)AMBO
Boot0002* UEFI OS HD(1,GPT,b90ff200-1234-41f6-acd3-43d0860eb321,0x7d0,0xee030)/File(\EFI\BOOT\BOOTX64.EFI)
Boot0003* UEFI OS HD(1,GPT,0956121c-3228-4f89-8fce-7d7de9a1fc1f,0x800,0xee000)/File(\EFI\BOOT\BOOTX64.EFI)
Здесь в списке их 3, первый это загрузочная флешка, а остальные 2 это диски.
А вот так можно добавить новую запись:
# -c создать
# -d диск
# -p номер партиции
# -L метка
# -l путь до загрузчика на диске
sudo efibootmgr -c -d /dev/sdb -p 1 -L debian -l '\EFI\debian\grubx64.efi'
Больше деталей в справке:
sudo efibootmgr --help
За пару вечеров я вспомнил моменты освещенные в статье, что-то узнал нового, и починил загрузку ОС на сервере.