![安装 Debian 的脚本存在 UEFI 问题,跨机器的行为不一致](https://linux22.com/image/219144/%E5%AE%89%E8%A3%85%20Debian%20%E7%9A%84%E8%84%9A%E6%9C%AC%E5%AD%98%E5%9C%A8%20UEFI%20%E9%97%AE%E9%A2%98%EF%BC%8C%E8%B7%A8%E6%9C%BA%E5%99%A8%E7%9A%84%E8%A1%8C%E4%B8%BA%E4%B8%8D%E4%B8%80%E8%87%B4.png)
出于我个人的目的,我正在编写一个脚本,以便自动将自定义 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
并运行它。