浅说GPT与各类引导程序 « 晓 - Life Journal

浅说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
	set root=(hd0,6)
	search --no-floppy --fs-uuid --set 4cee3ea2a82a0dd0
        insmod vbe
        do_resume=0
        if [ /var/vm/sleepimage -nt10 / ]; then
           if xnu_resume /var/vm/sleepimage; then
             do_resume=1 #支持睡眠唤醒
           fi
        fi
        if [ $do_resume == 0 ]; then
           xnu_uuid 4cee3ea2a82a0dd0 uuid
           if [ -f /Extra/DSDT.aml ]; then
              acpi -e /Extra/DSDT.aml #加载DSDT配置文件
           fi
           xnu_kernel /mach_kernel boot-uuid=${uuid} rd=*uuid
           if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then
              xnu_mkext /System/Library/Extensions.mkext #定义系统kext缓存
           else
              xnu_kextdir /System/Library/Extensions #定义系统kext文件位置
           fi
           if [ -f /Extra/Extensions.mkext ]; then
              xnu_mkext /Extra/Extensions.mkext #自定义额外加在的kext缓存
           fi
           if [ -d /Extra/Extensions ]; then
              xnu_kextdir /Extra/Extensions #自定义额外加在的kext文件位置
           fi
           if [ -f /Extra/devtree.txt ]; then
              xnu_devtree /Extra/devtree.txt #自定义设备树
           fi
           if [ -f /Extra/splash.jpg ]; then
              insmod jpeg
              xnu_splash /Extra/splash.jpg #自定义启动画面
           fi
           #code omitted
        fi
}

并且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来引导。

Sid 晓 星期一, 十一月 16th, 2009 12:46 上午 GMT +8
  1. lovee

    晓晓终于吧这篇文章写好了,来抱抱

    星期四, 十一月 19th, 2009 11:16 下午 GMT +8
    • 晓晓

      loveeee抱抱~~~

      星期五, 十一月 20th, 2009 09:38 上午 GMT +8
      • lovee

        啊咧?HJMac兄还没来?

        星期五, 十一月 20th, 2009 11:43 下午 GMT +8
  2. xifs

    每看一次GPT的文章感觉就像在收折磨。
    主板!为什么你不支持EFI!!
    收藏做备用。感谢了

    星期日, 十一月 29th, 2009 01:14 下午 GMT +8
And a comment!
Your name
Your mail (will not be published)
Your website