GRUB2 (Grand Unified Bootloader 2) 是現代 Linux 發行版標準啟動加載器。配置文件 /boot/grub/grub.cfg 由 grub-mkconfig 根據模板 /etc/grub.d/ 和設置 /etc/default/grub 自動生成,**嚴禁直接編輯 grub.cfg**,否則內核更新後配置失效。
grep -E "^menuentry|^submenu" /boot/grub/grub.cfg | cat -n
# 輸出示例:
# 1 menuentry 'Ubuntu' ...
# 2 menuentry 'Ubuntu, with Linux 5.15.0-91-generic (recovery mode)' ...
# 3 menuentry 'Memory test (memtest86+)' ...
# 4 menuentry 'Windows 10 (on /dev/sda1)' ...
索引從 0 開始,Windows 為第 4 項 → 索引 3。
# 編輯
sudo vim /etc/default/grub
# 修改 GRUB_DEFAULT
# 方式 A: 數字索引 (脆弱,內核更新後順序可能變)
GRUB_DEFAULT=3
# 方式 B: 精確菜單標題 (推薦,穩定)
GRUB_DEFAULT="Windows 10 (on /dev/sda1)"
# 方式 C: saved (記住上次選擇)
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
GRUB_TIMEOUT=10 # 等待秒數
GRUB_TIMEOUT_STYLE=menu # menu=顯示菜單, hidden=隱藏, countdown=倒計時
GRUB_HIDDEN_TIMEOUT_QUIET=false
sudo update-grub
# 或
sudo grub-mkconfig -o /boot/grub/grub.cfg
將 os-prober (檢測其他系統) 腳本優先級提前,使 Windows 菜單項排在 Ubuntu 之前。
# 查看腳本順序
ls /etc/grub.d/
# 10_linux 20_linux_xen 30_os-prober 40_custom ...
# 將 30_os-prober 改為 06_os-prober (在 10_linux 之前)
sudo mv /etc/grub.d/30_os-prober /etc/grub.d/06_os-prober
# 重新生成
sudo update-grub
原理:grub-mkconfig 按文件名字典序執行腳本,06_ 先於 10_,Windows 菜單項先生成,索引變為 0。
# 下次重啟一次生效,再次重啟恢復預設
sudo grub-reboot "Windows 10 (on /dev/sda1)"
# 或索引
sudo grub-reboot 3
--target=x86_64-efi --efi-directory=/boot/efi/EFI/Microsoft/Boot/bootmgfw.efiGRUB_DISABLE_OS_PROBER=false (Ubuntu 22.04+ 默認關閉)| 問題 | 原因 | 解決 |
|---|---|---|
| update-grub 未檢測到 Windows | os-prober 禁用 / ESP 未掛載 / 分區標譤錯誤 | 掛載 ESP,啟用 GRUB_DISABLE_OS_PROBER=false,檢查 parted -l |
| 選擇 Windows 後黑屏/報錯 | 安全啟動 / BitLocker / 快速啟動 | BIOS 關閉 Secure Boot,Windows 關閉快速啟動,暫停 BitLocker |
| GRUB 菜單不顯示 | GRUB_TIMEOUT_STYLE=hidden / GRUB_TIMEOUT=0 | 改為 menu 和 5-10 秒 |
| 內核更新後 Windows 消失 | 直接編輯 grub.cfg / os-prober 未運行 | 恢復標準流程:修改 /etc/default/grub + update-grub |
| 雙硬盤 UEFI | 各硬盤有獨立 ESP | BIOS 選擇啟動順序,或用 rEFInd 管理 |
# 備份關鍵文件
sudo cp /etc/default/grub /etc/default/grub.bak
sudo cp -r /etc/grub.d /etc/grub.d.bak
# 災難恢復: Live USB 啟動 -> 掛載根分區 -> chroot -> 重裝 GRUB
sudo mount /dev/sda2 /mnt
sudo mount /dev/sda1 /mnt/boot/efi # UEFI
for i in /dev /dev/pts /proc /sys /run; do sudo mount --bind $i /mnt$i; done
sudo chroot /mnt
grub-install /dev/sda
update-grub
exit
sudo reboot
# 安裝
sudo apt install refind
# 或手動安裝到 ESP
# refind-install --usedefault /dev/sda1 --alldrivers
# 特點: 自動檢測所有 EFI 可啟動項,圖形界面,主題美觀,無需手動配置內核參數
/etc/default/grub 設置 GRUB_DEFAULT="精確菜單標題" → sudo update-grub