Secure Boot на линуксе нужен для того, чтобы Windows в дуалбуте была в безопасности, и проходила все тесты на безопасность в Защитнике Windows.
Руководство ориентировано на дистрибутивы из семейства Arch Linux.
ПРЕДИСЛОВИЕ
Описанный ниже метод пока что не поддерживает новые видеокарты Nvidia с GSP Firmware. Если у вас видеокарта 20х серии и выше, или вы используете GSP — этот метод не для вас. Об этой проблеме надо писать автору скрипта Dracut-Ukify.
Для поддержки Early KMS я запаковываю ядро как fallback, в конфиге ниже. В это ядро включены почти все Firmware и драйверы.
UKI-ядра в EFI/Linux подхватываются сами без конфигурации загрузчика.
В процессе выполнения данного гайда перезагружаться нельзя, иначе система превратится в тыкву!
ПРЕЖДЕ ЧЕМ ЧТО-ТО ДЕЛАТЬ, УБЕДИТЕСЬ В ТОМ, ЧТО ВЫ ВСЁ ПОНИМАЕТЕ!!! ВЫ ДЕЛАЕТЕ ЭТО НА СВОЙ СТРАХ И РИСК!
Убедитесь, что у вас на EFI разделе достаточно пространства. ЯДРА ВЕСЯТ ПО 100 МЕГАБАЙТ!!!
https://www.youtube.com/watch?v=8XtTpx_2sKU
УСТАНОВКА НЕОБХОДИМЫХ ПАКЕТОВ И ПОДГОТОВКА
Необходимо поставить скрипт dracut-ukify (из AUR) и утилиты sbctl и sbsigntools. Они нужны для генерации унифицированных образов ядра, генерации ключей и сертификатов, и цифровой подписи.
paru -S dracut sbctl sbsigntools dracut-ukify
Далее нужно открыть /proc/cmdline
и скопировать оттуда строку (БЕЗ УКАЗАНИЯ INITRD) в /etc/kernel/cmdline
.
Вот пример:
$ cat /proc/cmdline
root=UUID=49a19494-cce7-463c-962f-881b70a35560 rw nowatchdog nohpet intel_pstate=passive split_lock_detect=off nvme_load=YES zswap.enabled=1 loglevel=3 lsm=landlock,lockdown,yama,integrity,apparmor,bpf spec_rstack_overflow=microcode
ПОДГОТОВКА BIOS, ГЕНЕРАЦИЯ КЛЮЧЕЙ, ENROLL
Для того, чтобы включить дуалбут для Windows и Linux, необходимо в BIOS закатать собственные ключи ВМЕСТЕ с ключами Майкрософта.
Чтобы в BIOS закатать ключи, нужно Secure Boot перевести в Setup Mode. Для этого сделайте следующее: Откройте в биосе настройки секъюр бута, и переведите его в режим Custom. Затем, выберите опцию Key Management. В появившемся меню отключите опцию Factory Key Provisioning и нажмите кнопку Remove SecureBoot Variables.
Теперь загрузитесь в систему и сделайте:
# Генерацию ключей проведите лишь однажды!
# Их нельзя затирать!
sudo sbctl create-keys
# Закатываем собственные ключи ВМЕСТЕ С ключами Майкрософт! Нужно для дуалбута с Виндовс!
sudo sbctl enroll-keys --microsoft
ПОДГОТОВКА EFI-РАЗДЕЛА
sudo pacman -Rc grub mkinitcpio
sudo rm -r /boot/efi /boot/grub /boot/initramfs* /boot/vmlinuz*
sudo mkdir /efi
efidevice=$(findmnt /boot/efi -no SOURCE) # запоминаем EFI-раздел
sudo umount /boot/efi
sudo mount ${efidevice} /efi
В fstab необходимо теперь /boot/efi
заменить на /efi
!
УСТАНОВКА ЗАГРУЗЧИКА
Установка Systemd-Boot
sudo bootctl install
sudo sbctl sign -s /efi/EFI/BOOT/bootx64.efi
/efi/loader/loader.conf
(конфиг загрузчика Systemd-Boot)
default @saved
timeout 8
console-mode max
editor no
ИЛИ, Установка rEFInd
paru -S refind
sudo refind-install --usedefault $(findmnt /efi -no SOURCE)
sudo sbctl sign -s /efi/EFI/BOOT/bootx64.efi
sudo sbctl sign -s /efi/EFI/BOOT/drivers_x64/ext4_x64.efi
НАСТРОЙКА DRACUT-UKIFY И ПЕРЕУСТАНОВКА ЯДЕР
/etc/dracut-ukify.conf
# Configuration file for dracut-ukify package
# Should dracut-ukify colorize its output?
# Can be auto, true or false
colorize=auto
# Kernel package to be set as default in systemd-boot
# eg. setting this to 'linux' is equivalent of calling
# 'bootctl set-default ENTRY_ID_FOR_LINUX' after each upgrade of corresponding package
#default_kernel_package='linux'
# Add global ukify flags to each invocation
# See '/usr/lib/systemd/ukify --help' for an available flags
# 1. Specify cmdline
# ССЫЛКА НА КОМАНДНУЮ СТРОКУ ЯДРА В СИСТЕМЕ
ukify_global_args+=(--cmdline "@/etc/kernel/cmdline")
# 2. Sign UKI image for use with UEFI Secure Boot
# Note you don't need --sign-kernel here, it will do not what you expect probably
# ПУТИ К КЛЮЧАМ, МЕНЯТЬ НЕ НУЖНО
ukify_global_args+=(--secureboot-private-key /usr/share/secureboot/keys/db/db.key --secureboot-certificate /usr/share/secureboot/keys/db/db.pem)
# 3. Add splash image (only BMP supported!)
#ukify_global_args+=(--splash /etc/boot/splash.bmp)
# Build variants can be declared here
# ukify_variants is are associative array where the key is variant name and value is dracut options to pass during generation
# Note the "default" key is special - it will be omitted in the resulting image name
# It can be used to create fallback images, for example:
#ukify_variants=(
# [default]="--hostonly"
# [fallback]="--no-hostonly"
#)
# ВКЛЮЧИТЬ ВСЕ ДРАЙВЕРЫ И FIRMWARE
ukify_variants=(
[default]="--no-hostonly"
)
# Override UKI image path for each variant
# Available variables:
# ${name} - package name (linux, linux-lts, linux-zen, etc)
# ${version} - package version
# ${machine_id} - machine id (taken from /etc/machine-id)
# ${build_id} - build id (taken from /etc/os-release, for ArchLinux it's always 'rolling')
# ${id} - os id (taken from /etc/os-release, for ArchLinux it's always 'arch')
# Note: that's not real shell variable expansion, it's just string substitution, so the parentheses are required
# Note 2: unless you're using only one kernel package, you must provide unique paths for each package,
# so either ${name} or ${version} is strongly recommended to use here
#ukify_install_path=(
# [default]='EFI/Linux/linux-${version}-${machine_id}-${build_id}.efi'
# [fallback]='EFI/Linux/linux-${version}-${machine_id}-${build_id}-fallback.efi'
#)
# ПОСТОЯННОЕ ИМЯ ЯДРА ИЗ ИМЕНИ ПАКЕТА
ukify_install_path=(
[default]='EFI/Linux/${name}.efi'
)
После завершения конфигурации переустановим все ядра
sudo rm /efi/EFI/Linux/*
sudo dracut-ukify -a
PACMAN HOOKS
Если у вас rEFInd:
/etc/pacman.d/hooks/10-refind-signed.hook
[Trigger]
Operation=Upgrade
Type=Package
Target=refind
[Action]
Description = Updating rEFInd on ESP
When=PostTransaction
Exec=/bin/bash -c "refind-install --usedefault $(findmnt /efi -no SOURCE) && sbctl sign -s /efi/EFI/BOOT/bootx64.efi && sbctl sign -s /efi/EFI/BOOT/drivers_x64/ext4_x64.efi"
Если у вас Systemd-Boot:
/etc/pacman.d/hooks/10-sdboot-signed.hook
[Trigger]
Operation=Upgrade
Type=Package
Target=systemd
[Action]
Description = Updating Systemd-Boot on ESP
When=PostTransaction
Exec=/bin/bash -c "bootctl install && sbctl sign -s /efi/EFI/BOOT/bootx64.efi"
WINDOWS
Чтобы Systemd-Boot мог грузить Windows, нужно примонтировать в /mnt
виндовый EFI-раздел, и скопировать содержимое его папки EFI в папку EFI ... На EFI-разделе Linux
REFInd же подхватывает все пункты загрузки автоматически.