systemd-boot (Русский)

From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи systemd-boot. Дата последней синхронизации: 20 октября 2023. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

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 можно по желанию переустановить. Это можно сделать вручную или автоматически; ниже описаны оба способа.

Примечание: Менеджер загрузки EFI — это отдельный исполняемый файл EFI, и для загрузки системы можно использовать любую версию (частичные обновления тут ни при чём, потому что pacman устанавливает только программу установки systemd-boot, а не сам systemd-boot). Однако новые версии могут добавлять новые возможности или исправлять ошибки, поэтому, вероятно, обновить systemd-boot это хорошая идея.

Вручную

Используйте команду 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. Включите его, чтобы при следующей загрузке выполнилось обновление загрузчика.

Важно: При включенном Secure Boot нужно подписать загрузчик перед обновлением. Пример есть в разделе #Хук pacman.
Совет: 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).

Совет: Если вы используете sbctl, то переподпись файлов, добавленных в его базу данных, происходит автоматически с помощью хука /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 могут быть изменены в само́м меню загрузки, эти изменения будут храниться как переменные EFI LoaderEntryDefault и 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=путь — данный синтаксис поддерживается только для удобства и не имеет отличий в работе.
Примечание: При включенном Secure Boot и использовании unified kernel image с встроенным в него .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

Примечание: Приведённые ниже инструкции не специфичны для Grml. С небольшими правками возможна установка и других программ (например, SystemRescueCD).
Совет: Доступен 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 битная системная прошивка).

Примечание: интерфейс прошивки в Dell Latitude сериях предоставляет все необходимое, чтобы установить EFI загрузку, но EFI Shell не сможет осуществить запись в ПЗУ компьютера.

Создание записи вручную с помощью 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.

Примечание: Путь к 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).

Смотрите также