Установка Linux на EFI
Предупреждение
Здесь рассказывается, как сделать так, чтобы ядро 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