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

Jump to content
From ArchWiki

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

Ссылки по теме

- Процесс загрузки Arch
- Secure Boot
- Unified Extensible Firmware Interface (Русский)

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).

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

- https://www.freedesktop.org/wiki/Software/systemd/systemd-boot/
- https://github.com/systemd/systemd/tree/master/src/boot/efi
- https://bbs.archlinux.org/viewtopic.php?id=254374
- https://uapi-group.org/specifications/specs/boot_loader_specification/

Category:

- Boot loaders (Русский)