GRUB 是 Linux 常用的多系统引导器,很多双系统用户安装 Linux 之后,原来的 Windows7 引导项丢失,开机直接进入 GRUB 命令行或者 GRUB 菜单没有 Win7 选项,想要通过 GRUB 引导进入 Win7,核心原理就是 GRUB 识别 Windows 分区,调用 Windows 自带的 bootmgr 引导程序启动系统,操作分为临时命令行手动引导,还有永久写入 grub.cfg 开机菜单两种方式,临时引导只当次生效,重启之后还会丢失,永久配置之后开机就可以直接选择 Win7。做这个操作之前要确认硬盘模式,如果是 Legacy BIOS 传统模式和 UEFI 模式引导命令不一样,分区编号也不能填错,一旦分区号写错会引导失败,还需要提前确认 Win7 所在分区,一般 Win7 系统分区是 NTFS 格式,还有可能存在单独的 100MB 系统保留分区,这个是很多人失败的主要原因。操作的时候第一步确认是 Legacy 还是 UEFI,第二步确认 Win7 系统分区和系统保留分区编号,第三步可以先在 GRUB 命令行测试引导,测试成功之后再修改 grub.cfg 永久保存。综合来说 Legacy 模式下核心就是 chainloader 链式加载 bootmgr,UEFI 模式需要加载 EFI 分区里面的 win7 efi 引导文件。
两种引导模式对照表
| 引导模式 | 核心引导文件 | 引导方式 |
|---|---|---|
| Legacy BIOS | bootmgr | chainloader 链式加载 |
| UEFI | EFI/Microsoft/Boot/bootmgfw.efi | 加载 efi 引导程序 |
临时 GRUB 命令行手动引导(Legacy BIOS)
开机进入 grub > 命令行之后依次输入命令
set root=(hd0,msdos1)
chainloader +1
boot
这里 hd0 代表第一块硬盘,msdos1 代表第一个主分区,如果是系统保留分区就填保留分区编号,如果没有单独保留分区,就直接指向 Win7 主系统分区,输入 boot 之后就会启动 Win7。
如果提示 NTFS 无法识别,需要先加载 ntfs 模块,输入 insmod ntfs,再执行上面引导命令。
永久添加 Win7 到 GRUB 菜单(Legacy)
编辑 /etc/grub.d/40_custom 文件,添加菜单项
menuentry "Windows 7" {
set root=(hd0,msdos1)
chainloader +1
}
保存之后在 Linux 里面执行更新 grub 命令,不同发行版命令有区别,Debian Ubuntu 是 update-grub,CentOS 类是 grub-mkconfig -o /boot/grub/grub.cfg,执行完成重启,GRUB 菜单就会出现 Windows7 选项。
UEFI 模式 GRUB 引导 Win7
UEFI 模式不能使用 chainloader +1,需要定位 ESP EFI 系统分区,grub 命令行参考
insmod part_gpt
insmod fat
set root=(hd0,gpt1)
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
boot
hd0 gpt1 就是 ESP 分区,永久配置同样写入 40_custom 之后更新 grub 配置。
常见失败原因
第一 分区编号错误,GRUB 分区编号和 Windows 磁盘管理编号不一样,msdos 从 1 开始,gpt 也是从 1 开始,很多人习惯 Windows 从 0 编号导致出错。
第二 缺少系统保留分区,Win7 Legacy 安装默认生成 100M 系统保留分区,引导文件 bootmgr 在保留分区,不是 C 盘,指向 C 盘会引导失败。
第三 NTFS 模块没有加载,GRUB 默认没有加载 ntfs 驱动,识别不到 NTFS 分区会报错。
第四 Win7 引导本身损坏,就算 GRUB 配置正确,bootmgr 损坏依旧无法启动,这种情况需要用 Win7 安装盘修复启动项。
【常见问题】
问题 1 grub 怎么进入 win7,临时引导重启就没了吗
回答 1 grub 怎么进入 win7,grub 命令行临时引导只当次有效,重启之后 GRUB 菜单不会保留 win7 选项,想要每次开机都能选择 win7,需要修改 40_custom 并且执行 update-grub 永久写入 grub.cfg。
问题 2 grub 引导 win7 提示 error unknown filesystem 怎么办
回答 1 grub 引导 win7 出现 unknown filesystem,一般是没有加载 ntfs 模块或者分区编号填写错误,先执行 insmod ntfs,重新确认 hd 和 msdos gpt 分区编号,再重新执行 chainloader 引导 win7。
问题 3 Legacy 和 UEFI 的 grub 引导 win7 命令可以通用吗
回答 1 Legacy 和 UEFI 的 grub 引导 win7 命令不能通用,Legacy 使用 chainloader +1,UEFI 需要指定 bootmgfw.efi 文件路径,模式搞错就算分区正确也无法进入 win7。
问题 4 grub 配置好还是进不去 win7 是不是 grub 的问题
回答 1 grub 配置正确依旧无法进入 win7,不一定是 grub 配置问题,有可能是 win7 本身 bootmgr 或者 BCD 引导数据损坏,这种情况需要使用 win7 原版安装介质修复 Windows 启动引导。
【免责申明】
本文为 GRUB 引导双系统技术教程,操作涉及磁盘分区和引导配置,误操作有可能造成系统无法启动,重要数据请提前备份,不同 Linux 发行版 grub 版本和命令存在差异,操作前确认硬盘分区与引导模式,本文仅作技术参考,不承担操作造成的数据损失。


