使用帶有文件的 U 盤選擇 GRUB 2 條目
我有一台裝有 Windows 和 Ubuntu 20.04 的機器。活動分區(BIOS 中的第一個引導項)是安裝 Ubuntu 的分區,我已經手動輸入 GRUB 條目以選擇 Windows 作為引導進入,這是預設設置。
我希望能夠使用 USB 記憶棒(或者更好的 SD 卡)來更改預設選擇。如果它被插入,它應該引導到 Ubuntu(第一個條目),如果沒有,那麼它應該使用預設選擇(第三個條目,Windows)。
我是否需要(不知何故,我不知道如何)將 GRUB 安裝/複製/dd 到 USB 棒/SD 卡上,並選擇它作為 BIOS 引導順序中的第一項,並回退到 Ubuntu 的分區,目前哪個是引導順序中的第一個?
或者(希望)有一個工具可以讓我在 Stick/Card 上放置一個文件,然後由 GRUB 讀取?
更新:我一直在檢查 GRUB 配置文件,並註意到有一個名為的文件
/boot/grub/grubenv
,其中有一個名為next_entry=
. 存在這條線是因為我有時會使用sudo grub-reboot 0
它來重新啟動進入 Ubuntu。如果我執行sudo grub-reboot 0
,則此行更改為next_entry=0
.我現在正在考慮修改
/etc/default/grub/00_header
以檢查是否連接了某個 USB 設備,如果是,則它要麼寫入next_entry=0
文件grubenv
,要麼我添加一些程式碼,這些程式碼只是設置必要的變數,類似於next_entry=0
這樣做的方式。所以現在我的問題是我不知道可以執行哪些操作
00_header
,最終使用curl
來獲取變數將是完美的,但我想那時沒有網路存在並且 curl 不是一個可辨識的命令。如何調試/學習 GRUB 以查看此文件中的功能,而不會有損壞系統的風險?
我目前正在考慮使用帶有快照的干淨虛擬機,如果出現問題,我可以恢復到該快照中,以獲得一些見解。但也許這裡專家的一兩個提示對我來說很有價值。
如果您在 GRUB 2 選擇菜單中中止引導過程並放入 shell,您將能夠通過執行
ls
命令列出連接的設備。在我的情況下,USB 記憶棒是
(hd0,msdos1)
.首先,我修改了
/boot/grub/grub.cfg
文件,使其包含以下內容:### BEGIN /etc/grub.d/00_header ### if [ -s $prefix/grubenv ]; then set have_grubenv=true load_env fi # =================== BEGIN MODIFICATION =================== if [ -s (hd0,msdos1)/grub_boot_config ]; then set next_entry=0; fi # =================== END MODIFICATION =================== if [ "${initrdfail}" = 2 ]; then set initrdfail= elif [ "${initrdfail}" = 1 ]; then ...
next_entry=0
如果我跑了$prefix/grubenv
會在哪裡設置sudo grub-reboot 0
。這有效,但它無法在核心升級後繼續存在,因為它會重建
/boot/grub/grub.cfg
然後我
/etc/grub.d/00_header
通過添加以下內容進行了修改:cat << EOF if [ -s \$prefix/grubenv ]; then set have_grubenv=true load_env fi EOF # =================== BEGIN MODIFICATION =================== cat << EOF # =================== BEGIN MODIFICATION =================== if [ -s (hd0,msdos1)/grub_boot_config ]; then set next_entry=0; fi # =================== END MODIFICATION =================== EOF # =================== END MODIFICATION =================== cat <<EOF if [ "\${initrdfail}" = 2 ]; then set initrdfail= elif [ "\${initrdfail}" = 1 ]; then ...
並發出
sudo update-grub
,然後生成/boot/grub/grub.cfg
結果是,如果插入 USB 記憶棒並且它
grub_boot_config
在根目錄中包含文件(可以為空),那麼(hd0,msdos1)/grub_boot_config
將成功並設置next_entry=0
.下一步的改進是在
0
文件中包含(或應啟動的任何菜單項),並讓腳本讀取並設置next_entry
它,並使其在每個驅動器上搜尋此文件,而不僅僅是(hd0,msdos1)
.無論如何,事實證明它對
/boot/grub/grub.cfg
拼寫錯誤非常有彈性,因此您不太可能通過進行這些修改來破壞您的系統(這是我用乾淨的 VM 測試的)。
以前有一個軟體叫Multisystem。我看它還在。它通常是一種軟體,可讓您將多個發行版安裝到 U 盤上。您可以使用它(我已經使用它)的方式是使用它引導到 grub(USB 快閃記憶體驅動器的 grub)。我看到的一個較新的工具叫做 Ventoy,但我沒有使用過它。看起來它有相同的方法。基本上,我口袋裡有 GRUB。否則,我曾經啟動到 Windows。我沒有(故意)安裝 grub,我也是雙引導,使用 U 盤引導進入 Debian。有更乾淨的方法可以做到這一點,但我認為這些會更容易。