菜鸟科技网

grub如何启动windows系统?

核心原理

GRUB 启动 Windows 的关键在于使用 chainloader 命令。chainloader 的作用是“加载并执行一个分区引导扇区”(通常是 MBR 或 GPT 分区的前 512 字节),Windows 的引导程序就存放在其所在分区的引导扇区,GRUB 的任务就是找到 Windows 分区,然后把这个引导扇区“链式加载”起来,剩下的工作就交给 Windows 自己的引导程序了。

grub如何启动windows系统?-图1
(图片来源网络,侵删)

第一步:确认 Windows 分区和引导模式

在配置之前,必须确定两个关键信息:

  1. Windows 所在的分区/dev/sda1, /dev/nvme0n1p2, /dev/sdb3 等。
  2. BIOS 或 UEFI 模式:你的电脑是使用传统的 BIOS 还是现代的 UEFI 启动,这决定了 Windows 分区的类型。

如何查找 Windows 分区?

打开终端,使用以下命令之一:

# 使用 lsblk 命令,查看所有磁盘和分区
lsblk
# 或者使用 fdisk 命令
sudo fdisk -l

在输出中,你需要找到一个符合 Windows 分区特征的分区:

  • 文件系统类型 通常是 NTFSFAT32
  • 大小 和你的 Windows C 盘大小相符。
  • 分区标签 可能是 OS 或没有标签。

记下这个分区的设备名,/dev/sda2

grub如何启动windows系统?-图2
(图片来源网络,侵删)

如何确认是 BIOS 还是 UEFI 模式?

# 查看 /sys/firmware/efi 目录是否存在
# 如果存在,则是 UEFI 模式;如果不存在,则是 BIOS 模式
ls /sys/firmware/efi

第二步:手动编辑 GRUB 配置文件

GRUB 的主配置文件是 /etc/grub.d/40_custom,我们通常在这个文件中添加自定义的启动项。

  1. 打开文件: 使用你喜欢的文本编辑器,以 root 权限打开文件。

    sudo nano /etc/grub.d/40_custom
  2. 添加启动项

    根据你上一步确认的 BIOS/UEFI分区类型,选择下面对应的代码块,并修改其中的 partition 为你找到的 Windows 分区。

    grub如何启动windows系统?-图3
    (图片来源网络,侵删)

BIOS (Legacy) 模式启动

如果你的电脑是 BIOS 模式,Windows 分区通常是 NTFS 格式。 添加到 40_custom 文件的末尾:

# Windows Bootloader (BIOS/NTFS)
menuentry "Windows 10/11" {
    # 设置根设备为 Windows 分区
    insmod ntfs
    set root='(hd0,msdos1)'  # !!! 修改这里的分区号,(hd0,msdos2)
    # 加载 Windows 的引导扇区
    chainloader +1
}

代码解释

  • insmod ntfs:加载 NTFS 文件系统模块,让 GRUB 能识别 NTFS 分区。
  • set root='(hd0,msdosX)'
    • hd0 代表第一块硬盘,如果你的 Windows 在第二块硬盘,hd1
    • msdosX 代表分区号。注意:在 GRUB 中,分区号是从 1 开始的,而不是 Linux 中的从 0 开始,所以如果你的 Linux 看到的是 /dev/sda2,那么这里就是 (hd0,msdos2)
  • chainloader +1:加载当前分区的第一个扇区(即引导扇区)。

UEFI 模式启动

如果你的电脑是 UEFI 模式,情况会稍微复杂一点,因为 Windows 分区必须是 FAT32 格式,并且有一个特殊的 EFI 系统分区。

1 Windows 分区是 FAT32 格式(较新的 Windows 10/11 安装)

添加到 40_custom 文件的末尾:

# Windows Bootloader (UEFI/FAT32)
menuentry "Windows 10/11 (UEFI)" {
    # 设置根设备为 Windows 分区
    insmod fat
    set root='(hd0,gpt2)'  # !!! 修改这里的分区号,(hd0,gpt3)
    # 加载 Windows 的 EFI 引导文件
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

代码解释

  • insmod fat:加载 FAT 文件系统模块。
  • set root='(hd0,gptX)'
    • hd0 代表第一块硬盘。
    • gptX 代表 GPT 分区表下的分区号,同样,这里的 X 是从 1 开始的。
  • chainloader /EFI/Microsoft/Boot/bootmgfw.efi:直接指定 Windows 的 EFI 引导文件的完整路径。

2 Windows 分区是 NTFS 格式(旧版 Windows 或特殊情况)

UEFI 模式下,Windows 分区是 NTFS,GRUB 无法直接读取,你需要借助 ntfs3g 模块。

  1. 首先安装 ntfs-3g

    sudo apt update
    sudo apt install ntfs-3g
  2. 然后修改 40_custom 文件

    # Windows Bootloader (UEFI/NTFS)
    menuentry "Windows 10/11 (UEFI/NTFS)" {
        # 加载 ntfs 模块
        insmod ntfs
        # 设置根设备为 Windows 分区
        set root='(hd0,gpt2)'  # !!! 修改这里的分区号
        # 加载 EFI 引导文件
        chainloader /EFI/Microsoft/Boot/bootmgfw.efi
    }

第三步:更新 GRUB 配置并重启

  1. 保存并关闭 40_custom 文件(在 nano 中是 Ctrl+XY,回车)。

  2. 更新 GRUB:这一步非常重要,它会读取所有 grub.d 目录下的配置文件,并生成最终的 /boot/grub/grub.cfg 配置文件。

    sudo update-grub

    你会看到输出中包含了你刚刚添加的 "Windows 10/11" 启动项。

  3. 重启电脑

    sudo reboot

重启后,你应该会在 GRUB 启动菜单中看到 "Windows 10/11" 或你自定义的名称,选择它,电脑就会启动 Windows。


故障排除

如果配置后无法启动 Windows,请检查以下几点:

  1. 分区号错误:这是最常见的问题,请务必确认 set root 中的分区号是否正确,可以用 ls (hd0,gpt1) 这样的命令在 GRUB 命令行中尝试列出分区内容来验证。
  2. 引导文件路径错误:对于 UEFI 模式,请确认 bootmgfw.efi 文件确实存在于你指定的路径下,你可以挂载 Windows 分区后检查。
  3. Fast Startup 问题:Windows 的“快速启动”功能有时会导致引导问题,建议在 Windows 中禁用它:
    • 打开“控制面板” -> “硬件和声音” -> “电源选项”。
    • 点击“选择电源按钮的功能” -> “更改当前不可用的设置”。
    • 取消勾选“启用快速启动(推荐)”。
  4. Windows 分区被休眠:如果你从 Windows 进入休眠状态而不是关机,GRUB 可能无法正确引导,请确保在关机前完全关闭 Windows。

通过以上步骤,你应该就能成功配置 GRUB 来启动 Windows 了。

分享:
扫描分享到社交APP
上一篇
下一篇