![這是之後的後續問題](https://rvso.com/image/1072191/%E9%80%99%E6%98%AF%E4%B9%8B%E5%BE%8C%E7%9A%84%E5%BE%8C%E7%BA%8C%E5%95%8F%E9%A1%8C.png)
這是之後的後續問題
我遵循了這個問題的答案,並在 USB 隨身碟中建立了 Ubuntu 20.04 的加密完整安裝,該驅動器從 BIOS 或 UEFI 配置的電腦啟動。
隨著時間的推移,我使用這個 USB 隨身碟在僅 BIOS 的電腦上安裝了 Ubuntu,並不斷更新安全性和其他更新。現在 UEFI 電腦將無法從此 USB 隨身碟啟動。當我選擇烏班圖從 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
在兩個位置有兩個獨立的 USB 隨身碟。一種用於引導僅 BIOS 計算機,另一種用於引導 UEFI 計算機。當安裝新核心並刪除舊核心時,安裝過程僅更新用於目前引導的 grub.cfg 檔案。結果,兩個grub.cfg
檔案不同步。
BIOS 啟動所需的檔案位於:
/boot/grub/grub.cfg
UEFI啟動所需的檔案位於:
/boot/efi/boot/grub/grub.cfg
請注意,由於這是加密安裝,因此 boot 分割區具有掛載點/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 來執行它。
希望這可以幫助