Debian

GRUB Bootloader 依靠我的可啟動快閃記憶體驅動器在內部 eMMc 驅動器上找到 Windows 10

  • August 9, 2020

對於這個問題的其餘部分,您可以假設任何帶有“內部”的東西是指我的筆記型電腦的內部 eMMc 驅動器,任何帶有“USB”的東西都是指我的可啟動 USB 快閃記憶體驅動器,“Debian”是指 Debian Buster,“Windows”是指 Windows 10.

我在內部驅動器上安裝了 Windows,在可啟動的 USB 快閃記憶體驅動器上安裝了 Debian。我的引導設置是 Grub Bootloader 優先於預設引導載入程序。

我的問題是,每當未連接可啟動驅動器時,Grub 顯然找不到任何東西並啟動命令行界面。連接後,圖形界面允許我在 Debian 和 Windows 之間進行選擇作為標準。

我已經在 Stack Exchange 上尋找了一個足夠相似的答案,但是當我告訴你我還不夠好,無法使用我發現的東西來解決問題時,請相信我。我引用:

這些都與我的情況無關,因為當連接 USB 記憶棒時我可以讓兩個作業系統都執行良好,並且我可以在 CLI Grub 出現之前ESC和****F9選擇我的啟動設備(Windows 是唯一可用的)。

我被困住了。理想情況下,我希望當 U 盤未連接時,我的電腦會自動啟動到 Windows,或者如果這不可能,允許我選擇我的啟動方法,而不必在 CLI Grub 啟動之前狙擊ESC 。

連接 USB 記憶棒時的 Grub: 連接 連接 USB 記憶棒時的 Grub USB 記憶棒時的 Grub : 我使用ESCF9時的啟動選項:

“debian”只是再次啟動 Grub CLI。未連接 U 盤時的 Grub啟動選項

您似乎有一個基於 UEFI 的系統。GRUB 和 Windows 引導載入程序都安裝在 EFI 系統分區(簡稱 ESP)中,這是(hd1,1)GRUB 看到的分區。

Debian 10 的預設 UEFI GRUB 基本上包括主grubx64.efi執行檔中的所有 GRUB 模組,因此缺少文件系統驅動程序不應該是這裡的問題。您的內部 eMMC 具有標準的 Windows 分區:

  • (hd1,1)是 ESP,具有 FAT32 文件系統,大小約為 260M(在 4k 塊大小的磁碟上支持 FAT32 的最小大小)
  • (hd1,2)是“Microsoft Reserved”分區,完全沒有格式化,大小約為128M。它的存在是為了允許輕鬆轉換為 Windows 動態磁碟(相當於 Windows 的 Linux LVM)或其他轉換。
  • (hd1,3)是您的主要 Windows 系統驅動器,具有 NTFS 文件系統。
  • (hd1,4)是另一個具有 NTFS 文件系統的分區,可能是 Windows 恢復分區。

您的所有 Linux 分區都位於外部快閃記憶體驅動器上。還有一個問題:預設情況下,Debian 10 只將一個非常小的 GRUB 配置文件安裝到 ESP 中。本質上,它僅通過 UUID 辨識包含 Linux/boot目錄的文件系統,並告訴 GRUB 從那裡載入其真實配置。顯然,當外部快閃記憶體驅動器斷開連接時,這不會發生。真正的配置文件包含所有啟動菜單定義,包括 Windows 的定義。沒有它們,GRUB 只能顯示命令提示符。

您可以通過啟動 Linux 並將真正的 GRUB 配置文件複製到 ESP 來解決此問題,如下所示:

mv /boot/efi/EFI/debian/grub.cfg /boot/efi/EFI/debian/grub.cfg.mini
cp /boot/grub/grub.cfg /boot/efi/EFI/debian/grub.cfg

但是,該update-grub命令(由 Debian 的核心更新包使用!)不會自動更新新位置。幸運的是,該命令只是一個腳本,因此很容易修改。

首先,在包管理系統中創建一個轉移,這樣任何更新都不會覆蓋我們的更改:

dpkg-divert --local --rename --add /usr/sbin/update-grub

這將自動將目前重命名/usr/sbin/update-grub/usr/sbin/update-grub.distrib 並將它的任何未來更新重定向到新位置

現在,您可以將腳本複制回原始位置,然後使用您喜歡的文本編輯器對其進行修改。

cp -a /usr/sbin/update-grub.distrib /usr/sbin/update-grub

最初,腳本如下所示:

#!/bin/sh
set -e
exec grub-mkconfig -o /boot/grub/grub.cfg "$@"

您需要像這樣修改第三行:

#!/bin/sh
set -e
exec grub-mkconfig -o /boot/efi/EFI/debian/grub.cfg "$@"

在任何主要的系統更新後(例如從 Debian 10 “buster” 到 Debian 11),您應該重新檢查/usr/sbin/update-grub.distrib和修改/usr/sbin/update-grub以驗證轉移仍然有效並且新版本沒有對update-grub腳本帶來任何更改。

實際上,您可能還需要將一些其他文件複製到 ESP,例如 GRUB 字型檔(從/boot/grub/fonts/unicode.pf2/boot/efi/EFI/debian/fonts/unicode.pf2)以及可能的 GRUB 菜單背景圖像或與您可能正在使用的 GRUB 主題相關的類似內容。

引用自:https://unix.stackexchange.com/questions/603515