萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Ubuntu GRUB2 雙系統啟動順序修改:設定 Windows 為預設啟動項

GRUB2 配置機制

GRUB2 (Grand Unified Bootloader 2) 是現代 Linux 發行版標準啟動加載器。配置文件 /boot/grub/grub.cfg 由 grub-mkconfig 根據模板 /etc/grub.d/ 和設置 /etc/default/grub 自動生成,**嚴禁直接編輯 grub.cfg**,否則內核更新後配置失效。

方法一:修改 /etc/default/grub (推薦,持久化)

1. 查看當前啟動項順序

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。

2. 修改預設啟動項

# 編輯
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

3. 可選:調整顯示超時

GRUB_TIMEOUT=10          # 等待秒數
GRUB_TIMEOUT_STYLE=menu  # menu=顯示菜單, hidden=隱藏, countdown=倒計時
GRUB_HIDDEN_TIMEOUT_QUIET=false

4. 重新生成配置並生效

sudo update-grub
# 或
sudo grub-mkconfig -o /boot/grub/grub.cfg

方法二:調整 grub.d 腳本優先級 (進階)

將 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

UEFI 雙系統特殊情況

  • Windows 和 Ubuntu 必須同為 UEFI 模式安裝
  • 共用 EFI 系統分區 (ESP,通常 /boot/efi,FAT32)
  • grub-install 目標為 --target=x86_64-efi --efi-directory=/boot/efi
  • Windows 启动管理器 可能在 ESP 的 /EFI/Microsoft/Boot/bootmgfw.efi
  • os-prober 需啟用:GRUB_DISABLE_OS_PROBER=false (Ubuntu 22.04+ 默認關閉)

常見問題排查

問題原因解決
update-grub 未檢測到 Windowsos-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各硬盤有獨立 ESPBIOS 選擇啟動順序,或用 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

替代方案:rEFInd (UEFI 專用圖形啟動管理器)

# 安裝
sudo apt install refind
# 或手動安裝到 ESP
# refind-install --usedefault /dev/sda1 --alldrivers

# 特點: 自動檢測所有 EFI 可啟動項,圖形界面,主題美觀,無需手動配置內核參數

總結

  1. 標準做法:編輯 /etc/default/grub 設置 GRUB_DEFAULT="精確菜單標題" → sudo update-grub
  2. 避免直接編輯 grub.cfg,內核更新會覆蓋
  3. UEFI 環境確保 os-prober 啟用、ESP 正確掛載
  4. 備選方案:rEFInd 提供更友好的圖形化多系統管理
copyright © 萬盛學電腦網 all rights reserved