安装 Debian 的脚本存在 UEFI 问题,跨机器的行为不一致

安装 Debian 的脚本存在 UEFI 问题,跨机器的行为不一致

出于我个人的目的,我正在编写一个脚本,以便自动将自定义 Debian 系统安装到运行该脚本的任何计算机的硬盘驱动器上。该脚本旨在从任何实时 Linux 发行版中使用。

我知道 Debian 预置 - 不幸的是,在这种情况下预置并不是一个可行的解决方案。

该脚本有效。然而,它并不能始终如一地工作。在某些机器上(例如,我的 2011 Macbook Air),新的 EFI 配置更新后没有任何问题。但是,在某些计算机(尤其是较新的戴尔笔记本电脑)上,我必须进入 BIOS 并手动添加我的\EFI\debian\grubx64.efi文件。

我将如何更改以下脚本以适应大多数现代 UEFI 系统?

我知道我可能需要更改efibootmgr下面的命令。

#!/bin/bash

# Preliminary commands
set -e

echo "Available disks:"

current_disk=$(df / | awk 'NR==2 {print $1}')
for disk in $(lsblk -dnro NAME,TYPE | awk '$2=="disk" {print $1}'); do
if [ "$disk" != "${current_disk#/dev/}" ]; then
    size=$(lsblk -dnro SIZE "/dev/$disk")
    echo "/dev/$disk: $size"
fi
done

read -p "Enter the disk you want to install Debian on (e.g. /dev/sda): " disk

mkdir -p /mnt
sgdisk --zap-all "$disk" > /dev/null
parted "$disk" mklabel gpt
parted "$disk" mkpart ESP fat32 0% 512MB
parted "$disk" mkpart primary ext4 512MB 100%

# Set up main partition
yes | mkfs.ext4 "${disk}2"
mount "${disk}2" /mnt

# Set up EFI partition
yes | mkfs.fat -F32 "${disk}1"
mkdir -p /mnt/efi
mount "${disk}1" /mnt/efi

debootstrap --arch=amd64 buster /mnt http://ftp.us.debian.org/debian/

# Set up bindings
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys

# Chroot to set up grub
chroot /mnt /bin/bash << "EOT"
apt update -y
apt install -y linux-image-amd64 grub-efi-amd64
grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=debian --recheck --no-floppy
update-grub
EOT

# Set the path to your .EFI file
efi_file="\EFI\debian\grubx64.efi"
bootnum=$(efibootmgr -v | grep "Boot" | awk '{print $1}' | sed 's/Boot//g' | sort -n | tail -1 | awk '{print $1+1}')
efibootmgr -c -d "$disk" -p 1 -L "Debian" -l "${efi_file}" -b "${bootnum}"
efibootmgr -o "${bootnum}"

# Unmount bindings
umount -l /mnt/sys
umount -l /mnt/proc
umount -l /mnt/dev

# Unmount filesystems
umount -l /mnt/efi
umount -l /mnt

reboot

答案1

较新的系统往往默认启用安全启动,grubx64.efi如果您想在具有出厂默认配置的系统中直接启动它,则需要明确将其列入白名单,因为 Debiangrubx64.efi未经过 Microsoft 或系统制造商的签名。

当您进入 BIOS 设置并手动配置grubx64.efi启动时,固件可能会自动为您将其列入白名单,因为您已明确指定您希望使用它,在无法(轻易)被软件破坏的直接用户交互中。

你可能应该改变线路

apt install -y linux-image-amd64 grub-efi-amd64

apt install -y linux-image-amd64 grub-efi-amd64 grub-efi-amd64-signed shim-signed 

这将安装一个grubx64.efi内置所有相关 GRUB 模块的版本(因为安全启动将阻止 GRUB 加载任何模块:GRUB 模块不是 PE-COFF 二进制文件,而是 ELF 二进制文件,因此安全启动固件无法验证它们)由 Debian 签名,shimx64.efi由 Microsoft 签名。这两个文件都被构建为可重现的二进制文件,因此,如果您愿意,您可以自己重做构建过程以获得完全相同的二进制文件,这样您就可以验证其代码中没有恶意软件。

如果-signed安装了这些软件包,grub-install应该会自动使用它们,但如果您想确定,您可以为其添加选项--uefi-secure-boot来指定您明确想要使用它们。

这样使用时,应该efi_file=改为\EFI\debian\shimx64.efi;它将检查安全启动,如果需要,非持久地将 Debian 的安全启动证书添加到白名单中,然后grubx64.efi自动加载。如果系统禁用了安全启动,它将仅加载grubx64.efi并运行它。

相关内容