Dies ist eine Folgefrage nach
So erstellen Sie ein BIOS/UEFI-Flash-Laufwerk mit vollständiger Festplattenverschlüsselung
Ich bin den Antworten in dieser Frage gefolgt und habe eine verschlüsselte Vollinstallation von Ubuntu 20.04 auf einem USB-Flash-Laufwerk erstellt, das entweder vom BIOS oder von UEFI-konfigurierten Computern gebootet wurde.
Im Laufe der Zeit habe ich diesen USB-Stick verwendet, um Ubuntu auf einem Computer mit nur BIOS zu installieren und ihn mit Sicherheits- und anderen Updates auf dem neuesten Stand zu halten. Jetzt bootet der UEFI-Computer nicht mehr von diesem USB-Stick. Wenn ichUbuntuvom GRUB wird mir der Fehler angezeigt:
error file '/vmlinuz-5.8.0-48-generic' not found.
you need to load the kernel first.
Dieser spezielle Kernel ist nicht installiert, da er im Zuge von Sicherheits- und anderen Updates durch neuere Kernel ersetzt wurde.
Wie stelle ich die UEFI-Boot-Funktionalität für diese USB-basierte Ubuntu-Installation wieder her?
Antwort1
Die Geschichte von zweigrub.cfg
Diese USB-Flash-Laufwerk-Installation hat zwei separate grub.cfg
Speicherorte. Einer wird zum Booten von Computern mit reinem BIOS verwendet und der andere zum Booten von UEFI-Computern. Wenn neue Kernel installiert und alte entfernt werden, aktualisiert der Installationsvorgang nur die Datei grub.cfg, die für den aktuellen Bootvorgang verwendet wurde. Dies führt dazu, dass die beiden grub.cfg
Dateien nicht mehr synchron sind.
Die für den BIOS-Boot benötigte Datei befindet sich unter:
/boot/grub/grub.cfg
Die für den UEFI-Boot benötigte Datei befindet sich unter:
/boot/efi/boot/grub/grub.cfg
Beachten Sie: Da es sich um eine verschlüsselte Installation handelt, verfügt die Bootpartition über den Einhängepunkt /boot
und die ESP-Partition über den Einhängepunkt /boot/efi
.
Lösung
Ersetzen Sie die ältere grub.cfg durch die neuere Version. In meinem Fall war die BIOS-Version neuer. Also habe ich den folgenden Befehl verwendet:
sudo cp /boot/grub/grub.cfg /boot/efi/boot/grub/grub.cfg
Dadurch wurde das Problem vorerst behoben.
Ein Skript
Ich habe ein kleines Skript geschrieben, das grubsync.sh
die ältere Version kopiert und grub.cfg
durch die neuere ersetzt, wenn sie sich je nach Modus (BIOS oder UEFI), aus dem der USB-Stick gebootet wurde, unterscheiden.
#!/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
Der Hostname meiner USB-Vollinstallation ist USB123
. Ändern Sie ihn, bevor Sie das Skript ausführen. Sie müssen dieses Skript mit sudo
Präfix ausführen.
Derzeit muss ich dieses Skript bei jedem Kernel-Update ausführen. Mit ein paar Optimierungen kann ich es möglicherweise bei jedem Booten mit crontab ausführen.
Hoffe das hilft