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

Состояние перевода: На этой странице представлен перевод статьи 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 . Размер раздела 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).

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

This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.