这是

这是

这是

如何制作具有全盘加密的 BIOS/UEFI 闪存驱动器

我按照该问题的答案操作,并在 USB 闪存驱动器中创建了 Ubuntu 20.04 的加密完整安装,该驱动器可以从 BIOS 或 UEFI 配置的计算机启动。

随着时间的推移,我使用这个 USB 闪存驱动器在仅 BIOS 的计算机上安装了 Ubuntu,并不断更新安全和其他更新。现在 UEFI 计算机无法从这个 USB 驱动器启动。当我选择Ubuntu从 GRUB 中它显示了错误:

error file '/vmlinuz-5.8.0-48-generic' not found.
you need to load the kernel first. 

此特定内核未安装,因为它在安全和其他更新期间已被较新的内核取代。

如何重新获得基于 USB 的 Ubuntu 安装的 UEFI 启动功能?

答案1

两个人的故事grub.cfg

此 USB 闪存驱动器安装grub.cfg在两个位置上。一个用于启动仅 BIOS 的计算机,另一个用于启动 UEFI 的计算机。当安装新内核并删除旧内核时,安装过程只会更新用于当前启动的 grub.cfg 文件。因此,这两个grub.cfg文件不同步。

BIOS 启动所需的文件位于:

/boot/grub/grub.cfg

UEFI 启动所需的文件位于:

/boot/efi/boot/grub/grub.cfg

请注意,由于这是加密安装,因此启动分区具有挂载点/boot,ESP 分区具有挂载点/boot/efi

解决方案

用较新版本替换旧版 grub.cfg。就我而言,BIOS 版本较新。因此我使用了以下命令:

sudo cp /boot/grub/grub.cfg /boot/efi/boot/grub/grub.cfg

这暂时解决了该问题。

脚本

我写了一个小脚本,如果它们根据 USB 启动的模式(BIOS 或 UEFI)而不同,则grubsync.sh复制并将旧的替换为新的。grub.cfg

#!/bin/bash
# Date: Jun 18, 2022
# Purpose: USB123 copy grub.cfg from boot partition grub.cfg to ESP partition
#      or vice versa if grub.cfg is newer
 
# Only run if the computer is USB123
if [[ ! $HOSTNAME == USB123 ]]; then    # Not on right computer
    echo "This is $HOSTNAME, expected USB123, exiting..."
    exit 1
fi

if [[ "$EUID" -ne 0 ]]
    then echo "This script must run with sudo, exiting..."
    exit 1
fi

BOOTgrubCFG="/boot/grub/grub.cfg"
ESPgrubCFG="/boot/efi/boot/grub/grub.cfg"

if cmp --silent -- "$BOOTgrubCFG" "$ESPgrubCFG"; then
    echo "files contents are identical, exiting..."
    exit 1
fi

if ls /sys/firmware/efi; then   # If TRUE then UEFI Boot
    if [[ "$BOOTgrubCFG" -ot "$ESPgrubCFG" ]]; then    # '-ot` means older than
        cp -f "$BOOTgrubCFG" "$BOOTgrubCFG".old 
        cp -f "$ESPgrubCFG" "$BOOTgrubCFG"
        echo "$BOOTgrubCFG" was old, kept with .old ext
        echo "$BOOTgrubCFG" was replaced with "$ESPgrubCFG". 
    fi
else 
    if [[ "$ESPgrubCFG" -ot "$BOOTgrubCFG" ]]; then
        cp -f "$ESPgrubCFG" "$ESPgrubCFG".old 
        cp -f "$BOOTgrubCFG" "$ESPgrubCFG"
        echo "$ESPgrubCFG" is old, kept with .old ext
        echo "$ESPgrubCFG" was replaced with "$BOOTgrubCFG".        
    fi
fi

我的 USB 完整安装的主机名是USB123。在运行脚本之前请更改它。您需要使用sudo前缀来运行此脚本。

到目前为止,每次内核更新时我都必须运行此脚本。经过一些调整,我可以使用 crontab 在每次启动时运行它。

希望这可以帮助

相关内容