Construa o Archiso com a assinatura adequada do UEFI SecureBoot

1

Estou construindo um USB Archiso live. Meu objetivo é torná-lo compatível com o SecureBoot (usuários com o SecureBoot ativado devem poder inicializá-lo).

Parece que isso foi perguntado antes ( Como inicializar o meio de instalaçà £ o do Arch Linux com Secure Boot ativado? ) e respondido, mas nà £ o há explicações de como isso pode ser alcançado para o processo de compilaçà £ o do Archiso. / p>

Meu problema é no momento em que o script build.sh , que define o processo de criação do EFI como segue:

# Prepare /EFI
make_efi() {
mkdir -p ${work_dir}/iso/EFI/boot
cp ${work_dir}/x86_64/airootfs/usr/share/efitools/efi/PreLoader.efi ${work_dir}/iso/EFI/boot/bootx64.efi
cp ${work_dir}/x86_64/airootfs/usr/share/efitools/efi/HashTool.efi ${work_dir}/iso/EFI/boot/

cp ${work_dir}/x86_64/airootfs/usr/lib/systemd/boot/efi/systemd-bootx64.efi ${work_dir}/iso/EFI/boot/loader.efi

mkdir -p ${work_dir}/iso/loader/entries
cp ${script_path}/efiboot/loader/loader.conf ${work_dir}/iso/loader/
cp ${script_path}/efiboot/loader/entries/uefi-shell-v2-x86_64.conf ${work_dir}/iso/loader/entries/
cp ${script_path}/efiboot/loader/entries/uefi-shell-v1-x86_64.conf ${work_dir}/iso/loader/entries/

sed "s|%ARCHISO_LABEL%|${iso_label}|g;
     s|%INSTALL_DIR%|${install_dir}|g" \
    ${script_path}/efiboot/loader/entries/archiso-x86_64-usb.conf > ${work_dir}/iso/loader/entries/archiso-x86_64.conf

# EFI Shell 2.0 for UEFI 2.3+
curl -o ${work_dir}/iso/EFI/shellx64_v2.efi https://raw.githubusercontent.com/tianocore/edk2/master/ShellBinPkg/UefiShell/X64/Shell.efi
# EFI Shell 1.0 for non UEFI 2.3+
curl -o ${work_dir}/iso/EFI/shellx64_v1.efi https://raw.githubusercontent.com/tianocore/edk2/master/EdkShellBinPkg/FullShell/X64/Shell_Full.efi
}

# Prepare efiboot.img::/EFI for "El Torito" EFI boot mode
make_efiboot() {
mkdir -p ${work_dir}/iso/EFI/archiso
truncate -s 64M ${work_dir}/iso/EFI/archiso/efiboot.img
mkfs.fat -n ARCHISO_EFI ${work_dir}/iso/EFI/archiso/efiboot.img

mkdir -p ${work_dir}/efiboot
mount ${work_dir}/iso/EFI/archiso/efiboot.img ${work_dir}/efiboot

mkdir -p ${work_dir}/efiboot/EFI/archiso
cp ${work_dir}/iso/${install_dir}/boot/x86_64/vmlinuz ${work_dir}/efiboot/EFI/archiso/vmlinuz.efi
cp ${work_dir}/iso/${install_dir}/boot/x86_64/archiso.img ${work_dir}/efiboot/EFI/archiso/archiso.img

cp ${work_dir}/iso/${install_dir}/boot/intel_ucode.img ${work_dir}/efiboot/EFI/archiso/intel_ucode.img

mkdir -p ${work_dir}/efiboot/EFI/boot
cp ${work_dir}/x86_64/airootfs/usr/share/efitools/efi/PreLoader.efi ${work_dir}/efiboot/EFI/boot/bootx64.efi
cp ${work_dir}/x86_64/airootfs/usr/share/efitools/efi/HashTool.efi ${work_dir}/efiboot/EFI/boot/

cp ${work_dir}/x86_64/airootfs/usr/lib/systemd/boot/efi/systemd-bootx64.efi ${work_dir}/efiboot/EFI/boot/loader.efi

mkdir -p ${work_dir}/efiboot/loader/entries
cp ${script_path}/efiboot/loader/loader.conf ${work_dir}/efiboot/loader/
cp ${script_path}/efiboot/loader/entries/uefi-shell-v2-x86_64.conf ${work_dir}/efiboot/loader/entries/
cp ${script_path}/efiboot/loader/entries/uefi-shell-v1-x86_64.conf ${work_dir}/efiboot/loader/entries/

sed "s|%ARCHISO_LABEL%|${iso_label}|g;
     s|%INSTALL_DIR%|${install_dir}|g" \
    ${script_path}/efiboot/loader/entries/archiso-x86_64-cd.conf > ${work_dir}/efiboot/loader/entries/archiso-x86_64.conf

cp ${work_dir}/iso/EFI/shellx64_v2.efi ${work_dir}/efiboot/EFI/
cp ${work_dir}/iso/EFI/shellx64_v1.efi ${work_dir}/efiboot/EFI/

umount -d ${work_dir}/efiboot
}

Agora, como foi dito em Arquive a página WikiBoot do SecureBoot , acredito que eu entendo todo o resto (e posso modificar o script de construção para que ele permita os efin binários assinados) na seção "PreLoader", mas como posso executar o

efibootmgr --verbose --disk /dev/sdX --part Y --create --label "PreLoader" --loader /EFI/systemd/PreLoader.efi

comando corretamente durante o processo de compilação do Archiso?

    
por Jussi Hietanen 07.08.2018 / 21:13

1 resposta

0

A etapa efibootmgr apenas configura as variáveis de inicialização UEFI de seu sistema para adicionar esse carregador de inicialização específico nesse disco específico (identificado pelo UUID do disco no cabeçalho da tabela de partições GPT) na ordem de inicialização do seu sistema. Não tem nada a ver com o Secure Boot.

Ao preparar uma mídia removível inicializável com UEFI, você não precisará disso. Para UEFI, uma mídia removível é inicializável se tiver <media root>/EFI/Boot/bootx64.efi nela. Em um stick USB formatado em FAT32, espera-se que ele esteja dentro do sistema de arquivos principal do stick; em um CD / DVD com formato ISO9660 real, o sistema de arquivos FAT32 deve ser empacotado em um arquivo de imagem de inicialização dedicado, cuja localização no disco é indicada nos dados de inicialização do El Torito.

Seu script build.sh já inclui a criação de efiboot.img , que aparentemente é destinado a ser esse arquivo de imagem de inicialização (desde que seja identificado com os parâmetros apropriados na fase de criação da imagem ISO).

Basicamente, seu build.sh tem duas funções distintas para diferentes situações de inicialização UEFI: make_efi() é para preparar o carregador de inicialização UEFI para um pendrive, e make_efiboot() é para preparar uma imagem de inicialização para criar um CD / DVD ISO9660 imagem que será gravada em um CD / DVD real.

Você pode ter visto a instalação do Linux .iso imagens que podem ser gravadas no pendrive usando dd ou similar. Estas não são apenas imagens ISO9660 regulares com informações de inicialização do El Torito: essas imagens incluem processamento isohybrid especial que coloca uma tabela de partição MBR simples no início da imagem ISO, que apresenta o arquivo efiboot.img como uma "partição" dentro dos dados da imagem ISO, resultando em um arquivo de imagem "dual-mode" que pode funcionar tanto quando gravado em uma mídia CD / DVD real, e quando escrito em um dispositivo USB, mesmo quando o procedimento de inicialização real é muito diferente entre esses dois modos.

Seu build.sh snippet aparentemente não inclui a etapa de criação da imagem ISO, portanto, não posso adivinhar se ${work_dir}/iso será gravado na mídia USB real ou se será usado para criar um arquivo de imagem .iso .

Alguns firmwares UEFI atualmente incluem suporte ao sistema de arquivos ISO9660 de forma nativa, então eles podem procurar por /EFI/Boot/bootx64.efi em um sistema de arquivos ISO9660 em vez de (ou além) ler uma imagem especial de inicialização UEFI FAT32 usando a informação de inicialização El Torito; no entanto, nem todos os sistemas têm essa capacidade.

    
por 08.08.2018 / 02:52