Windows 安裝程式會無條件覆寫 MBR (BIOS) 或 EFI 系統分區 (UEFI),移除 GRUB 開機載入器,導致直接進入 Windows 無法選擇 Linux。
# 當前執行環境
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS"
# 目標磁碟分區表
lsblk -f
# 或
fdisk -l /dev/sda
parted /dev/sda print
lsblk -f 找出根分區、EFI 分區 (UEFI)、/boot 分區 (若獨立)# 1. 掛載根分區 (假設 /dev/sda2)
mount /dev/sda2 /mnt
# 2. 掛載 /boot (若獨立,假設 /dev/sda1)
mount /dev/sda1 /mnt/boot
# 3. 虛擬檔案系統
for d in dev proc sys; do mount --bind /$d /mnt/$d; done
# 4. Chroot
chroot /mnt
# 5. 安裝 GRUB 到 MBR
grub-install /dev/sda
# 6. 產生選單
grub-mkconfig -o /boot/grub/grub.cfg
# 或舊版
grub2-mkconfig -o /boot/grub2/grub.cfg
# 7. 退出重啟
exit
umount -R /mnt
reboot
# 1. 掛載根分區
mount /dev/sda2 /mnt
# 2. 掛載 EFI 系統分區 (關鍵!通常 /dev/sda1,FAT32,標籤 EFI/ESP)
mount /dev/sda1 /mnt/boot/efi
# 3. 掛載 /boot (若獨立)
# mount /dev/sda3 /mnt/boot
# 4. 虛擬檔案系統
for d in dev proc sys run; do mount --bind /$d /mnt/$d; done
# 5. Chroot
chroot /mnt
# 6. 安裝 GRUB 到 EFI 分區並註冊 NVRAM
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck
# Fedora/RHEL: --bootloader-id=linux / --bootloader-id=redhat
# 7. 產生選單
grub-mkconfig -o /boot/grub/grub.cfg
# 8. 重啟驗證
exit
umount -R /mnt
reboot
若看到 grub> 或 grub rescue> 提示符:
# 1. 找出含 grub 目錄的分區
ls
# 輸出如: (hd0,gpt1), (hd0,gpt2), (hd0,gpt3) ...
# 逐一嘗試
ls (hd0,gpt1)/
ls (hd0,gpt2)/boot/grub
# 找到含 grub.cfg 的分區,假設是 (hd0,gpt2)
# 2. 設定 prefix 與 root
set prefix=(hd0,gpt2)/boot/grub
set root=(hd0,gpt2)
insmod normal
normal
# 3. 進入選單後選擇 Linux 啟動,進入系統再執行 grub-install
\EFI\ubuntu\grubx64.efi 或 shimx64.efibcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efisel disk 0; sel part 1; assign letter=Z:,再用 EasyUEFI 指向 Z:\EFI\ubuntu\grubx64.efi| 現象 | 原因 | 解決 |
|---|---|---|
| grub-install: EFI variables are not supported | Live USB 以 BIOS 模式啟動,但目標為 UEFI | 重新以 UEFI 模式啟動 Live USB (BIOS 設定 UEFI First / 關閉 CSM) |
| grub-install: failed to get canonical path of /cow | chroot 環境不完整 | 確認 /dev, /proc, /sys, /run 皆已 bind mount |
| Windows 快速啟動鎖定 EFI 分區 | Windows 預設啟用快速啟動 (休眠) | Windows 關機時按 Shift+關機、或 powercfg /h off 關閉休眠 |
| 修復後 GRUB 選單無 Windows 項 | os-prober 未偵測 / 未啟用 | GRUB_DISABLE_OS_PROBER=false 在 /etc/default/grub → update-grub |
| 雙硬碟:GRUB 安裝到錯誤磁碟 | /dev/sda vs /dev/sdb 混淆 | 用 UUID/標籤確認,grub-install /dev/disk/by-id/ata-XXXX |
核心口訣:Live USB 同架構、掛載對分區、模式對模式、chroot 進系統、grub-install 寫開機、update-grub 產選單。