systemd-boot (Русский)
Ссылки по теме
systemd-boot (ранее назывался gummiboot) - это простой UEFI менеджер загрузки, который запускает настроенные EFI образы. Записью по умолчанию является настроенный паттерн (glob) или меню на экране. Включен в systemd с версии systemd 220-2.
Его легко настраивать, но от умеет только запускать исполняемые EFI файлы, ядро Linux EFISTUB, UEFI Shell, grub.efi, Windows Boot Manager и тому подобные.
Contents
Установка
Загрузка в режиме EFI
- Для начала убедитесь, что вы загружены в режиме UEFI
- Проверьте есть доступ к вашим переменным EFI[broken link: invalid section]
- Убедитесь, что ваш Системный Раздел EFI правильно примонтирован.
$esp
используется для обозначения точки монтирования в этой статье. - Скопируйте ваше ядро и initramfs на этот раздел.
- Наконец, введите следующую команду для установки systemd-boot:
# bootctl --path=$esp install
Она скопирует образ systemd-boot на Системный Раздел EFI ($esp/EFI/systemd/systemd-bootx64.efi
и$esp/EFI/Boot/BOOTX64.EFI
- оба идентичны - на x64 системах) и добавьте systemd-boot как приложение EFI для загрузки по умолчанию.
Загрузка в режиме Legacy
Вы с таким же успехом можете установить systemd-boot, если загружаетесь в режиме legacy OS. Тем не менее, от вас всё равно требуется позже сказать прошивке запускать EFI файл systemd-boot'а при загрузке:
- у вас есть работающие EFI shell где-нибудь;
- ваш интерфейс прошивки предоставляет вам способ правильной настройки EFI файла, который будет загружен во время загрузки.
Если вы можете это сделать, то установка проще: перейдите в ваш EFI shell или в ваш интерфейс настройки прошивки и измените EFI файл по умолчанию вашей машины на $esp/EFI/systemd/systemd-bootx64.efi
(systemd-bootia32.efi
на i686 системах).
Обновления
systemd-boot (bootctl(1), systemd-efi-boot-generator(8)) подразумевает, что ваша ESP смонтирована в /boot
.
В отличие от предыдущего пакета gummiboot, который автоматически обновляется с помощью post_install
скрипта, обновления systemd-boot теперь обрабатываются пользователем вручную:
# bootctl update
Если ESP не смонтирован на /boot
, опция --path=
может передать его, например:
# bootctl --path=/boot/$esp update
Настройка
Базовая настройка
Базовая конфигурация хранится в $esp/loader/loader.conf
, в которой доступно всего три опции:
-
default
– выбираемая по умолчанию запись (без суффикса.conf
); может быть звёздочкой, напримерarch-*
-
timeout
– задержка меню в секундах. Если таймаут не задан, то меню будет отображаться только если удерживать клавишу пробел при загрузке.
-
editor
- следует ли включить редактор параметров ядра или нет.1
(по умолчанию) - включить,0
- отключить. Пользователь может добавитьinit=/bin/bash
что-бы обойти пароль администратора и получить полный доступ, поэтому настоятельно рекомендуется установить этот параметр в0
.
Пример:
$esp/loader/loader.conf
default arch timeout 4 editor 0
Обратите внимание, что первые 2 опции могут быть изменены в самом меню загрузки, которое будет хранить их как переменные EFI.
Добавление загрузочных записей
Для загрузки bootctl составляет пункты меню из $esp/loader/entries/*.conf
файлов – каждый найденный файл должен содержать только одну загрузочную запись. Возможными опциями являются:
-
title
– название операционной системы. Обязательная.
-
version
– версия ядра, отображаемая только если существуют несколько записей с одинаковым названием. Не обязательная.
-
machine-id
– идентификатор машины из/etc/machine-id
, отображаемый только если существуют несколько записей с одинаковым названием и одинаковой версией. Не обязательная.
-
efi
– EFI программа для запуска, относительно вашего ESP ($esp
); например,/vmlinuz-linux
. Либо это, либоlinux
(смотрите ниже) является обязательным.
-
options
– опции командной строки для передачи EFI приложению. Не обязательная, но вам нужно будет передать как минимумinitrd=efipath
иroot=dev
если загружаете Linux.
Для Linux вы можете задать linux path-to-vmlinuz
и initrd path-to-initramfs
; это автоматически преобразуется в efi path
и options initrd=path
– этот синтаксис поддерживается только для удобства и не имеет различий по функциональности.
Установки со стандартной корневой директорией
Вот пример записи для корневого раздела без LVM или LUKS:
$esp/loader/entries/arch.conf
title Arch Linux linux /vmlinuz-linux initrd /initramfs-linux.img options root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660 rw
Пожалуйста, обратите внимание, что в вышеприведённом примере PARTUUID/PARTLABEL идентифицируют GPT раздел, а это не то же самое, что UUID/LABEL, которые идентифицируют файловую систему. Использование PARTUUID/PARTLABEL бывает полезным, потому что они инвариантны (то есть неизменяемы), если вы переформатируете раздел в другую файловую систему или если по какой-то причине изменятся обозначения /dev/sd*. Также оно может быть полезно, если у вас нет файловой системы на разделе (или вы используете LUKS, который не поддерживает метки томов).
Установки с LVM корневой директорией
Вот пример для корневой директории, использующей логический менеджер разделов:
$esp/loader/entries/arch-lvm.conf
title Arch Linux (LVM) linux /vmlinuz-linux initrd /initramfs-linux.img options root=/dev/mapper/<VolumeGroup-LogicalVolume> rw
Замените <VolumeGroup-LogicalVolume>
на актуальные названия VG и LV (например, root=/dev/mapper/volgroup00-lvolroot
). Кроме того, вместо них можно использовать UUID:
.... options root=UUID=<UUID identifier> rw
Обратите внимание, что root=UUID=
используется вместо root=PARTUUID=
, который используется для корневых разделов без LVM или LUKS.
Установки с зашифрованной корневой директорией
Вот пример конфигурационного файла для зашифрованного корневого раздела (DM-Crypt / LUKS):
$esp/loader/entries/arch-encrypted.conf
title Arch Linux Encrypted linux /vmlinuz-linux initrd /initramfs-linux.img options cryptdevice=UUID=<UUID>:<mapped-name> root=UUID=<luks-UUID> quiet ro
В этом примере используется UUID; если хотите, можете заменить UUID на PARTUUID. Обратите внимание, что <luks-UUID>
обозначает UUID актуальной расшифрованой корневой файловой системы (тот, что находится в /dev/mapper/<mapped-name>
), а не UUID устройства. Смотрите Dm-crypt/System configuration#Boot loader.
Вы также можете добавить другие EFI приложения, такие как \EFI\arch\grub.efi
.
Установка корневого подраздела btrfs
При загрузке с подраздела btrfs как корневого, замените options
строку на rootflags=subvol=<root subvolume>
. В примере ниже, корневой раздел монтируется как btrfs подраздел с именем 'ROOT' (например, mount -o subvol=ROOT /dev/sdxY /mnt
):
$esp/loader/entries/arch-btrfs-subvol.conf
title Arch Linux linux /vmlinuz-linux initrd /initramfs-linux.img options root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660 rw rootflags=subvol=ROOT
Если это невозможно сделать, то это приведет к ошибке: ERROR: Root device mounted successfully, but /sbin/init does not exist.
EFI Shells или другие EFI приложения
В случае, если вы установили EEFI Shells или другие EFI приложения в ESP, вы можете использовать следующие фрагменты:
$esp/loader/entries/uefi-shell-v1-x86_64.conf
title UEFI Shell x86_64 v1 efi /EFI/shellx64_v1.efi
$esp/loader/entries/uefi-shell-v2-x86_64.conf
title UEFI Shell x86_64 v2 efi /EFI/shellx64_v2.efi
Дополнительная безопасность
Вы должны знать, что параметры командной строки для ядра могут быть отредактированы с помощью меню загрузки systemd-boot'а (смотрите #Клавиши в загрузочном меню) при нажатии e
. Это главная дыра в безопасности, так как если вы переопределите аргумент ядра init=
, например на init=/bin/bash
, это загрузит вашу машину непосредственно с правами root без каких либо паролей, легко обходя существующий пароль root'а! Поскольку gummiboot в настоящий момент не имеет функциии защиты паролем и не имеет возможности предотвратить изменения параметров ядра, вы должны убедиться в том, что вы задали пароль на аппаратном уровне (UEFI/BIOS), который предотвратит загрузку компьютера до того, как введён правильный пароль.
Поскольку безопасность состоит из нескольких уровней, а физический доступ сразу же обходит любые системы безопасности, возможно вам пригодится шифрование вашего диска с помощью dm-crypt, особенно если ваша машина является ноутбуком. Однако, это уже другой вопрос, не относящийся к systemd-boot.
Поддержка гибернации
Пожалуйста, прочтите статью Suspend and hibernate.
Клавиши в загрузочном меню
В меню используются следующие клавиши:
-
Вверх/Вниз
- выбор записи -
Enter
- загрузить выбранную запись -
d
- выбрать загрузочную запись по умолчанию (хранится в энергонезависимой EFI переменной) -
-/T
- уменьшить таймаут (хранится в энергонезависимой EFI переменной) -
+/t
- увеличить таймаут (хранится в энергонезависимой EFI переменной) -
e
- редактировать командную строку ядра -
v
- показать версию gummiboot и UEFI -
Q
- выйти -
P
- отобразить текущую конфигурацию -
h/?
- помощь
А эти клавиши, нажатые в меню в процессе загрузки, сразу загрузят определённую запись:
-
l
- Linux -
w
- Windows -
a
- OS X -
s
- EFI Shell -
1-9
- порядковый номер записи
Решение проблем
Создание записи вручную с помощью efibootmgr
Если команда bootctl install
не сработала, вы можете создать загрузочную EFI запись самостоятельно с помощью утилиты efibootmgr
:
# efibootmgr -c -d /dev/sdX -p Y -l /EFI/systemd/systemd-bootx64.efi -L "Linux Boot Manager"
где /dev/sdXY
- это ваш EFISYS раздел.
Меню не отображается после обновления Windows
Допустим, если вы обновились с Windows 8 до Windows 8.1 и вы больше не видите загрузочного меню после этого обновления, (то есть сразу грузится Windows):
- Убедитесь, что как Secure Boot (настраивается в UEFI), так и Fast Startup (настраивается в опциях питания в Windows) отключены.
- Убедитесь, что в вашем UEFI Linux Boot Manager первичнее, чем Windows Boot Manager (настраивается в UEFI настройках, таких как Hard Disk Drive Priority).
Для того, чтобы Windows 8.X не изменяли порядок загрузки, вы должны настроить групповые политики для Windows и выполнить скрипт (.bat) при запуске. В Windows:
- Откройте командную строку с правами администратора. Выполните
bcdedit /enum firmware
- Найдите приложение, в котором в описании "Linux", например "Linux Boot Manager"
- Скопируйте ID, включая скобки, например
{31d0d5f4-22ad-11e5-b30b-806e6f6e6963}
. - Создайте bat-файл (например,
bootorder.bat
) со следующим содержанием:bcdedit /set {fwbootmgr} DEFAULT {скопированный_ID}
(например,bcdedit /set {fwbootmgr} DEFAULT {31d0d5f4-22ad-11e5-b30b-806e6f6e6963}
). - Откройте gpedit и в Local Computer Policy > Computer Configuration > Windows Settings > Scripts(Startup/Shutdown), выберите Startup. Должно открыться окно с заголовком Startup Properties.
- Во вкладке Scripts, нажмите кнопку Add
- Нажмите Browse и выберите созданный bat-файл.