OSX86引导文件研究
基于既有的PC知识,我们可以了解到,系统引导的第一步是读取硬盘的MBR(主引导记录,位于0头0道1扇区,占据512字节),再通过MBR中的Boot Sector小程序来得知哪一个分区是引导分区(被激活),再读取位于这个分区的启动扇区中的小程序(也是512字节),然后加载stage2以引导内核。用过Linux的应该知道,用dd命令dump出启动扇区的这512字节,放到Windows分区再加入boot.ini就可以启动GRUB,然后GRUB读取menu.lst以启动Linux系统内核(kernel/initrd)或启动其它的bootloader(chainloader),那么OSX86(这里特指OSX86非而真正的Mac)是怎样的呢?
由于真正的Mac使用EFI而非BIOS,所以它的启动过程和PC是不一样的,那么要在PC上安装OSX,就必须修改引导程序以符合PC的启动过程。
在JaS/ToH之类的破解版光盘里,我们可以看到,在/usr/standalone/i386文件夹中有几个boot*文件,一个cdboot和一个chain0文件。而在原版光盘的这个文件夹中只有boot.efi文件。boot.efi对于PC是没法用的,能用的是破解的那几个文件。
chain0大家很熟悉了,512字节,刚好可以写入启动扇区,但实际上并不是这样,写入启动扇区的并不是chain0,而是boot1h,我想chain0是为了专门从Windows菜单启动而写的。而boot这个文件(它有几十KB),则是boot1h所要引导的文件(我们可以用startupfiletool来安装它),但它被写到哪里去了呢?我们在硬盘上找不到这个文件,我想它被startupfiletool写到某个我们不知道的扇区去了,而并不在文件系统里面,这样做是可以启动的(可见作者用了点小心思)。
那么我们大致可以了解,OSX86启动的过程就是:
BIOS--MBR--(ntldr或grub或chain0或tboot)--boot1h--boot--mach_kernel
最近的PC EFI只是替代了boot以实现EFI欺骗,boot1h我们还是需要。
了解了这个过程,我们就可以了解cracker们到底做了哪些事情。对于安装/修复OSX86的引导程序,就可以有一个比较清晰的脉路了。
首先,我们来了解一下如何把引导程序安装到分区中去:
第一步:
diskutil list
这个命令显示所有分区列表,从这里我们可以知道我们的OSX86安装的分区编号,如disk1s1
第二步:
diskutil unmount /Volumes/volume_name
把要安装bootloader的分区卸下(×)。
第三步:
dd if=/usr/standalone/i386/boot1h of=/dev/rdisk1s1 bs=446 count=1
将boot1h写入启动扇区,这个命令对于Linux用户应该很熟悉。
第四步:
startupfiletool /dev/rdisk1s1 /usr/standalone/i386/boot
将boot文件写入(某个我们不知道的扇区,安装PC EFI时也用到这句,只是换了文件名)。
第五步:
bless -device /dev/disk1s1 -setBoot -verbose
做一些启动方面的设置。
还有两个命令(×):
diskutil mount /dev/disk1s1
bless -mount /Volumes/volume_name -setBoot -verbose
这就是安装OSX86 bootloader的基本过程,但是有什么用呢,明白了这个,你就明白了如何安装/修复Darwin bootloader,虽然这不如Windows的fdisk /mbr和fixmbr那么简单,也不如grub的setup那么好用,但以后如果出了引导方面的问题,你也可以修复了不是吗。
而且,还有一个用处,那就是在硬盘上没有OSX的情况下硬盘安装OSX,不过没有Linux那么牛可以纯硬盘安装,我们还是需要有一张OSX启动光盘的,可能你要问了,我既然有OSX光盘干嘛还要硬盘安装?不过你想想看,如果你只有Tiger的光盘,Leopard还没有刻盘,但可以硬盘安装Leopard,那不是很爽吗?或者你只有Live盘也行啊。
这种安装方法称为恢复安装,指的是用OSX1(比如Tiger)的光盘启动,再用安装程序的磁盘工具恢复下载好的OSX2(比如Leopard)镜像到一个分区,再从这个分区启动OSX2的安装程序,将OSX2安装到另一个分区。本论坛有人提过这种安装方法,但他忽略了一个最重要的步骤,那就是首先要使恢复的目标分区能够引导(我试过仅仅恢复光盘镜像 是不行的),而本篇文章讲到的正是这一点。
关于具体的安装步骤,请看这里(精力有限,我就不细说了):
http://forum.osx86scene.com/viewtopic.php?f=16&t=209
或这里:
http://www.sxhouse.org/bbs/announce/announce.asp?BoardID=112&ID=95716&Aupflag=1&Anum=1
不过要注意,一般来说,安装破解版的镜像方便一点,不过安装原版的镜像也行,但注意恢复完成后不要重启,要先破解目标分区上的文件(比如用BrazilMac-9a581-Patch中的9a581-patch.sh),然后重启,从目标分区启动安装程序,安装完成后也不要重启,再用9a581PostPatch.sh破解。
另外要注意的是,你使用的bless工具必须是破解过的(原版有这个文件但是不要用),而且要对应操作系统版本,如果你用Tiger光盘启动,不要拿Leopard的bless来用,是用不了的。在JaS版的Tiger光盘中,它在/usr/sbin/文件夹中,startupfiletool也在这里。在ToH版的Leopard光盘中也有这些工具,但它们放在/usr/misc/文件夹中(当然我想几乎不会有人用Leopard的光盘来硬盘安装Tiger)。
这不是一篇很好懂的文章,不是拿来就用的教程,要想完全搞明白还得自己学习。
/usr/standalone/i386文件夹中各个文件的作用:
boot 用startupfiletool写到OSX86所在分区的某个未知扇区,由boot1h引导它。
boot0 用dd命令写446字节到OSX86所在硬盘的MBR,可以修复Windows的Bootloader。
boot1h 用dd命令写446字节到OSX86所在的HFS(+)分区,可以修复OSX86启动扇区。
boot1u 可以修复OSX86所在的UFS分区的启动扇区。(由于没有UFS分区,我没有尝试。)
cdboot 用于制作启动光盘,用法请参考BrazilMac-9a581-Patch中的9a581-patch.sh文件。
chain0 用dd命令写446字节到OSX86所在硬盘的MBR,可以安装/修复Darwin Bootloader(成为系统默认引导器)。
写这篇文章同时参考了这些文章:
http://forum.osx86scene.com/viewtopic.php?f=16&t=1789
http://www.chinaz.com/Server/Linux/0RQ51332007.html
http://blog.chinaunix.net/u/4329/showart_402894.html
http://cimgoo.com/diy/2007/0706/article_35.html
[ 本帖最后由 pappplus 于 2007-11-29 16:45 编辑 ] 不错!支持原创!/thumbsup.gif /thumbsup.gif
boot1h是为分区是HFS+文件系统用的!boot1u是为UFS文件系统用的!印象中还有些一级boot程序在/usr/standalone/i386中。
另外,我也一直没明白为什么要使用Bless这个命令,看过apple的man:
http://developer.apple.com/documentation/Darwin/Reference/ManPages/man8/bless.8.html
bless is used to modify the volume bootability characteristics of filesystems, as well as select the active boot volume.bless has 5 modes of execution: Folder Mode, Mount Mode, Device Mode, NetBoot Mode, and Info Mode.
感觉,dd已经写好了MBR,能够找到相应的活动分区,及下一步的引导程序boot1h,然后boot1h也能继续引导mach_kernel。没想明白,希望哪位高人能再指点一二!
[ 本帖最后由 Envying 于 2007-11-27 14:46 编辑 ] 好文章!这样遇到启动问题可以逐步解决了,收藏学习了! 写的很专业,不错,顶一个. 关于boot1h的具体位置,我想如果你用过startupfiletool来写EFI的话,你会看到一些反馈信息,具体细节还真没研究,不过相信应该是在相应HFS+分区的前端,而且从DFE的网站上对stage2 booter的分析,这个文件的大小应该控制在62kB左右!
Edit: Quote from DFE's website.
However, one has to take care not to add too much crap as the booter needs to absolutely stay within a 64k real mode code segment with the code being loaded at offset 0x200 (512 bytes) in that segment. That means the limit is 63.5k but then there is cdboot which is a 2k stub-booter followed by the real booter thus effectively meaning you can have at most 62k of code. The project as shipped is in the high 50k and my changes have already added another k or two. Not much more can be added before the whole thing would have to be rewritten to handle loading a third booter and/or loading the rest of itself which would just be ludicrous.
[ 本帖最后由 Envying 于 2007-11-27 16:24 编辑 ] 难得好文,赞一个!! 不错,欣赏一下。 他把512字节全写了,以前分的区就没了。。。
写446字节最好。。。 的确是很好的文章,不知作者有没有放上源代码? 好好pb63 学习 原帖由 lb_bn 于 2007-11-28 09:08 发表 http://www.vistafans.com/images/common/back.gif
他把512字节全写了,以前分的区就没了。。。
写446字节最好。。。
你搞错了,写的是分区里面的前512字节,不是MBR和主分区表所在的硬盘的前512字节! 我觉得抹盘的时候他就已经能引导了。。。 BOOT1H写的是分区头512字节,但实际上没写完全部512
至于boot,各人就不一样了 本论坛难得一见的技术文
支持 原帖由 lb_bn 于 2007-11-28 09:08 发表 http://www.vistafans.com/images/common/back.gif
他把512字节全写了,以前分的区就没了。。。
写446字节最好。。。
的确,写到MBR必须是446字节,否则分区表就破坏了。
这个问题我还没弄明白,因为Darwin bootloader是可以写到mbr的,但是如何写入的呢,再研究一下。 它没写到mbr…… 我看了一下boot1h,它后面有很多00 00 00 00的字节,是不起作用的,代码都在前面,而最后两个字节55 AA是结束标志,在MBR中称为Magic Number。所有的MBR这两个字节都是相同的(512字节=446字节的代码+64字节的分区表+2字节的结束标志)。那么事实上在boot1h中有用的只有前面的代码,那些代码小于446字节,所以是可以写入MBR的,我想只要用dd命令,写入446字节(将bs=512改成bs=446)就可以从MBR引导Darwin bootloader。具体是否可行,可以用VMware试验一下。
[ 本帖最后由 pappplus 于 2007-11-28 13:47 编辑 ] “这种安装方法称为恢复安装,指的是用OSX1(比如Tiger)的光盘启动,再用安装程序的磁盘工具恢复下载好的OSX2(比如Leopard)镜像到一个分区,再从这个分区启动OSX2的安装程序,将OSX2安装到另一个分区。本论坛有人提过这种安装方法,但他忽略了一个最重要的步骤,那就是首先要使恢复的目标分区能够引导(我试过仅仅恢复光盘镜像 是不行的),而本篇文章讲到的正是这一点。” 我用恢复法,然后winxp的tboot引导可以进入安装界面,不用去写其它的什么引导~~ ps:也许是amd的原因,用tiger盘抹掉分区,但是仍然不能安装,说要guid分区......哪位大哥有解决的办法??
[ 本帖最后由 yltvro 于 2007-11-28 14:00 编辑 ] 原帖由 Envying 于 2007-11-28 04:32 发表 http://www.vistafans.com/images/common/back.gif
不错!支持原创!/thumbsup.gif /thumbsup.gif
boot1h是为分区是HFS+文件系统用的!boot1u是为UFS文件系统用的!印象中还有些一级boot程序在/usr/standalone/i386中。
另外,我也一直没明白为什么要使用Bless这 ...
BSD系统支持几种启动模式:Folder Mode, Mount Mode, Device Mode, NetBoot Mode, and Info Mode.
所以要用这一步来设置启动参数。上面的两个命令分别用了Device模式和Mount模式,我想这应该是最常用的模式,熟悉BSD的朋友来解释一下。 大哥,好难懂哦,看来我的苹果之路还任重而道远~