User:Volumo/systemd-boot (Русский)

From ArchWiki

systemd-boot (ранее назывался gummiboot) - это простой UEFI менеджер загрузки, который запускает настроенные EFI образы. Записью по умолчанию является настоенный паттерн (glob) или меню на экране. Включен в systemd с версии systemd 220-2.

Его легко настраивать, но от умеет только запускать исполняемые EFI файлы, ядро Linux EFISTUB, UEFI Shell, grub.efi, Windows Boot Manager и тому подобные.

Важно: systemd-boot всего лишь предоставляет меню для загрузки EFISTUB ядер. В случае, если у вас возникают проблемы с загрузкой EFISTUB ядер, как в FS#33745, вы можете использовать загрузчик, который не использует EFISTUB, например GRUB (Русский), Syslinux (Русский) или ELILO.
Примечание: В этой статье точку монтирования Системного Раздела EFI (также известного как ESP) будем обозначать как $esp.

Установка

Загрузка в режиме EFI

  1. Для начала убедитесь, что вы загружены в режиме UEFI
  2. Проверьте есть доступ к вашим переменным EFI
  3. Убедитесь, что ваш Системный Раздел EFI правильно примонтирован. $esp используется для обозначения точки монтирования в этой статье.
Примечание: systemd-boot не умеет загружать EFI приложения из других разделов. Поэтому настоятельно рекомендуется монтировать ваш ESP в /boot. Смотрите #Обновления для более подробной информации или если вы хотите отделить /boot от ESP.
  1. Скопируйте ваше ядро и initramfs на этот раздел.
Примечание: Для того, что-бы автоматически держать ядро обновленным в ESP, смотрите EFISTUB для использования предназначенных для этого юнитов systemd.
  1. Наконец, введите следующую команду для установки 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 файла, который будет загружен во время загрузки.
Примечание: Например, это возможно на Dell Latitude сериях, так как EFI Shell не может записывать в ПЗУ компьютера.

Если вы можете это сделать, то установка проще: перейдите в ваш 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 будет автоматически проверять наличие "Windows Boot Manager" (\EFI\Microsoft\Boot\Bootmgfw.efi), "EFI Shell" (\shellx64.efi) и "EFI Default Loader" (\EFI\Boot\bootx64.efi). Для тех, что будут найдены, записи также будут автоматически сгенерированы. Тем не менее, он не будет автоматически искать другие EFI приложения (в отличие от rEFInd (Русский)), поэтому для загрузки ядра записи должны быть созданы вручную. Если вы используете двойную загрузку с Windows, настоятельно рекомендуется отключить Быстрый запуск
Совет: Вы можете узнать PARTUUID вашего корневого раздела с помощью команды blkid -s PARTUUID -o value /dev/sdxY, где 'x' - это буква устройства, а 'Y' - это номер раздела. Это нужно только для вашего корневого раздела, а не для $esp.

Для загрузки 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 10, будут перезаписывать любой выбор порядка загрузки, который вы делаете и устанавливать себя в качестве приоритетной загрузки после каждого запуска. Изменение порядка загрузки в прошивке UEFI продлится только до следующей Windows 10 загрузки. Вы должны знать Change Boot Option ключ для вашей материнской платы.

Для того, чтобы Windows 8.X не изменяли порядок загрузки, вы должны настроить групповые политики для Windows и выполнить скрипт (.bat) при запуске. В Windows:

  1. Откройте командную строку с правами администратора. Выполните bcdedit /enum firmware
  2. Найдите приложение, в котором в описании "Linux", например "Linux Boot Manager"
  3. Скопируйте ID, включая скобки, например {31d0d5f4-22ad-11e5-b30b-806e6f6e6963}.
  4. Создайте bat-файл (например, bootorder.bat) со следующим содержанием: bcdedit /set {fwbootmgr} DEFAULT {скопированный_ID} (например, bcdedit /set {fwbootmgr} DEFAULT {31d0d5f4-22ad-11e5-b30b-806e6f6e6963}).
  5. Откройте gpedit и в Local Computer Policy > Computer Configuration > Windows Settings > Scripts(Startup/Shutdown), выберите Startup. Должно открыться окно с заголовком Startup Properties.
  6. Во вкладке Scripts, нажмите кнопку Add
  7. Нажмите Browse и выберите созданный bat-файл.

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