LINUX.ORG.RU

Темы для grubx64.efi

 


0

1

В прошлый раз я разобрался с шифрованым boot. В результате получил одинокий grubx64.efi, лежащий на esp разделе. Потом я решил все это дело облагородить и поставил тему для grub, но она применяется только на самом grub. То есть, запущеный grubx64.efi выглядит как консольный граб без темы, после ввода пароля появляется выбор систем и тема.

Внимание вопрос: можно ли как-то применить тему к самому grubx64.efi? Т.е чтобы экран с запросом пароля не выглядел так убого?


В прошлый раз я разобрался…

…но не заметил, каких грабель себе подложил. Вот одна из них сработала. Собственно, ты сам себе уже ответил:

консольный граб без темы, после ввода пароля появляется выбор систем и тема

То есть, поместить все это до ввода пароля, на ESP-раздел. В качестве эксперимента, все это можно сделать простым копированием файлов еще одного груба на ESP-раздел. Это-же ЕФИ, здесь загрузчиков может быть столько, сколько физически влезет на ESP-раздел.

andytux ★★★★★
()

Двачую конфиги-темы-шрифты на ESP. Или даже сам граб.

Если секурбут (без чего шифрование ваще не имеет смысла) то можно подписать всё указанное - PGP-ключём, например.

Или можно запихнуть в EFI-бинарь всё что нужно, включая картинки и шрифты.

token_polyak ★★★★
()
Ответ на: комментарий от Panika

Например:

grub-mkimage -k ключ.asc --disable-shim-lock -o /efi/BOOT/BOOTX64.EFI -O x86_64-efi -p /grub pgp part_msdos part_gpt ext2 password_pbkdf2 fat gcry_sha256 gcry_rsa all_video gfxterm gettext png gzio configfile test search echo linux loadenv luks cryptodisk

То есть: надо указать нужные модули, добавить конфиг через -c grub.cfg, если секурбут (а без него шифрование…), то подписать grubx64.efi, если нужны модули или всё-таки понадобится внешний конфиг/темы - добавить ключ через -k ключ.asc, добавить все модули, которые требуются для проверки подписей, ну и подписать все внешние файлы, которые будут использоваться. (gpg --detach-sign grub.cfg итп.)

token_polyak ★★★★
()

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

mxfm ★★
()

как вариант поставить и настроить Plymouth в /etc/mkinitcpio.conf и hookом собирать efi бинарник подписаный.

И grub не нужен будет с его темами.

На генте так, на арче вики подскажет по хукам


cat /etc/kernel/postinst.d/build_kernel.sh 
#!/bin/bash

TARGET=/boot/efi
BOOTDIR=/boot
UCODE=$BOOTDIR/amd-uc.img
EFISTUB=/usr/lib/systemd/boot/efi/linuxx64.efi.stub

echo "Updating EFI kernels..."

for k in $BOOTDIR/vmlinuz*; do
        NAME=$(basename $k|sed 's/vmlinuz-//')
        echo "  Building $NAME"
        INITRD="$BOOTDIR/initramfs-$NAME.img"

        if [ -f "$UCODE" ]; then
                cat "$UCODE" "$INITRD" > /tmp/initrd.bin
                INITRDFILE=/tmp/initrd.bin
        else
                # Do not fail on AMD systems
                echo "    Intel microcode not found. Skipping."
                INITRDFILE="$INITRD"
        fi

        # Check for custom command line for the kernel.
        CMDLINE="$BOOTDIR/cmdline-$NAME.txt"
        if [ -f "$CMDLINE" ]; then
                echo "    Using custom command line $CMDLINE"
        else
                CMDLINE="$BOOTDIR/cmdline.txt"
                if [ ! -f "$CMDLINE" ]; then
                        echo "CMDLINE missing. Extracting from running kernel..."
                        cat /proc/cmdline |sed 's/BOOT_IMAGE=[^ ]* \?//' > "$CMDLINE"
                fi
        fi

        objcopy \
            --add-section .osrel="/usr/lib/os-release" --change-section-vma .osrel=0x20000 \
            --add-section .cmdline="$CMDLINE" --change-section-vma .cmdline=0x30000 \
            --add-section .linux="$k" --change-section-vma .linux=0x40000 \
            --add-section .initrd="$INITRDFILE" --change-section-vma .initrd=0x3000000 \
            "$EFISTUB" "$TARGET/$NAME.efi"

        sbsign --key /etc/efikeys/db.key --cert /etc/efikeys/db.crt -o "$TARGET/$NAME.efi" "$TARGET/$NAME.efi"
        efibootmgr -d /dev/sda -p 1 -c -L "$NAME" -l "$NAME.efi"

done
caro
()