使用GRUB2制作多重系统引导程序

装了黑苹果后,同一硬盘多个分区,有不同的系统,为了统一管理,需要找一个通用性强的引导程序。

现在环境是这样的一块硬盘,MBR分区方式,4个主分区分别如下:

文件系统操作系统引导方式
分区一(C:)NTFSWindowsBootmgr
分区二(D:)EXT4Ubuntulinux/initrd
分区三(E:)HFS+MacOSXboot(变色龙)
分区四(F:)FAT32grldr

分区四是目前只有1GB,预留用来存放通用引导程序的分区,这个分区是活动分区。

这样的分区方式,设计思想是各个分区负责引导各个分区的操作系统,互不干扰。

如果把grldr放到C盘根目录下,由Bootmgr来加载grldr,这不符合我的设计美学。

一开始我是这样思考的:

MBR设置为NT6 MBR,活动分区设置为分区四,分区四的PBR设置为GRUB4DOS。

也就是在分区四的根目录添加grldr文件和menu.lst文件,由它来引导这三个系统。

但很快就发现GRUB4DOS不支持HFS文件系统,不能读取分区三下面的/boot文件。

于是又想到了它的chainloader,用链式引导的方式,引导各个分区的PBR。

但很快又发现HFS系统的PBR很难正确地设置,还是无法引导/boot文件。

最终只能放弃GRUB4DOS。

目前能支持HFS文件系统的还是只有Chameleon和GRUB2。

优先考虑GRUB2这个引导程序。

好吧,先去下载GRUB2的内核文件,自己制作一个GRLDR吧:

下载地址: http://alpha.gnu.org/gnu/grub/

然后使用下面的命令生成一个支持HFS的core.img文件:

grub-mkimage.exe -C none -o core.img -O i386-pc -d i386-pc -p / biosdisk memdisk disk part_apple part_gpt part_msdos iso9660 udf fat exfat ntfs ext2 hfs hfsplus ls lsapm  mmap loopback net chain ntldr linux linux16 multiboot boot reboot help

这个core.img可以用GRUB4DOS的kernel命令引导,但是无法被PBR引导。

虽然有boot.img和diskboot.img,但还是没有找到正确的引导方法。

最终我用GRUB4DOS的GRLDR前面512字节数据添加到core.img的头部,

再把这个core.img改名为GRLDR,就可以被PBR引导了。(这个地方可能有问题)

需要这个GRLDR文件的可以在这里下载: https://download.csdn.net/download/qq446252221/11214645

经过测试,这个GRUB2就厉害了,可以读取HFS分区。

但有一个问题:在Windows系统下写入到HFS分区的文件,在GRUB2下无法显示出来。

因为这些文件的权限是0,需要进MAC系统修复文件的权限为755。

最后再把过程整理一下:

1.不管你用什么方式先把三个系统分别安装到C/D/E盘。

2.进Windows系统打开BootICE,把硬盘的MBR设置为NT6.0(引导活动分区的PBR)。

3.设置分区四为活动分区。

4.用BootICE把分区四的PBR设置为GRUB4DOS(其实我们的引导文件是GRUB2)。

5.把GRLDR和GRUB.CFG拷贝到分区四的根目录。

6.重启电脑,应该可以看到启动菜单了。完美!

最后,附上一个GRUB.CFG文件仅供参考:

set timeout=5
set default=0

menuentry "Microsoft Windows" {
    set root=hd0,1
    ntldr /Bootmgr
}

menuentry "Ubuntu Linux" {
    set root=hd0,2
    linux /boot/vmlinuz
    initrd /boot/initrd.gz
}

menuentry "Apple macOSX" {
    set root=hd0,3
    multiboot /boot
}

menuentry "Windows PE" {
    linux16 /memdisk iso
    initrd16 /winpe.iso
}