
Это дополнительный вопрос после
Как создать флэш-накопитель 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.
Надеюсь это поможет