systemd-boot (Русский)
systemd-boot(7) (ранее известный как gummiboot) — это простой менеджер загрузки для UEFI. Он предоставляет текстовое меню для выбора загрузочной записи и редактор параметров ядра. Он входит в состав пакета systemd.
Имейте в виду, что systemd-boot умеет запускать только EFI-приложения (например, ядро Linux через EFISTUB, UEFI Shell, GRUB или Windows Boot Manager).
Установка
Установка менеджера загрузки EFI
Перед установкой systemd-boot убедитесь, что система загружена в режиме UEFI и что есть доступ к переменным UEFI. Это можно проверить командой efivar --list
или, если efivar не установлен, командой ls /sys/firmware/efi/efivars
(если каталог существует, то система загружена в режиме UEFI).
В примерах ниже esp
обозначает точку монтирования системного раздела EFI, например /efi
или /boot
. Также предполагается, что вы выполнили chroot в точку монтирования корневого раздела системы.
Используйте команду bootctl(1) для установки systemd-boot в системный раздел EFI:
# bootctl install
Она скопирует менеджер загрузки EFI systemd-boot в ESP, создаст загрузочную запись в UEFI и изменит порядок загрузки.
- На x64 UEFI выполняется копирование
/usr/lib/systemd/boot/efi/systemd-bootx64.efi
вesp/EFI/systemd/systemd-bootx64.efi
иesp/EFI/BOOT/BOOTX64.EFI
. - На IA32 UEFI выполняется копирование
/usr/lib/systemd/boot/efi/systemd-bootia32.efi
вesp/EFI/systemd/systemd-bootia32.efi
иesp/EFI/BOOT/BOOTIA32.EFI
.
Загрузочная запись UEFI будет иметь название «Linux Boot Manager» и указывать, в зависимости от разрядности UEFI, на файл \EFI\systemd\systemd-bootx64.efi
или \EFI\systemd\systemd-bootia32.efi
в ESP.
- При запуске
bootctl install
systemd-boot попробует найти системный раздел EFI в/efi
,/boot
и/boot/efi
. Если он примонтирован в другое место, нужно добавить опцию--esp-path=esp
(смотрите bootctl(1) § OPTIONS). - Установка systemd-boot перезапишет существующие файлы
esp/EFI/BOOT/BOOTX64.EFI
(илиesp/EFI/BOOT/BOOTIA32.EFI
на IA32 UEFI), в частности, версию файла от Microsoft.
Затем переходите к настройке systemd-boot.
Установка с использованием XBOOTLDR
Для хранения ядра и initramfs отдельно от ESP можно создать отдельный раздел /boot типа «Linux extended boot» (XBOOTLDR). Это особенно удобно при двойной загрузке с Windows, когда уже имеющийся ESP слишком маленький.
Подготовьте ESP как обычно и создайте на том же физическом диске ещё один раздел для XBOOTLDR. Он должен иметь GUID типа раздела bc13c2ff-59e6-4262-a352-b275fd6f7172
[1]. Размер раздела XBOOTLDR должен быть достаточно большим для размещения всех устанавливаемых ядер.
- systemd-boot не выполняет проверку файловой системы, как это делается для ESP. Таким образом, можно использовать любую файловую систему, которую может прочитать ваша реализация UEFI.
- При включении быстрой загрузки («fast boot») UEFI может пропустить загрузку разделов, отличных от ESP. Это может привести к тому, что systemd-boot не сможет найти загрузочные записи на разделе XBOOTLDR; в этом случае отключите режим быстрой загрузки.
- Раздел XBOOTLDR должен находиться на том же физическом диске, что и ESP, чтобы systemd-boot мог его найти.
В процессе установки примонтируйте ESP в /mnt/efi
и XBOOTLDR в /mnt/boot
.
На этапе chroot используйте команду:
# bootctl --esp-path=/efi --boot-path=/boot install
Затем переходите к настройке systemd-boot.
Обновление менеджера загрузки EFI
При выходе новой версии systemd-boot менеджер загрузки EFI можно по желанию переустановить. Это можно сделать вручную или автоматически; ниже описаны оба способа.
Вручную
Используйте команду bootctl для обновления systemd-boot:
# bootctl update
bootctl install
, systemd-boot попробует найти системный раздел EFI в /efi
, /boot
и /boot/efi
. Если он примонтирован в другое место, нужно добавить опцию --esp-path=esp
.Автоматически
Для автоматического обновления systemd-boot можно использовать службу systemd или хук pacman.
Служба systemd
Начиная с версии 250, systemd предоставляет юнит systemd-boot-update.service
. Включите его, чтобы при следующей загрузке выполнилось обновление загрузчика.
bootctl install
и bootctl update
ищут загрузчик в каталоге /usr/lib/systemd/boot/efi/
, и файлы .efi.signed
имеют более высокий приоритет, чем обычные файлы .efi
. Если там есть .efi.signed
загрузчик, то systemd-boot-update.service
сможет выполнить обновление без обращения к инструментам подписи Secure Boot. Смотрите также bootctl(1) § SIGNED .EFI FILES.Хук pacman
Пакет systemd-boot-pacman-hookAUR предоставляет хук pacman, который будет выполняться при каждом обновлении пакета systemd.
В качестве альтернативы, вы можете разместить следующий pacman hook в каталоге /etc/pacman.d/hooks/:
/etc/pacman.d/hooks/95-systemd-boot.hook
[Trigger] Type = Package Operation = Upgrade Target = systemd [Action] Description = Gracefully upgrading systemd-boot... When = PostTransaction Exec = /usr/bin/systemctl restart systemd-boot-update.service
При включенном Secure Boot стоит добавить ещё один хук, который автоматически подпишет загрузчик при обновлении пакета:
/etc/pacman.d/hooks/80-secureboot.hook
[Trigger] Operation = Install Operation = Upgrade Type = Path Target = usr/lib/systemd/boot/efi/systemd-boot*.efi [Action] Description = Signing systemd-boot EFI binary for Secure Boot When = PostTransaction Exec = /bin/sh -c 'while read -r i; do sbsign --key /путь/к/keyfile.key --cert /путь/к/certificate.crt "$i"; done;' Depends = sh Depends = sbsigntools NeedsTargets
Замените /путь/к/keyfile.key
и /путь/к/certificate.crt
на ваши ключ подписи и сертификат соответственно. Для лучшего понимания, как работает этот хук, можно почитать sbsign(1).
/usr/share/libalpm/hooks/zz-sbctl.hook
. Не забудьте сначала добавить в базу файлы, необходимые для вашей цепочки загрузки.Настройка
Настройка загрузчика
Базовая конфигурация хранится в файле esp/loader/loader.conf
. Полный список опций описан в loader.conf(5) § OPTIONS. Некоторые важные опции:
-
default
– выбираемая по умолчанию запись; можно использовать подстановку, напримерarch-*
-
timeout
– задержка меню в секундах. При значенииmenu-hidden
или0
(по умолчанию) меню будет скрыто.
-
console-mode
— разрешение экрана в консоли. Значениеkeep
(по умолчанию) оставляет то разрешение, которое было выбрано прошивкой. Значениеmax
выбирает максимальный доступный режим.
-
editor
— включение редактора параметров ядра. Значениеyes
(по умолчанию) — включить,no
— отключить. Если к машине имеют физический доступ недоверенные пользователи, редактор лучше отключить (иначе они смогут обойти проверки доступа, например, добавивinit=/bin/bash
в параметры ядра).
Пример:
esp/loader/loader.conf
default arch.conf timeout 4 console-mode max editor no
- Используйте пробелы; systemd-boot не поддерживает символы табуляции.
- Опции
default
иtimeout
могут быть изменены в само́м меню загрузки, эти изменения будут храниться как переменные EFILoaderEntryDefault
иLoaderConfigTimeout
, переопределяя настройки из файла конфигурации. - Можно использовать
bootctl set-default ""
иbootctl set-timeout ""
для сброса переменных EFI, переопределяющих опцииdefault
иtimeout
соответственно. - Если вы указали
timeout 0
, вы можете получить доступ к меню, удерживая клавишуSpace
. - Пример базового конфигурационного файла расположен как
/usr/share/systemd/bootctl/loader.conf
. - Если в загрузчике (во время выбора загрузочной записи) появляются искажения/используется неправильное разрешение, попробуйте установить
console-mode
вauto
(использует эвристику для выбора оптимального разрешения),keep
(сохраняет разрешение, предоставленное прошивкой) или2
(пытается выбрать первое нестандартное для UEFI разрешение).
Добавление загрузочных записей
systemd-boot ищет элементы для загрузочного меню в esp/loader/entries/*.conf
, а при использовании XBOOTLDR — также в boot/loader/entries/*.conf
. Имейте в виду, что записи в esp
могут использовать только файлы (ядра, initramfs и т. п.) только из esp
. Аналогично, записи из раздела boot
могут использовать только файлы из boot
.
Возможными опциями являются:
-
title
– название операционной системы. Обязательная. -
version
– версия ядра, отображаемая только если существуют несколько записей с одинаковым названием. Не обязательная. -
machine-id
– идентификатор машины из/etc/machine-id
, отображаемый только если существуют несколько записей с одинаковым названием и одинаковой версией. Не обязательная. -
efi
– EFI-приложение для запуска, путь относительноesp
; например,/vmlinuz-linux
. Либо это, либоlinux
(смотрите ниже) является обязательным. -
options
– опции командной строки для передачи в EFI приложение или параметры ядра. Не обязательная, но вам нужно будет передать как минимумroot=dev rw
для загрузки Linux, гдеdev
— блочное устройство, содержащее корневую файловую систему (смотрите Постоянные имена для блочных устройств#Параметры ядра). Эту опцию можно опустить, если корневому разделу присвоен правильный Root Partition Type GUID, как определено в Discoverable Partitions Specification, и если используется mkinitcpio-хукsystemd
.
Для загрузки Linux можно вместо опции efi
использовать опцию linux
. Или initrd
в дополнение к options
. Синтаксис такой:
-
linux
илиinitrd
, за которыми следует относительный путь к соответствующим файлам в ESP; например,/vmlinuz-linux
; это будет автоматически преобразовано вefi путь
иoptions initrd=путь
— данный синтаксис поддерживается только для удобства и не имеет отличий в работе.
.cmdline
переданные из загрузчика параметры ядра будут игнорироваться. Если Secure Boot отключен, то параметры загрузчика переопределят параметры из встроенного .cmdline
.Пример файлов, запускающих Arch из тома с меткой Arch OS
и загружающих микрокод процессора Intel:
esp/loader/entries/arch.conf
title Arch Linux linux /vmlinuz-linux initrd /intel-ucode.img initrd /initramfs-linux.img options root="LABEL=Arch OS" rw
esp/loader/entries/arch-fallback.conf
title Arch Linux (fallback initramfs) linux /vmlinuz-linux initrd /intel-ucode.img initrd /initramfs-linux-fallback.img options root="LABEL=Arch OS" rw
systemd-boot при загрузке автоматически проверяет наличие Windows Boot Manager в /EFI/Microsoft/Boot/Bootmgfw.efi
, UEFI Shell в /shellx64.efi
и EFI Default Loader в /EFI/BOOT/bootx64.efi
, а также специально подготовленных файлов ядра, находящихся в /EFI/Linux/
. При их обнаружении будут сгенерированы записи с названиями auto-windows
, auto-efi-shell
и auto-efi-default
соответственно. Эти записи не требуют ручной настройки загрузчика. Однако автоопределение других EFI-приложений не выполняется (в отличие от rEFInd), поэтому для загрузки ядра Linux необходимо создать загрузочные записи вручную.
- Доступные загрузочные записи, которые были настроены, можно посмотреть с помощью команды
bootctl list
. - Пример файла есть в
/usr/share/systemd/bootctl/arch.conf
. - Необходимые параметры ядра при использовании LVM, dm-crypt или Btrfs описаны в соответствующих статьях.
EFI Shell или другие EFI-приложения
Если вы установили UEFI Shell с помощью пакета edk2-shell, systemd-boot автоматически найдёт его и добавит загрузочную запись, если есть файл в esp/shellx64.efi
.
Для этого можно сделать так:
# cp /usr/share/edk2-shell/x64/Shell.efi /boot/shellx64.efi
Если вы установили другие EFI-приложения в ESP, можно создать для них загрузочные записи, подобные приведённым ниже.
efi
задаётся относительно точки монтирования esp. Например, если ESP примонтирован в /boot
и EFI-приложения находятся по адресам /boot/EFI/xx.efi
и /boot/yy.efi
, то вы должны указать опции efi /EFI/xx.efi
and efi /yy.efi
соответственно.esp/loader/entries/fwupd.conf
title Firmware updator efi /EFI/tools/fwupdx64.efi
esp/loader/entries/gdisk.conf
title GPT fdisk (gdisk) efi /EFI/tools/gdisk_x64.efi
Загрузка с другого диска
systemd-boot не может запускать исполняемые файлы с разделов, отличных от ESP или XBOOTLDR, но может запустить для этого внешний скрипт.
Сначала установите edk2-shell (будет использоваться как интерпретатор). Также нужен PARTUUID раздела, на котором находится целевой EFI-файл, который можно получить с помощью команды blkid
. Используя EFI Shell (как описано выше), мы можем с помощью команды map узнать FS alias (например: HD0a66666a2) и полный путь к целевому EFI-файлу (например: EFI\Microsoft\Boot\Bootmgfw.efi). FS alias соответствует PARTUUID раздела, в котором находится целевой EFI-файл.
Затем с помощью команды exit мы можем загрузиться обратно в Linux, где создадим новую запись. Для этого необходимо сначала создать в корне esp файл с расширением .nsh, содержащий FS alias, двоеточие и путь к EFI-файлу, например:
esp/windows.nsh
HD0a66666a2:EFI\Microsoft\Boot\Bootmgfw.efi
После создания файла можно создать загрузочную запись, запускающую скрипт:
esp/loader/entries/windows.conf
title Windows efi /shellx64.efi options -nointerrupt -noconsolein -noconsoleout windows.nsh
Важно, чтобы путь к efi совпадал с местом, куда был скопирован edk2-shell на esp, а последний аргумент в options совпадал с именем файла .nsh в корне esp. Также обратите внимание, что EFI-файл edk2-shell можно переместить в другое место, чтобы избежать автоматического создания загрузочной записи.
Загрузка в настройки EFI
systemd-boot автоматически добавит запись UEFI Firmware Setup, если прошивка вашего устройства поддерживает перезагрузку в настройки EFI.
Поддержка спящего режима
Смотрите статью Ждущий и спящий режимы.
Редактор параметров ядра с защитой паролем
В качестве альтернативы можете установить systemd-boot-passwordAUR который поддерживает password
опцию базовой конфигурации. Используйте sbpctl generate
для генерации значения для этой опции.
Установка systemd-boot-password следующей командой:
# sbpctl install esp
С включенным редактором будет запрошен ваш пароль, перед тем как вы сможете редактировать параметры ядра.
Советы и рекомендации
Клавиши в меню загрузки
Находясь в меню, вы можете использовать клавиши t
и T
для настройки таймаута меню и e
для редактирования параметров ядра для выбранной загрузочной записи. Нажатие h
покажет краткий список полезных горячих клавиш. Полный список доступных в меню сочетаний клавиш приведён в systemd-boot(7) § KEY BINDINGS.
Выбор записи для следующей загрузки
Менеджер загрузки интегрирован с командой systemctl, что позволяет выбрать, какой вариант загрузки будет использоваться после перезагрузки. Например, если вы собрали своё ядро и создали загрузочную запись esp/loader/entries/arch-custom.conf
, для её загрузки можно просто выполнить:
$ systemctl reboot --boot-loader-entry=arch-custom.conf
и система перезагрузится с использованием указанной записи, но не изменит опцию по умолчанию для последующих загрузок. Для просмотра списка возможных вариантов используйте опцию --boot-loader-entry=help
.
Для перезагрузки в настройки прошивки используйте команду:
$ systemctl reboot --firmware-setup
Unified kernel image
systemd-boot автоматически находит Unified kernel image в каталоге esp/EFI/Linux/
и добавляет для них загрузочные записи, поэтому создавать их вручную в esp/loader/entries/
не нужно. (Обратите внимание, что образы должны иметь расширение .efi
, чтобы systemd-boot их распознал.)
esp/loader/entries/
будут загружаться первыми, если в esp/loader/loader.conf
не задана опция default
. Удалите эти записи или укажите значение по умолчанию с полным именем файла, то есть default arch-linux.efi
Grml на ESP
PKGBUILD
: grml-systemd-bootAUR.Grml — это небольшая live-система с набором программ для системного администрирования и восстановления.
Для установки Grml на ESP достаточно скопировать ядро vmlinuz
, initramfs initrd.img
и образ grml64-small.squashfs
из файла iso в ESP. Для этого сначала скачайте grml64-small.iso и смонтируйте его (здесь точка монтирования обозначается как mnt); ядро и initramfs находятся в каталоге mnt/boot/grml64small/
, а образ — в каталоге mnt/live/grml64-small/
.
Далее создайте в ESP каталог для Grml:
# mkdir -p esp/grml
И скопируйте в него вышеупомянутые файлы:
# cp mnt/boot/grml64small/vmlinuz esp/grml # cp mnt/boot/grml64small/initrd.img esp/grml # cp mnt/live/grml64-small/grml64-small.squashfs esp/grml
Затем создайте загрузочную запись для systemd-boot:
esp/loader/entries/grml.conf
title Grml Live Linux linux /grml/vmlinuz initrd /grml/initrd.img options apm=power-off boot=live live-media-path=/grml/ nomce net.ifnames=0
Список доступных опций можно посмотреть здесь: cheatcode for Grml.
systemd-boot на системах BIOS
Если вам нужен загрузчик для BIOS-систем, соответствующий The Boot Loader Specification, то можно использовать systemd-boot. Загрузчик Clover поддерживает загрузку в режиме BIOS и имитирует среду EFI.
Решение проблем
Установка после загрузки в режиме BIOS
Вы с таким же успехом можете установить systemd-boot, если загружаетесь в режиме BIOS. Тем не менее, от вас всё равно требуется сообщить прошивке запускать EFI файл systemd-boot при загрузке:
- у вас есть работающий EFI shell где-нибудь.
- ваш интерфейс прошивки предоставляет вам соответствующий способ настройки EFI файла, который будет загружен во время загрузки.
Если вы имеете такую возможность, процесс установки будет проще: перейдите в ваш EFI shell или интерфейс настройки вашей прошивки и измените EFI файл по умолчанию вашей машины на esp/EFI/systemd/systemd-bootx64.efi
( или systemd-bootia32.efi
если у вас 32 битная системная прошивка).
Создание записи вручную с помощью efibootmgr
Если команда bootctl install
не сработала, вы можете создать загрузочную запись EFI самостоятельно с помощью утилиты efibootmgr:
# efibootmgr --create --disk /dev/sdX --part Y --loader "\EFI\systemd\systemd-bootx64.efi" --label "Linux Boot Manager" --unicode
где /dev/sdXY
— это системный раздел EFI.
\
в качестве разделителя.Создание записи вручную с помощью bcdedit из Windows
Если по какой-то причине нужно создать загрузочную запись EFI из Windows, можно выполнить следующие команды в командной строке, запущенной с правами администратора:
> bcdedit /copy {bootmgr} /d "Linux Boot Manager" > bcdedit /set {guid} path \EFI\systemd\systemd-bootx64.efi
Замените guid
на id, возвращённый первой командой. Также можно сделать эту запись записью по умолчанию:
> bcdedit /default {guid}
Меню не отображается после обновления Windows
Обратитесь к разделу соответствующей статьи: Unified Extensible Firmware Interface (Русский)#Windows изменяет порядок загрузки.
Добавление поддержки разблокировки TPM для Windows BitLocker
Чтобы BitLocker перестал запрашивать ключ восстановления, добавьте в файл loader.conf:
esp/loader/loader.conf
reboot-for-bitlocker yes
Это установит UEFI-переменную BootNext, благодаря которой Windows Boot Manager будет загружаться без необходимости использования ключа восстановления BitLocker. Это однократное изменение, и systemd-boot остается загрузчиком по умолчанию. Нет необходимости добавлять загрузочную запись для Windows, если она была определена автоматически.
Это экспериментальная функция, поэтому прочитайте loader.conf(5).