如何為 grub (EFI) 設置預設前綴?
嘗試在 vanilla debian buster 上安裝 OpenZFS 2.0.0 並從它啟動時,我已經度過了艱難的四天。長話短說,OpenZFS 2.0.0 執行,buster 從它啟動,但只需要一點手動幫助:
每次重新啟動後,grub 都會進入命令行。顯然,它不執行 grub.cfg。如果我手動執行 grub.cfg,系統會啟動。
請注意,我已經閱讀了無數其他執行緒和問答,它們都在處理 grub 在重新啟動後在命令行中的問題。但是,我沒有找到與我類似的問題 - 我相信到目前為止我已經找到了這個問題,所以我的問題非常具體:
當我在 grub 的命令提示符下發出
set
命令時,(當然,其中包括)以下行:prefix=(hd0,gpt2)/EFI/debian
我不是 Linux 專家,更不是 grub 專家。所以我可能是錯的,但我相信這是罪魁禍首,因為引導載入程序(
grubx64.efi
和shimx64.efi
,分別)以及配置文件(grub.cfg
)實際上是在(hd0,gpt2)/EFI/debian-hdd1
(請注意尾隨-hdd1
,prefix
缺少值),而不是在(hd0,gpt2)/EFI/debian
.因此,當我在命令行發出
normal
時,什麼也沒有發生(好吧,螢幕似乎刷新了,但沒有別的)。但是當我第一次輸入set prefix=(hd0,gpt2)/EFI/debian-hdd1
然後輸入
normal
,就會出現正常的 grub 啟動菜單。這讓我假設
prefix
在這種特殊情況下變數是錯誤的。顯然,當到達命令提示符時,grub 還沒有執行任何腳本。因此,value ofprefix
必須是預設值。問題:
grub 從哪裡得到這個預設值?它是編譯時選項,還是我可以在某個地方設置它?也就是說,我如何設置 grub 變數的預設值,特別是
prefix
(即這些變數在沒有腳本執行時的值)?題外話:
我知道我可能可以通過安裝
grub.cfg
in.../debian
而不是.../debian-hdd1
. 我還沒有嘗試過,原因有兩個:
- 我真的很想學習如何更改 grub 的預設值
prefix
(稱為好奇心或迂腐)。- 我正在安裝 grub
grub-install
,它顯然使用 UEFI 引導條目名稱(通過提供選項設置--bootloader-id=debian-hdd1
)作為它創建的目錄名稱。我需要這種形式的引導條目名稱,因為系統啟動的 rpool 包含兩個磁碟的鏡像,如果其中一個磁碟出現故障,我希望能夠從另一個磁碟引導。因此,我需要能夠在 UEFI BIOS 設置中區分這兩個磁碟。
我仍然無法回答我的問題,即我仍然不知道如何更改
prefix
grub-efi 中的預設值。但是,我找到了解決問題的方法——efibootmgr
前來救援,直到現在我還不太清楚。
--bootloader-id=
我第一次在做的時候放棄了這個選項,結果結果和下面grub-install
的效果一樣--bootloader-id=debian
:bootloader files now was inEFI\debian
而不是EFI\debian-hdd1
.當然,現在 UEFI BIOS 設置中的引導菜單項也是
debian
,我必須避免。幸運的是,在閱讀了手冊頁之後,很明顯 efibootmgr 是解決這種情況的正確工具。首先,我刪除了名稱錯誤的 UEFI BIOS 啟動菜單項:
efibootmgr -b 0001 -B
然後我用正確的名稱創建了一個新的 UEFI BIOS 引導菜單項:
efibootmgr -c -d /dev/sda -p 2 -w -L debian-hdd1 -l '\EFI\debian\shimx64.efi'
請注意,此命令不涉及實際的引導載入程序安裝,無論是 EFI 分區中的那個還是
/boot/grub
. 相反,它實際上只是在 UEFI 韌體中創建了一個啟動菜單條目。這正是我所需要的。實際上,我不在乎 EFI 引導載入程序是否在
EFI\debian
或EFI\something-else
. 但是,我確實關心 UEFI 設置中該引導載入程序條目的名稱,而我的問題出現了,因為在那之前我認為這--bootloader-id
是grub-install
正確命名 UEFI 設置中的引導載入程序條目的唯一舒適方法。系統現在啟動沒有任何問題,因為初始的
grub.cfg
now 在 中EFI\debian
,因此 grub 可以找到它。