UEFI, GRUB и загрузка Linux-серверов: полное руководство для администратора

Задача: стандартизация загрузки 120 серверов

Оператор дата-центра «ДатаЦентрОдин» управляет 120 серверами разных поколений — от Dell PowerEdge R630 (2015 года) до R750xs (2024). Часть серверов загружается в Legacy BIOS режиме с MBR, часть — в UEFI с GPT. Единого стандарта нет, и каждое восстановление после сбоя — это индивидуальный квест.

Задачи:

  • Перевести все серверы на UEFI-загрузку с единым стандартом
  • Настроить Secure Boot с кастомными ключами
  • Обеспечить удалённое восстановление загрузки без физического доступа
  • Развернуть PXE-загрузку для автоматического provisioning новых серверов

UEFI vs Legacy BIOS: почему пора мигрировать

Legacy BIOS загружает систему через цепочку: BIOS → MBR (512 байт) → загрузчик → ядро. MBR содержит код загрузчика и таблицу разделов, ограниченную 4 первичными разделами и 2 ТБ на диск.

UEFI работает иначе: прошивка читает загрузчик напрямую из файловой системы FAT32 на специальном ESP-разделе (EFI System Partition). Нет ограничения в 512 байт, поддерживается GPT (128 разделов, диски до 9.4 ЗБ), Secure Boot для защиты от руткитов.

Проверка текущего режима загрузки:

# Если каталог существует — система загружена в UEFI-режиме
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "Legacy BIOS"

# Подробная информация о UEFI
efibootmgr -v

# Пример вывода:
# BootCurrent: 0001
# BootOrder: 0001,0000,0002
# Boot0000* EFI Network   PciRoot(0x0)/Pci(0x1c,0x0)/.../MAC(..)
# Boot0001* debian        HD(1,GPT,...)/File(\EFI\debian\grubx64.efi)
# Boot0002* UEFI: Built-in EFI Shell

Каждая запись в NVRAM указывает на конкретный .efi файл на ESP-разделе. В отличие от MBR, где загрузчик привязан к первому сектору диска, UEFI хранит путь к загрузчику в энергонезависимой памяти — это надёжнее и гибче.

ESP-раздел и установка GRUB2

ESP (EFI System Partition) — обязательный раздел с файловой системой FAT32, на котором хранятся загрузчики. Стандартный размер — 512 МБ (с запасом для нескольких ядер и загрузчиков).

# Создание ESP-раздела на новом диске
sudo parted /dev/sda -- mklabel gpt
sudo parted /dev/sda -- mkpart ESP fat32 1MiB 513MiB
sudo parted /dev/sda -- set 1 esp on
sudo mkfs.fat -F32 /dev/sda1

# Монтирование
sudo mkdir -p /boot/efi
sudo mount /dev/sda1 /boot/efi

# Запись в fstab
echo "UUID=$(blkid -s UUID -o value /dev/sda1) /boot/efi vfat umask=0077 0 1" | sudo tee -a /etc/fstab

Установка GRUB2 для UEFI:

# Правильная команда установки GRUB
sudo grub-install --target=x86_64-efi \
  --efi-directory=/boot/efi \
  --bootloader-id=debian \
  --recheck

# ВАЖНО: НЕ используйте --root-directory=/boot — это вызывает ошибки конфигурации

# Что создаётся:
# /boot/efi/EFI/debian/grubx64.efi  — загрузчик
# /boot/efi/EFI/debian/grub.cfg      — мини-конфиг (указывает на основной)
# Запись в NVRAM через efibootmgr

# Обновление конфигурации GRUB
sudo update-grub
# или
sudo grub-mkconfig -o /boot/grub/grub.cfg

Важный нюанс: файл grubx64.efi содержит встроенный мини-конфиг с путём к основному конфигу (prefix). Это можно проверить:

# Просмотр встроенного prefix
strings /boot/efi/EFI/debian/grubx64.efi | grep -E '(prefix|grub\.cfg)'
# /boot/grub  — GRUB будет искать grub.cfg в /boot/grub/

Параметры ядра и оптимизация загрузки

Для серверов важны правильные параметры ядра. Мы стандартизировали /etc/default/grub для всех машин:

# /etc/default/grub — серверная конфигурация

# Параметры ядра
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS1,115200n8 \
  net.ifnames=1 \
  intel_iommu=on \
  iommu=pt \
  transparent_hugepage=never \
  numa_balancing=disable \
  mitigations=auto"

# Таймаут загрузки
GRUB_TIMEOUT=5
GRUB_TIMEOUT_STYLE=menu

# Вывод на serial console (для IPMI/iDRAC)
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=1 --word=8 --parity=no --stop=1"

# Не прятать меню GRUB
GRUB_HIDDEN_TIMEOUT=
GRUB_HIDDEN_TIMEOUT_QUIET=false

Разбор ключевых параметров:

  • console=ttyS1,115200n8 — вывод на serial console для удалённого доступа через IPMI/iDRAC. Serial порт 1, скорость 115200 бод.
  • intel_iommu=on + iommu=pt — включение IOMMU для проброса устройств в виртуальные машины (passthrough mode).
  • transparent_hugepage=never — отключаем THP, который вызывает латентные паузы в базах данных (PostgreSQL, Redis).
  • numa_balancing=disable — для серверов с явной NUMA-привязкой VM/контейнеров.
# Применяем изменения
sudo update-grub

# Проверяем текущие параметры ядра
cat /proc/cmdline

Восстановление загрузки: rescue и chroot

Сервер не загружается — самый частый вызов в дата-центре. Три типичных сценария и решения:

Сценарий 1: GRUB не находит конфигурацию (grub rescue)

# В grub rescue доступны базовые команды
grub rescue> ls
# (hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3)

grub rescue> ls (hd0,gpt2)/boot/grub/
# grub.cfg grub.cfg.bak fonts/ ...

# Устанавливаем prefix и загружаем normal module
grub rescue> set prefix=(hd0,gpt2)/boot/grub
grub rescue> insmod normal
grub rescue> normal
# GRUB загрузится с нормальным меню

Сценарий 2: ядро не загружается (kernel panic)

# Через IPMI/iDRAC загружаем rescue-образ
# В меню GRUB выбираем предыдущее ядро
# Или через grub command line:
grub> linux /vmlinuz-5.15.0-91-generic root=/dev/sda2
grub> initrd /initrd.img-5.15.0-91-generic
grub> boot

Сценарий 3: повреждён загрузчик или ESP

# Загружаемся с live USB/ISO через iDRAC Virtual Media
# Монтируем систему
sudo mount /dev/sda2 /mnt
sudo mount /dev/sda1 /mnt/boot/efi
sudo mount --bind /dev /mnt/dev
sudo mount --bind /dev/pts /mnt/dev/pts
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo mount --bind /sys/firmware/efi/efivars /mnt/sys/firmware/efi/efivars

# Входим в chroot
sudo chroot /mnt

# Переустанавливаем GRUB
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --recheck
update-grub

# Проверяем запись в NVRAM
efibootmgr -v

# Выходим и перезагружаемся
exit
sudo umount -R /mnt
sudo reboot

Удалённое управление: IPMI, iLO, iDRAC

В дата-центре физический доступ к серверу — роскошь. Все серверные платформы имеют BMC (Baseboard Management Controller) с удалённым доступом:

  • Dell iDRAC — Dell PowerEdge серверы
  • HP iLO — HP ProLiant серверы
  • Supermicro IPMI — Supermicro и белые сборки

Настройка IPMI для удалённого управления:

# Установка ipmitool
sudo apt install ipmitool

# Настройка сети BMC (через ОС)
sudo ipmitool lan set 1 ipsrc static
sudo ipmitool lan set 1 ipaddr 172.16.0.101
sudo ipmitool lan set 1 netmask 255.255.255.0
sudo ipmitool lan set 1 defgw ipaddr 172.16.0.1

# Создание пользователя
sudo ipmitool user set name 2 admin
sudo ipmitool user set password 2 "сложный-пароль"
sudo ipmitool user enable 2
sudo ipmitool channel setaccess 1 2 callin=on ipmi=on link=on privilege=4

# Удалённое управление питанием
ipmitool -I lanplus -H 172.16.0.101 -U admin -P "пароль" chassis power status
ipmitool -I lanplus -H 172.16.0.101 -U admin -P "пароль" chassis power reset

# Доступ к serial console (для отладки загрузки)
ipmitool -I lanplus -H 172.16.0.101 -U admin -P "пароль" sol activate
# Serial Over LAN — видим весь процесс загрузки, GRUB, ядро

SOL (Serial Over LAN) — ключевая функция для отладки загрузки. Именно для этого мы настроили console=ttyS1,115200n8 в параметрах ядра: весь вывод загрузки дублируется на serial порт, доступный через IPMI.

UEFI Secure Boot с кастомными ключами

Secure Boot защищает от руткитов, проверяя цифровую подпись загрузчика и ядра. По умолчанию используются ключи Microsoft, что не всегда приемлемо для корпоративных серверов.

# Проверка статуса Secure Boot
mokutil --sb-state
# SecureBoot enabled

# Генерация собственных ключей
# PK (Platform Key) — корневой ключ, один на организацию
openssl req -new -x509 -newkey rsa:2048 -keyout PK.key -out PK.crt \
  -days 3650 -nodes -subj "/CN=DataCenter One PK/"

# KEK (Key Exchange Key) — ключ для обновления db
openssl req -new -x509 -newkey rsa:2048 -keyout KEK.key -out KEK.crt \
  -days 3650 -nodes -subj "/CN=DataCenter One KEK/"

# db (Signature Database) — ключ для подписи загрузчиков и ядер
openssl req -new -x509 -newkey rsa:2048 -keyout db.key -out db.crt \
  -days 3650 -nodes -subj "/CN=DataCenter One db/"

# Подписываем GRUB и ядро нашим ключом
sudo sbsign --key db.key --cert db.crt \
  --output /boot/efi/EFI/debian/grubx64.efi.signed \
  /boot/efi/EFI/debian/grubx64.efi

sudo sbsign --key db.key --cert db.crt \
  --output /boot/vmlinuz-$(uname -r).signed \
  /boot/vmlinuz-$(uname -r)

# Регистрация ключей через UEFI firmware
# или через mokutil для Machine Owner Key
sudo mokutil --import db.crt

Для автоматизации подписи новых ядер при обновлении мы создали хук:

# /etc/kernel/postinst.d/sign-kernel
#!/bin/bash
KERNEL_VERSION=$1
sbsign --key /etc/secureboot/db.key --cert /etc/secureboot/db.crt \
  --output /boot/vmlinuz-${KERNEL_VERSION} \
  /boot/vmlinuz-${KERNEL_VERSION}
echo "Kernel ${KERNEL_VERSION} signed for Secure Boot"

PXE-загрузка и автоматический provisioning

Для установки ОС на новые серверы мы используем PXE (Preboot Execution Environment). Сервер загружается по сети, получает IP через DHCP, загружает установщик через TFTP и автоматически устанавливает ОС по preseed-шаблону.

# Компоненты PXE-сервера
sudo apt install dnsmasq pxelinux syslinux-efi

# /etc/dnsmasq.conf — DHCP + TFTP для PXE
interface=eth1
dhcp-range=172.16.1.100,172.16.1.200,255.255.255.0,1h

# UEFI PXE boot
dhcp-match=set:efi-x86_64,option:client-arch,7
dhcp-match=set:efi-x86_64,option:client-arch,9
dhcp-boot=tag:efi-x86_64,grubnetx64.efi.signed

# Legacy PXE boot (для старых серверов)
dhcp-match=set:bios,option:client-arch,0
dhcp-boot=tag:bios,pxelinux.0

enable-tftp
tftp-root=/srv/tftp

Preseed-файл для автоматической установки Debian:

# /srv/www/preseed/server-standard.cfg
d-i debian-installer/locale string en_US.UTF-8
d-i keyboard-configuration/xkb-keymap select us
d-i netcfg/choose_interface select auto

# Разметка диска: GPT + ESP + RAID1 (boot) + LVM
d-i partman-auto/method string lvm
d-i partman-auto/disk string /dev/sda /dev/sdb
d-i partman-auto-lvm/guided_size string max
d-i partman-efi/non_efi_system boolean true

# Пакеты
tasksel tasksel/first multiselect ssh-server
d-i pkgsel/include string \
  vim htop tmux curl wget git \
  prometheus-node-exporter \
  smartmontools mdadm

# Post-install: регистрация в системе управления
d-i preseed/late_command string \
  in-target bash -c 'curl -s https://deploy.dc1.local/register | bash'

Весь процесс от включения нового сервера до готовой ОС с базовым мониторингом занимает 15 минут без участия инженера. Подробнее о серверном администрировании и автоматизации — на itfresh.ru.

Часто задаваемые вопросы

Проверьте наличие каталога /sys/firmware/efi — если он существует, система загружена в UEFI-режиме. Команда efibootmgr -v покажет все загрузочные записи NVRAM. Если каталога нет — система работает в Legacy BIOS с MBR.
Это значит, что GRUB не нашёл модуль normal или конфигурацию. В grub rescue выполните ls для просмотра разделов, найдите /boot/grub/ через ls (hd0,gptN)/boot/grub/, затем set prefix=(hd0,gptN)/boot/grub, insmod normal, normal. После загрузки ОС выполните grub-install и update-grub для постоянного исправления.
Serial console (console=ttyS1,115200n8) дублирует весь вывод загрузки на serial порт, доступный через IPMI/iDRAC/iLO. Это позволяет видеть процесс загрузки, меню GRUB и kernel panic удалённо, без физического доступа к серверу и без настройки графической консоли.
Используйте grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --recheck. Не добавляйте --root-directory=/boot — это вызывает ошибки. После установки выполните update-grub для генерации конфигурации. Всегда проверяйте efibootmgr -v после установки, чтобы убедиться, что запись в NVRAM создана корректно.
Да. Сгенерируйте PK, KEK и db ключи через openssl, подпишите загрузчик и ядро через sbsign, зарегистрируйте ключи в UEFI firmware. Для автоматизации создайте хук в /etc/kernel/postinst.d/, который подписывает новые ядра при установке. Учитывайте, что без ключей Microsoft не загрузятся Windows и некоторые сторонние драйверы.

Нужна помощь с проектом?

Специалисты АйТи Фреш помогут с архитектурой, DevOps, безопасностью и разработкой — 15+ лет опыта

📞 Связаться с нами
#UEFI#GRUB#загрузка Linux#ESP#Secure Boot#IPMI#iDRAC#PXE
Комментарии 0

Оставить комментарий

загрузка...