通过Grub命令指定引导分区

起因:在公司服务器上装了Windows和Ubuntu双系统,Windows是自带的,Ubuntu是后装的。系统有两块硬盘,参照网上的教程从C盘和D盘分别压缩出200M和100G空间分给Ubuntu使用,安装时手动设置把200M挂载到/boot,把100G挂载到/,安装一切顺利,重启后可以看到Ubuntu带的Grub菜单,默认进入Ubuntu,还有一个选项是Windows Boot Manager可以进入Windows,选择Ubuntu进入Ubuntu正常,再次重启在Grub菜单选择进入Windows也正常,但是再次重启时Grub菜单消失了,直接进入了Windows,无法选择进入Ubuntu。

猜测是Windows Boot Manager会改写MBR(主引导记录)

MBR是硬盘上的一个扇区,包含了引导程序(的第一阶段)、分区表等信息。

引导程序第一阶段需要去MBR中去读引导程序,GRUB第二阶段需要到/boot分区读系统内核和配置文件。

而MBR中的程序包括了加载第二阶段的程序。

当我只有Windows系统时,MBR中的程序会启动Windows Boot Manager,在我安装了Ubuntu之后,MBR中的程序被修改成启动Ubuntu新分出来的那个/boot下的引导程序,然后可以通过菜单再去启动原来的Windows Boot Manager。

如果启动Windows Boot Manager后它修改了MBR让其中的程序在下次启动时加载自己,那么就跳过了选择进入Ubuntu的可能。

因为我们装Ubuntu只是为了测试,所以采取了临时的解决方式。通过Ubuntu的安装U盘启动,到选择安装Ubuntu的Grub菜单界面按c进入命令模式。

因为这时候插着一个U盘两块硬盘,不知道对应的编号,通过

1
2
3
ls (hd0)
ls (hd1)
...

这样的试探操作,可以根据硬盘上的分区数量和分区大小确定Ubuntu /boot对应的硬盘和分区编号

1
2
(hd1, gpt3) 100G Ubuntu /
(hd2, gpt5) 200M Ubuntu /boot

手动指定加载已经安装的Ubuntu的Grub的配置文件/boot/grub/grub.cfg

1
configfile  (hd2, gpt5)/grub/grub.cfg

会弹出选择菜单,就和MBR在引导第二阶段加载了Ubuntu的/boot一样,然后选择Ubuntu进入即可。

BTW:准备尝试还没有尝试的命令

1
2
3
set root=(hd2, gpt5)
chainloader /efi/EFI/ubuntu/grubx64.efi
boot