Dies ist eine Folgefrage nach

Dies ist eine Folgefrage nach

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.cfgSpeicherorte. 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.cfgDateien 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 /bootund 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.shdie ältere Version kopiert und grub.cfgdurch 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 sudoPrä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

verwandte Informationen