В настоящее время для запуска большинства популярных дистрибутивов GNU/Linux применяется загрузчик Grub 2, однако это далеко не лучший вариант. В данной статье мы рассмотрим, как можно запускать ядра Linux напрямую при помощи EFIStub, а в качестве менеджера использовать systemd-boot.
Предупреждение
Внимание! Действия, описанные в статье, могут привести к полной неработоспособности системы, поэтому настоятельно рекомендуется сделать полную резервную копию всех данных на диске.
Описанные в статье действия вы выполняете исключительно свой страх и риск. Никто не может гарантировать отсутствия ошибок, а также нести какой-либо ответственности за любые потери, либо повреждение данных, оборудования и т.д.
Если вас полностью устраивает стандартный загрузчик Grub 2, то переходить на описанный в данной статье вариант не следует.
Введение
Все современные материнские платы поддерживают технологию загрузки UEFI Boot, а ядра Linux способны загружаться через EFIStub, поэтому необходимость в отдельном загрузчике теперь отсутствует.
К сожалению, напрямую работать с EFIStub ядрами достаточно сложно и неудобно, а также часто может приводить к возникновению различных проблем из-за отсутствия автоматизации, поэтому мы воспользуемся специально созданным для этой цели менеджером systemd-boot.
Данный компонент представляет собой небольшой предварительный загрузчик, лишь передающий управление ядру, а также менеджер EFIStub ядер, позволяющий легко управлять ими и загружать необходимое.
Шаг 1. Проверка конфигурации системы
Убедимся, что система установлена и загружена в UEFI режиме:
test -d /sys/firmware/efi && echo EFI || echo Legacy
Если ответ EFI, то проверим, чтобы диск, на котором установлена система, использовал GPT разметку (тип метки диска: gpt):
sudo fdisk -l /dev/sda
Если же ответы были Legacy или msdos, то на этом следует прекратить ибо система не поддерживает UEFI загрузку.
Т.к. systemd-boot не подписан цифровой подписью, зайдём в настройки UEFI Boot и полностью отключим технологию Secure Boot.
Шаг 2. Изменение конфигурации разделов
На данный момент systemd-boot умеет загружать лишь ядра, расположенные внутри служебного UEFI раздела (далее ESP), поэтому его размер должен быть не меньше 512 МБ (по умолчанию создаётся 200 МБ).
Воспользуемся утилитой GParted или любой другой для изменения размера раздела ESP до 512 МБ за счёт любого другого.
По стандарту данный раздел должен быть первым на диске с GPT разметкой, иметь файловую систему FAT32 (vfat), а также установленные флаги +boot +efi.
Шаг 3. Удаление Grub 2
Полностью удалим установленный в системе загрузчик Grub 2, предварительный загрузчик shim и не функционирующий в UEFI режиме memtest86+ (экранирование звёздочек символом обратного слэша обязательно):
sudo dnf remove grubby grub2\* shim\* memtest86\*
Очистим остатки Grub 2 (файлы конфигурации, темы, BLS):
sudo rm -rf /boot/grub2 sudo rm -rf /boot/loader
Начиная с этого момента и до завершения всего процесса, перезагружать систему не следует ни при каком условии!
Шаг 4. Настройка точки монтирования
Откроем файл /etc/fstab в текстовом редакторе:
sudoedit /etc/fstab
Убедимся, что точка монтирования ESP раздела задана корректно:
UUID=ABCD-0123 /boot/efi vfat umask=0077,shortname=winnt 0 2
Здесь ABCD-0123 — это UUID, который можно определить при помощи sudo blkid.
Добавим параметр монтирования umask=0077 (при отсутствии), т.к. файловая система FAT32 не поддерживает права доступа и любой пользователь может вносить любые изменения, что для нас не приемлемо.
Сохраним изменения в файле.
Шаг 5. Настройка параметров ядра
В данной конфигурации параметры ядра будут указаны в файле /etc/kernel/cmdline в формате обычной строки, разделённые пробелом:
cat /proc/cmdline | cut -d ' ' -f 2- | sudo tee /etc/kernel/cmdline sudo chmod 644 /etc/kernel/cmdline
В данном примере будут автоматически использованы параметры текущего загруженного ядра из /proc/cmdline.
При необходимости внесём соответствующие правки:
sudoedit /etc/kernel/cmdline
Шаг 6. Установка systemd-boot
Установим systemd-boot в ESP:
sudo bootctl --path=/boot/efi install
Инициируем пересборку initrd ядра, а также сгенерируем новые файлы конфигурации:
sudo kernel-install add $(uname -r) /lib/modules/$(uname -r)/vmlinuz
Шаг 7. Перезагрузка системы
Проверим всё ли сделано верно и перезагрузим систему для применения изменений:
sudo systemctl reboot
Если всё было сделано верно, Fedora успешно загрузится при помощи EFIStub под управлением systemd-boot. В противном случае следует восстановить резервную копию, либо воспользоваться chroot с LiveUSB для решения возникших проблем.
Настройка параметров загрузки
Параметры загрузки допускается изменять в файле /boot/efi/loader/loader.conf:
sudoedit /boot/efi/loader/loader.conf
Литература
При написании статьи использовалась литература из следующих источников:
Т.е. оно вообще не работает с включенным Secure Boot?
Если подписать systemd-boot собственным удостоверяющим центром (CA), открытый ключ которого загрузить в список доверенных UEFI Secure Boot CA материнской платы, то всё будет работать и с включённым Secure Boot.
Выглядит сложно. Пожалуй останусь на стоковом решении от федоры, а там может сами что-то придумают.
Не думаю, что в ближайшее годы что-то изменится. По крайней мере пока systemd-boot не научится запускать ядра с отдельного /boot раздела.
Описанный в статье способ работает на моём лэптопе уже более 2 месяцев.
Сделал все до Шаг 6. Перезагрузка системы включительно. После перезагрузки: mount /new_root no filesystem type specified. You are now being dropped into an emergency shell. sh: can’t access tty; job control turned off [rootfs ]# Что не так?
Загрузитесь с Live и проверьте содержимое файла /etc/fstab.
Затем пересоберите образ initrd.
Проверил. Пересобрал. Не помогло. Та же ошибка
Нужно указать в файле /etc/kernel/cmdline правильные параметры ядра, например:
XXXXX-XXX-XXX-XXXXX — это UUID корневого раздела с Fedora.
В общем разобрался, что нужно вручную создать entries и редактировать конфиг
Уже пять раз все переделал,никаких ошибок, в итоге одно и тоже.
У вас UEFI Secure Boot отключён? Он не будет работать без подписывания systemd-boot модуля собственным удостоверяющим центром.
Нужно добавить параметры ядра в файл /etc/kernel/cmdline. Обновил статью.
У меня в папке boot создается папка с различным набором символов в нутри которой папка с названием ядра. Так и должно быть?
Да, это нормально. Случайный набор символов — это уникальный ID компьютера, присвоенный systemd.