Установка Linux на EFI

Материал из MediaWiki
Перейти к навигации Перейти к поиску

Предупреждение

Здесь рассказывается, как сделать так, чтобы ядро Linux загружалось прошивкой (U)EFI без загрузчика типа GRUB. Это нужно далеко не всем. Если вы хотите готовый дистрибутив, например, Ubuntu, поставить на компьютер с UEFI, смотрите инструкцию к своему дистрибутиву. Скорее всего, нужно просто загрузиться с LiveDVD в режиме UEFI, запустить установку обычным способом, и всё настроится автоматически.

Подготовка дискового пространства

EFI может работать с таблицей разделов MBR, но рекомендуется использовать GPT, поэтому, если нет технических преград, то лучше всего переразметить диск в GPT.

Стоит отметить, что в некоторых случаях это можно сделать без потери имеющихся разделов — если они не пересекают область, отводимую под GPT (33 сектора в начале и в конце диска).

Разметка дискового пространства

Первым создаётся загрузочный раздел объёмом не менее 512 MiB (526.7 MB) FAT32 с флагом esp (EFI System Partition), это даст хэш ef00 (GPT) или 0xEF (MBR). На самом деле, в случае если у Вас GPT, флаг esp это просто алиас на флаг boot. Если что-то сделано не так, ядро (или любой другой загрузчик) не запустятся с этого раздела. Хотелось бы добавить, что размер в 512 MiB совсем необязателен для современных систем, минимальный размер данного раздела должен быть не менее суммы размеров ядра и initrd, обычно 50—100 MiB бывает достаточно для домашнего компьютера.

Вообще, загрузочный раздел не обязан быть первым (об этом будет упомянуто ниже), но если Вы захотите переразметить диск, то PARTUID может измениться при перемещении/изменении раздела, потому мы создаём его один раз и навсегда.

В остальном можно разметить диск как угодно, основываясь на документации Вашего дистрибутива или личных пожеланиях.

Настройка (U)EFI

Если ваш дистрибутив поставляет подписанное ядро, то отключать Secure Boot не нужно, иначе ядро не будет загружено.

Если же ваш дистрибутив поставляет неподписанное ядро, или вы не умеете подписывать ядра, то Secure Boot нужно отключить, иначе ядро не будет загружено.

Также желательно отключить CSM (Legacy Mode).

Подготовка ядра

Нельзя просто взять и запустить из EFI любое приложение, потому ядро должно быть собрано соответствующим образом.

Проверьте конфигурацию ядра, данные переменные должны быть включены:

 Symbol: EFI_PARTITION [=y]
 Type  : boolean
 Prompt: EFI GUID Partition support
 Location:
  -> Enable the block layer (BLOCK [=y])
   -> Partition Types
    -> Advanced partition selection (PARTITION_ADVANCED [=y])
 Defined at block/partitions/Kconfig:247
 Depends on: BLOCK [=y]
 Selects: CRC32 [=y]
 Symbol: EFI [=y]
 Type  : boolean
 Prompt: EFI runtime service support
 Location:
  -> Processor type and features
 Defined at arch/x86/Kconfig:1667
 Depends on: ACPI [=y]
 Selects: UCS2_STRING [=y] && EFI_RUNTIME_WRAPPERS [=y]
 Symbol: EFI_STUB [=y]
 Type  : boolean
 Prompt: EFI stub support
 Location:
  -> Processor type and features
   -> EFI runtime service support (EFI [=y])
 Defined at arch/x86/Kconfig:1683
 Depends on: EFI [=y] && !X86_USE_3DNOW [=n]
 Selects: RELOCATABLE [=y]
 Symbol: EFI_VARS [=y]
 Type  : tristate
 Prompt: EFI Variable Support via sysfs
 Location:
  -> Firmware Drivers
   -> EFI (Extensible Firmware Interface) Support
 Defined at drivers/firmware/efi/Kconfig:4
 Depends on: EFI [=y]
 Selected by: GOOGLE_SMI [=n] && GOOGLE_FIRMWARE [=n] && ACPI [=y] && DMI [=y] && EFI [=y]
CONFIG_EFIVAR_FS

— включать не нужно.

Если это не так, Вам нужно пересобрать ядро с нужными опциями (для этого обратитесь к соответствующей документации). Также желательно указать в CONFIG_CMDLINE путь к root, 'root=/dev/sdXY'.

Затем нужно положить ядро и (если есть) initrd в загрузочный раздел. Обычно его кладут в /boot/EFI/Distro (обязательно должен быть каталог EFI (заглавными буквами).

# cp /usr/src/linux/arch/x86/boot/bzImage /boot/EFI/Distro/kernel.efi

Вместо Distro — имя дистрибутива, но этого каталога может и не быть. kernel.efi, в зависимости от архитектуры ядра (обратите внимание, некоторые поставщики EFI не опознают архитектуру x86, в таком случае Вам придётся использовать x86_64 (amd64) ядро).

Подготовка загрузчика

Теперь нужно заставить EFI узнать, что у нас есть новое ядро.

Для начала нужно загрузиться в любой дистрибутив в режиме EFI (например, я предпочел SystemRescueCD, потому что в нём уже имеются все необходимые утилиты), для этого нужно в настройках EFI указать приоритет загрузки (если Вы отключили CSM, то диск запустится в режиме EFI) или в меню загрузчика EFI (читайте документацию к своей материнской плате, например, у меня это кнопка F8) выбрать нужный диск с префиксом UEFI.

Все действия, указанные ниже, выполняются от пользователя root.

В первую очередь для работы с EFI нужно подгрузить модуль ядра:

# modprobe efivars

Если в Вашем дистрибутиве отсутствует efibootmgr, его нужно установить.

Затем говорим EFI, что теперь есть новое ядро:

# efibootmgr -c -d /dev/sdX -pY -L "My Distro EFI Kernel" -l '\<your_vmlinuz>'.

Разберём каждый аргумент по порядку:

  • -c — создать загрузочную запись;
  • -d — диск, на котором находится ядро, в нашем случае это /dev/sda (у Вас может быть другой диск);
  • -p — раздел, в котором находится ядро, в нашем случае это «1» (у Вас может быть другой раздел);
  • -L — отображаемое имя в списке, в нашем случае это «My Distro EFI Kernel», здесь можно оставить место для фантазии, но стоит учесть, что кириллицу и спецсимволы прошивка EFI может не поддерживать;
  • -l — путь к ядру, в нашем случае это \EFI\Distro\Boot64.efi, обратите внимание, что EFI использует обратный слэш в пути;
  • -u — опции, передаваемые ядру, здесь указывается раздел, где установлен Ваш дистрибутив (пользователям systemd нужно добавить init=/usr/lib/systemd/systemd перед quiet).

Вы также можете отсортировать меню загрузки, удалить ненужные пункты, отключить их и т. д. Все возможности перечислены в man efibootmgr.

Теперь можно перезагрузить компьютер и загрузиться с собранного ядра.

Eсли / расположен на подтоме btrfs, нужно в опциях так же указать rootflags=subvol=<subvolume_with_/>

systemd-boot

Простой менеджер загрузки для UEFI систем ранее известный как gummiboot. Устанавливается в ESP, ядра для загрузки тоже должны находиться на том же разделе. При использовании systemd-boot удобно монтировать ESP как /boot

Установка

# bootctl --path=esp install

Где esp, путь до смонтированного esp. Далее следует поместить ядро и initramfs на тот же esp раздел.

Настройка

Конфигурация состоит из основного файла меню и конфигурации отдетных записей (пунктов) меню.

Основные параметры конфигурации разположены в esp/loader/loader.conf.

Например:

default arch
timeout 3
editor 0

где, default — пункт меню загружаемый по умолчанию, имя файла без .conf; timeout — время отображения загрузочного меню, при 0 меню отображаться не будет; editor — будет ли доступен редактор параметров загрузки.

Конфигурация пунктов загрузочного меню хранится в файлах esp/loader/entries/*.conf, например

title          Arch Linux
linux          /vmlinuz-linux
initrd         /initramfs-linux.img
options        root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660 rw