Это дополнительный вопрос после

Это дополнительный вопрос после

Это дополнительный вопрос после

Как создать флэш-накопитель BIOS/UEFI с полным шифрованием диска

Я следовал ответам в этом вопросе и создал зашифрованную полную установку Ubuntu 20.04 на USB-флеш-накопителе, которая загружалась либо из BIOS, либо с компьютеров, настроенных с помощью UEFI.

Со временем я использовал этот USB-флеш-накопитель, устанавливал Ubuntu на компьютере только с BIOS и обновлял его с помощью обновлений безопасности и других. Теперь компьютер UEFI не загружается с этого USB-накопителя. Когда я выбираюУбунтуиз GRUB мне показывает ошибку:

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

Это конкретное ядро ​​не установлено, поскольку оно было заменено более новыми ядрами во время обновлений безопасности и других обновлений.

Как восстановить функциональность загрузки UEFI для этой установки Ubuntu на USB-носителе?

решение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

На данный момент это решило проблему.

Скрипт

Я написал небольшой скрипт, который grubsync.shкопирует и заменяет старые данные grub.cfgновыми, если они отличаются в зависимости от того, в каком режиме (BIOS или UEFI) загружался USB-накопитель.

#!/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.

Надеюсь это поможет

Связанный контент