使用正确的 UEFI SecureBoot 签名构建 Archiso

使用正确的 UEFI SecureBoot 签名构建 Archiso

我正在构建一个 Archiso live USB。我的目标是使其兼容 SecureBoot(启用 SecureBoot 的用户应该能够启动它)。

以前好像有人问过这个问题(如何在启用安全启动的情况下启动 Arch Linux 安装介质?)并回答,但没有解释如何在 Archiso 的构建过程中实现这一点。

目前我的问题是脚本build.sh,它定义了 EFI 的制作过程,如下所示:

# 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
}

现在正如中所述Arch Wiki SecureBoot 页面,我相信我了解“PreLoader”部分中的其他所有内容(并且可以修改构建脚本以启用签名的 efi 二进制文件),但是我如何运行

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

在 Archiso 的构建过程中命令是否正确?

答案1

efibootmgr步骤仅配置系统的 UEFI 引导变量,以将特定引导加载程序添加到系统引导顺序中的特定磁盘(由 GPT 分区表标头中的磁盘 UUID 标识)上。它与安全启动无关。

当准备 UEFI 可启动可移动媒体时,您将不需要它。对于 UEFI,可移动媒体如果它只是带有的话,那么它是可启动的<media root>/EFI/Boot/bootx64.efi。在 FAT32 格式的 USB 记忆棒上,这应该位于记忆棒的主文件系统中;在实际的 ISO9660 格式的 CD/DVD 上,FAT32 文件系统应打包成专用的启动映像文件,其在磁盘上的位置在 El Torito 启动数据中指示。

您的build.sh脚本已包含 的创建efiboot.img,显然该文件旨在作为此启动映像文件(只要在 ISO 映像创建阶段使用适当的参数对其进行标识)。

build.sh基本上,针对不同的 UEFI 启动情况,您有两个不同的功能:make_efi()为 USB 记忆棒准备 UEFI 启动加载程序,以及make_efiboot()为构建将刻录在实际 CD/DVD 上的 ISO9660 CD/DVD 映像准备启动映像。

您可能已经见过可以使用类似工具将 Linux 安装.iso映像写入 USB 记忆棒。dd这些不仅仅是带有 El Torito 启动信息的常规 ISO9660 映像:这些映像包括特殊isohybrid处理,将简单的 MBR 分区表放在 ISO 映像的最开头,然后将文件呈现efiboot.img为 ISO 映像数据中的“分区”,生成一个“双模式”映像文件,该文件既可以在实际的 CD/DVD 介质上刻录,也可以在 USB 记忆棒上写入,即使这两种模式之间的实际引导过程非常不同。

您的build.sh代码片段显然不包括 ISO 映像创建步骤,因此我无法猜测是否${work_dir}/iso会写入实际的 USB 介质或是否会用于构建.iso映像文件。

一些 UEFI 固件实际上本身就包含 ISO9660 文件系统支持,因此它们可能只是在 ISO9660 文件系统上查找,/EFI/Boot/bootx64.efi而不是(或除此之外)使用 El Torito 启动信息读取特殊的 FAT32 UEFI 启动映像;但是,并非所有系统都保证具有此功能。

相关内容