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

第一步:确认 Windows 分区和引导模式
在配置之前,必须确定两个关键信息:
- Windows 所在的分区:
/dev/sda1,/dev/nvme0n1p2,/dev/sdb3等。 - BIOS 或 UEFI 模式:你的电脑是使用传统的 BIOS 还是现代的 UEFI 启动,这决定了 Windows 分区的类型。
如何查找 Windows 分区?
打开终端,使用以下命令之一:
# 使用 lsblk 命令,查看所有磁盘和分区 lsblk # 或者使用 fdisk 命令 sudo fdisk -l
在输出中,你需要找到一个符合 Windows 分区特征的分区:
- 文件系统类型 通常是
NTFS或FAT32。 - 大小 和你的 Windows C 盘大小相符。
- 分区标签 可能是
OS或没有标签。
记下这个分区的设备名,/dev/sda2。

如何确认是 BIOS 还是 UEFI 模式?
# 查看 /sys/firmware/efi 目录是否存在 # 如果存在,则是 UEFI 模式;如果不存在,则是 BIOS 模式 ls /sys/firmware/efi
第二步:手动编辑 GRUB 配置文件
GRUB 的主配置文件是 /etc/grub.d/40_custom,我们通常在这个文件中添加自定义的启动项。
-
打开文件: 使用你喜欢的文本编辑器,以 root 权限打开文件。
sudo nano /etc/grub.d/40_custom
-
添加启动项:
根据你上一步确认的 BIOS/UEFI 和 分区类型,选择下面对应的代码块,并修改其中的
partition为你找到的 Windows 分区。
(图片来源网络,侵删)
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 模块。
-
首先安装
ntfs-3g:sudo apt update sudo apt install ntfs-3g
-
然后修改
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 配置并重启
-
保存并关闭
40_custom文件(在nano中是Ctrl+X,Y,回车)。 -
更新 GRUB:这一步非常重要,它会读取所有
grub.d目录下的配置文件,并生成最终的/boot/grub/grub.cfg配置文件。sudo update-grub
你会看到输出中包含了你刚刚添加的 "Windows 10/11" 启动项。
-
重启电脑:
sudo reboot
重启后,你应该会在 GRUB 启动菜单中看到 "Windows 10/11" 或你自定义的名称,选择它,电脑就会启动 Windows。
故障排除
如果配置后无法启动 Windows,请检查以下几点:
- 分区号错误:这是最常见的问题,请务必确认
set root中的分区号是否正确,可以用ls (hd0,gpt1)这样的命令在 GRUB 命令行中尝试列出分区内容来验证。 - 引导文件路径错误:对于 UEFI 模式,请确认
bootmgfw.efi文件确实存在于你指定的路径下,你可以挂载 Windows 分区后检查。 - Fast Startup 问题:Windows 的“快速启动”功能有时会导致引导问题,建议在 Windows 中禁用它:
- 打开“控制面板” -> “硬件和声音” -> “电源选项”。
- 点击“选择电源按钮的功能” -> “更改当前不可用的设置”。
- 取消勾选“启用快速启动(推荐)”。
- Windows 分区被休眠:如果你从 Windows 进入休眠状态而不是关机,GRUB 可能无法正确引导,请确保在关机前完全关闭 Windows。
通过以上步骤,你应该就能成功配置 GRUB 来启动 Windows 了。
