Life Journal

随笔,及其他

我是 Xiao Xiao,在日本的产品经理,偶尔也写代码,iOS/Mac/Web,偶尔也做设计,爱用 Sketch,偶尔写文字,存在这里。


浅说GPT与各类引导程序

这篇文章也欠了好久呃。最近忙于项目,无暇顾及博客。不得已晓晓决定开始用iPhone上的wordpress客户端写博客了。

文章中的结论,或为晓晓反复试验得出,或为查阅软件文档得出,随着软件更新,可能会有变哦。

首先来说说Windows自带的引导程序。应该说,Windows对GPT的支持还是不错的,前提是主板支持EFI。因此在MBR/GPT混合磁盘中,Win仅能识别作MBR磁盘,所以和MBR下的表现无异。如果此时强行将Win装到GPT分区范围,那么在修复引导时你会遇到很神奇的错误提示。。。

此外,如果要在windows下引导至Mac所在分区,原始的chain0以及tboot是不支持GPT的,这里有一个修改版的chain0文件,支持GPT上的引导。原地址在这里。

其次是Linux常用的Grub。这里需要注意,现行的Grub分两个版本,大多数发行版使用的1.0版本,以及Ubuntu 9.10使用的1.9X(也就是说 2)版本。
1.0版本实际较弱,不支持GPT,对于非Linux系统似乎仅能以chainloader+1方式引导(其实已经很好了),但是对于Mac的引导支持并不好——尤其是当需要使用EFI来加载一些破解用kext时。
而 2 版本的Grub在这方面强化了很多,查看其配置文件grub.cfg可以看见,可以直接设定其关于kext加载甚至图片的自定义。

?Download grub.cfg
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

menuentry "Mac OS X (on /dev/sda6)"{ insmod hfsplus setroot=(hd0,6) search --no-floppy--fs-uuid--set 4cee3ea2a82a0dd0 insmod vbe doresume=0if[/var/vm/sleepimage -nt10/]; thenif xnuresume /var/vm/sleepimage; thendoresume=1#支持睡眠唤醒fifiif[$doresume == 0]; then xnuuuid 4cee3ea2a82a0dd0 uuid if[-f/Extra/DSDT.aml ]; then acpi -e/Extra/DSDT.aml #加载DSDT配置文件fi xnukernel /machkernel boot-uuid=${uuid}rd=*uuid if[/System/Library/Extensions.mkext -nt/System/Library/Extensions ]; then xnumkext /System/Library/Extensions.mkext #定义系统kext缓存else xnukextdir /System/Library/Extensions #定义系统kext文件位置fiif[-f/Extra/Extensions.mkext ]; then xnumkext /Extra/Extensions.mkext #自定义额外加在的kext缓存fiif[-d/Extra/Extensions ]; then xnukextdir /Extra/Extensions #自定义额外加在的kext文件位置fiif[-f/Extra/devtree.txt ]; then xnudevtree /Extra/devtree.txt #自定义设备树fiif[-f/Extra/splash.jpg ]; then insmod jpeg xnu_splash /Extra/splash.jpg #自定义启动画面fi#code omittedfi}

并且Grub 2可以被安装在EFI分区,甚至引导原版Macbook,自然也支持纯GPT(必须有EFI)。注意:在多硬盘情况是,Grub 2仍非常容易出问题。

需要指出的是,Grub对混合GPT磁盘格式的支持并不完善——Grub必须被安装到MBR中。即使安装至前四个MBR分区的VBR中,在开机时Grub也不会启动。另外补充一句,在MBR磁盘中,Grub 2不能被装在扩展分区之后,否则其关于分区的判断会出错。此乃BUG,可手工修复。但在Linux中,对于分区情况的识别,几乎始终是正确的。

最后,我们来看看Hackintosh常用的引导程序,Chameleon (此处仅讨论2.0版本,1.0未实验且过古老)和基于它的衍生版本Boot Think,在分区识别上二者效果基本一致,故不做区别。Chameleon对于混合GPT的支持很好,但致命的缺陷是,不能很好的支持linux的ext分区。只有MBR分区形式的ext分区才能被正确识别。GPT部分的ext基本都识别不出来。这个情况到进入MacOS后会变成另一番样子,磁盘工具对分区的识别会出错,比如可能不能正确识别ext分区的末端。

不过,Chameleon也支持安装到EFI分区。并且新版的boot Think甚至支持加载kext后引导Mac安装光盘,这是其他引导程序所没有实现的。

由于对Chameleon没有深入研究的渠道,所以目前的结论只有以上这些。

目前晓晓使用的是Grub 2来引导。