Life Journal

随笔,及其他

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


Hackintosh系列教程#2-基础知识:关于磁盘、分区、mac

这篇文章说实话想了很久没有头绪。说介绍,但是这些知识之深岂为吾辈所能穷。所以只好走马观花,截取些与安装mac有关联的知识点,大致说说。若有错误,还请指教~

大多数的知识点我都会给出其在维基百科中文版上的对应词条的链接~如果有兴趣,不妨点开看看。

1、硬盘

硬盘的接口与传输模式

说到硬盘,就让人想起安装Leopard时不少人遇到的”waiting for root device…”的提示了。其实那个提示的意思就是,没有找到系统所在的设备。具体地说,如果是从光盘引导的时候出现了这样的问题,那就是光驱没被找到。如果是装完之后重启时遇到了这样的问题,那就是硬盘啦。

可是硬盘明明在那里啊,你或许疑惑。但实际上,对于现在的硬盘而言,数据接口是多种多样的,数据传输模式也不止一种。同是硬盘,接口不同,会被认为是不一样的设备;同一块硬盘,传输模式不同,也不会被当成相同的设备处理[1. 在ata模式下安装XP或VISTA后,不加装ahci驱动而直接在BIOS中将硬盘的传输模式改为AHCI的话,系统启动时就会因为对新的AHCI设备缺少驱动而出错蓝屏。]。

过去的旧式硬盘使用的是IDE接口[2. 也称ATA接口,这两个名词因关系紧密而可以混用,以前常听到的Ultra ATA/33,Ultra ATA/66,Ultra ATA/100都是那个时代的产物。],而新的硬盘大多都是SATA接口。相比而言,SATA能提供更高的速率和数据传输稳定性。截至现在SATA一共有3代,但是市场上常见的就是SATA和SATA2(差异我就不说了),而这两者也要看做是不同的接口的。

和硬盘有关的一个不得不说的东西是硬盘控制器。如果你对这个名词没印象的话,就想想ICH5、ICH6、ICH7等等等等,他们就可以看成是硬盘控制器。类似的还有JMicronnForce之类,这些常常在非intel主板上见到,并且与Leopard的兼容性常常让人头大,到现在也并不是所有的JMicron能够被Leopard驱动[3. 这里说能被驱动的意思是说存在第三方的驱动,ICH除外。]。如果硬盘控制器都不被支持,那么出现”waiting for root device…”也就不意外了。

关于SATA还有一个不得不说的就是传输模式。一般的SATA硬盘,都支持两种传输模式——传统的ATA以及AHCI,AHCI的优点就是支持NCQ和热插拔(没试过)。ATA模式下的硬盘在windows系统下是不需要额外的驱动,类似一种向下兼容的模式。而AHCI则是全新的,需要新的驱动。Windows Vista原生支持AHCI,而古老的XP则不行[4. 这里不考虑各式各样的改版和OEM版本,因为这类版本大多都集成了AHCI驱动。]。硬盘传输模式的更改是在BIOS中实现的,并且需要硬盘控制器的配合(并不是所有的硬盘控制器都支持AHCI)。

在进入逻辑层面的话题之前,还有必要补充一点关于硬盘的物理结构的知识。一块硬盘里放置有许多金属圆盘磁片,每个磁片的上下两面称为记录面,用于记录数据,每一个记录面需要一个磁头(header)来读写数据。每个记录面上都有一圈圈半径不同的同心圆,就是所谓的磁轨(track)。每个磁轨都可以切分成等分的扇区(sector),每一个扇区可以存放512bit大小的资料。在下面的知识中,这些内容会被反复提到,所以请务必弄明白。

中文维基百科链接:关于 硬盘 ATA SATA

英文维基百科链接:关于 Hard Disk Drive Advanced Technology Attachment Serial ATA

2、分区

这一部分是和Leopard密切相关的。如果你曾经在装完之后重启时看到过hfs+ partition error或者b0 error,并为此苦恼不已,那么相信这段文字会对你有所帮助。

如果你是新手,建议你认认真真学习一下分区的有关知识。那样可以少走很多弯路的。

2.1 MBR分区表

在一块硬盘的第一扇区,存放的是所以“主引导扇区”——启动时硬盘上首先被读取的地方。维基百科中文版上对MBR上的解释存在问题,以下是原文:

主引导扇区位于硬盘的0磁道0柱面1扇区,由硬盘主引导记录MBR(Master Boot Record)或者(Main Boot Record)、分区表DPT(Disk Partition Table)和Magic Number三大部分组成。主引导记录包含446bytes,分区表包含64bytes以及Magic Number包含2bytes,共512bytes。

而实际上,英文版本的维基上的解释是:

A Master Boot Record (MBR), or partition sector, is the 512-byte boot sector that is the first sector (“LBA Sector 0”) of a partitioned data storage device such as a hard disk. 翻译过来就是:MBR,即分区扇区,是储存在已分区的储存设备(如硬盘)的第一个扇区(“LBA Sector 0”)上的512 byte的启动扇区。

后一种解释更为合理和泛用。下面的文字许多是引用自英文版本的维基百科。已翻译。

主引导记录(MBR)的结构
地址描述大小以byte为单位
16进制 8进制 10进制
000000000代码区域440
(最大 446)
01B80670440可选的磁盘标记4
01BC0674444通常留空; 0x00002
01BE0676446主分区表(4个16-byte大小的项目, IBM 分区表构架)64
01FE077651055hMBR 标记;
0xAA55[1]
2
01FF0777511AAh
MBR, 总大小: 446 + 64 + 2 =512
从左侧的表格中可以看到,MBR中,首先是一个440+4+2=446的最大代码区域,这里保存着系统启动时磁盘中首先启动的引导程序。通常我们使用fdisk/mbr命令是,就是重写了这一段代码区域。

随后,是一个64 byte大小的主分区表。实际上由于描述一个常规的分区就需要16 byte的大小,所以主分区表只能储存4个分区的资料。这4个分区或者是主分区(Primary Partition),或者是扩展分区(Extended Partition)。

在16byte的区域中,储存在对应分区的始末位置,以及激活状态(启动状态)等,如果是激活分区,则激活状态为AF,或者在一些磁盘工具会看到对应的分区被标记为boot。这样的分区,会被默认的引导程序引导启动。一块硬盘只能有一个激活分区。(详见后文)

主分区和我们通常在“我的电脑”中看到的分区没有区别,而扩展分区本身则是不能写入数据的,也是不会出现在“我的电脑”中的。扩展分区的作用是在自身内再次划分出多个分区,并将这些分区的信息保存在自身的首扇区中。在扩展分区内被划分出的分区,我们称之为逻辑分区(Logical Partition)。逻辑分区也是可以在“我的电脑”中被看见的可储存数据的实体分区。

关于扩展分区用于保存自身内部分区结构的首扇区,其结构和MBR是有些类似的:446字节的空区域+64字节的扩展分区表+2字节的结束符号=512字节。

在所有我们之前提到的可读写数据的分区——主分区、逻辑分区中,开头都有一个扇区被称为启动扇区(也称作超级块),在这个扇区中一般放置引导系统所用的程序。任何一个系统都会有这样一段程序,XP也是,Vista也是,当然我们叫不出名字而已,而Leopard的引导程序就是我们常看见的Darwin/x86 boot

小应用:说完了这些内容大概你已经非常头晕了。为了帮助你理清思路,我们来举一个具体的应用的例子。装过Linux的同学一定知道Grub这个多系统引导工具。其实Grub也是之前我们所提到的引导系统用的程序。所以它也可以写入到分区的启动扇区或者是MBR的前440字节的代码区域中。因此,当安装Linux时,安装程序往往会询问要将Grub安装到何处,选项通常有hd(0)、hd(0,1)、hd(0,2)等等,这里的hd(0)就意味着将Grub安装到第一块硬盘的MBR中,而后两个选项,则是安装到对应的两个分区的启动扇区中。

这样有什么区别呢?我们知道,当电脑开机时,BIOS会首先读取运行在MBR中的启动程序(就是446字节的那个),默认的启动程序会读取主分区表,判断哪个分区目前为激活状态,然后执行对应分区的启动扇区中的引导程序,并将引导权交给它。(1)如果我们的Grub装在MBR中,那么BIOS就会直接运行Grub,Grub则读取自身的配置文件,给出选单,让你选择进入哪一个系统[5. 选单的内容储存在Grub的配置文件boot.lst中,你可以手动更改以修改启动选单。],当你做出选择之后,它再将运行被选择的分区的启动扇区中的引导程序。这种情况下,哪个分区是激活分区并不重要。(2)如果MBR被装在hd(0,1)中,即第一个分区的启动扇区中,那么启动时,BIOS依然执行MBR中的默认的启动程序,该启动程序通过读取主分区表,执行对应的激活分区的启动扇区内的引导程序。如果hd(0,1)是激活分区,则Grub被其执行(Grub依然可以将引导权转交给其启动列表中的任何分区)。如果hd(0,1)不是激活分区,那么Grub则完全不起作用。这里的hd(0,1)只是举个例子,实际上可以是一个主分区。

那么到底将Grub装在哪里好呢?如果磁盘中只有Linux的话,那么装哪里都是无所谓的事情,先执行后执行最终都要执行Grub的。如果是多系统的话,我们建议装在Linux所在分区,或者单独划出一个/boot分区[6. Linux下分区是通过将不同内容放置在不同/XXX中,然后可以选择将/XXX放置在一起或者单独放置。],用于存放Grub,这样如果MBR中已经有某系统的自定义的引导程序的时候,不会被Grub写入破坏掉,并且后装的操作系统也不会破坏掉已经安装的Grub。

关于chain0文件和tboot文件:这两个文件应该都是广为使用的用windows系统的引导程序引导至Leopard分区的关键性文件。chain0文件是APPLE公司提供的位于/usr/standalone/i386位置的包含Leopard引导信息的文件。如果是将它放在win的启动分区并且使用类似“C:\chain0=”Mac OS X86″ ”的语句在引导菜单中的话,实际的效果是,当选择”Mac OS X86″时,该文件会被执行,在分区表中寻找HFS+分区并且将引导权转交给HFS+分区的引导扇区。而tboot文件则是chain0的改进版,支持多硬盘间的Mac OS X和扩展分区上的Mac OS X的引导(可能存在问题)。

关于dd命令:unix下的dd命令的基本格式是dd if=X of=Y bs=N count=M;if标示来源,of则是输出为止,bs是块大小,count则是写入的块数量。比如dd if=boot1h of=/dev/rdiskXsY bs=512 count=1就是将boot1h文件中的信息写入到diskXsY分区的第1个扇区(512)中,也就是启动扇区中。这个命令在改写分区的引导程序时用的很广。在这里暂不深入讨论。

常见的问题分析:

为啥我删了所有的分区再重建,引导程序还是不变呢?答:这样的话,那么你的引导程序一定是被安装到了MBR中(446字节代码块中)。无论你怎么对分区做更改,都只是更改了那64字节的主分区表而已,所以没有任何效果。你需要做的只是在DOS下(或者其他兼容环境下)输入:fdisk/mbr ;或者用Leopard安装盘启动按F8输入-s进入单用户维护模式,然后输入:fdisk -i /dev/rdisk0。关于这个命令,实际上是用默认的引导程序覆盖了MBR中的446字节的代码区域。

破解版的VISTA的原理和MBR有关?答:是的。实际上破解版的原理是在MBR中写入一个修改版的Grub,其在引导至VISTA所在分区之前会在底层虚拟出OEM的BIOS,让VISTA误以为是OEM,以避过激活机制。所以,如果将别的引导器写入MBR,覆盖了原有的Grub,那么Vista的破解也会失效。提示:Leopard的安装默认不会对mbr的引导器作出修改。

为啥装完Mac系统之后重启只有显示b0 error?关于b0错误,网上的解释有许多种,再次我就不一一列出。通常的原因是由于被激活的分区并不是系统分区,或者是因为没有正确的激活分区造成的。解决方式也因情况而异。方法一:重新激活系统分区,激活的方法下文会详述。二:尝试使用tboot之类的解决方案,有时可以暂时性解决问题。三:安装第三方的引导器,如Grub,有时可以完全修复该问题。四:尝试使用fdisk/mbr之类的命令,可以参考第一个问题的解决方案。

正确的激活分区(使称为启动分区)的方法

1、在Windows系统下,在运行窗口中输入CMD,回车,在打开的命令行中输入:

diskpart    回车,运行diskpart工具

select disk x   选择第x块硬盘,0代表第一块硬盘,1代表第二块硬盘,等等

list part   显示当前所有分区

select part y 选择第y个分区,y为需要激活的分区

active   激活命令。完成

2、用Leopard安装盘引导系统,在启动时按F8,输入-s进入单用户模式,输入:

fdisk -e /dev/rdisk0   同理,0是指第一块硬盘

show   将会显示当前该硬盘上的分区结构

flag 1   1是指要激活的分区号。这条命令将激活对应的分区。

update

write   写入。

然后你可以输入quit以退出,再输入reboot以重启。完成。

中文维基百科链接:关于硬盘分区 MBR 啟動程式

英文维基百科链接:关于 Disk partitioning Master boot record Extended boot record File system

OsX86链接(英文):chain0以及tboot

2.2 GPT分区表

GPT是GUID Partition Table(GUID分区表)的所写。实际上GPT是伴随着Intel的EFI技术提出的磁盘分区格式,相对于过去的BIOS使用的是MBR分区表(上面已经介绍了)。

翻译完成的中文页面地址:点我

英文版地址位于http://en.wikipedia.org/wiki/GUIDPartitionTable .

3. MAC系统简介

首先让我们从APPLE公司开始说起,由乔布斯和他的两位好友在1976年共同创办的APPLE公司,最初只是一个电脑设计公司——那是电脑还是一个不算规范的概念。早期他们设计的APPLE IAPPLE II型非常成功,也因此获得了大量的融资。然而在80年代初期,APPLE III由于自身设计的缺陷(部分因为乔布斯不切实际的要求),以及IBM方面8088处理器的诞生以及PC-DOS的出现,只是APPLE III几乎一上市就失败了。之后的APPLE主要研发了LisaMacintosh两个类别的电脑,前者用于高端(很快失败了),后者则作为低端Lisa的身份存活了下来。同时推出的还有我们的主角Mac OS。

当时的Mac OS在图形化系统方面走在了几乎是最前沿。很快IBM和微软都模仿之研发类似的图形化操作系统,比如著名的Windows。但是很快,随着IBM兼容PC的量产和windows系统在前面为其开路,以及90年代乔布斯的离开,苹果公司在几乎整个90年代都在逐步溃败。在乔布斯被召唤回APPLE之前,Mac OS已经到达了第9代。到此为止的Mac OS可以被称为是classic,内核是基于BSD的Mach。

乔布斯再度上任之后,大刀阔斧进行改革。首先就是将正在研发的Mac OS 9.5改名为X代,即10代。然后启用了全新的自主研发的内核Darwin,虽然未完全摆脱BSD的架构,但是已有很大不同。所以之前的软件在10代上运行的话都由一个所谓的classic运行。

在94年到05年之间,所有的Macintosh电脑都是基于IBM、摩托罗拉、APPLE共同开发的PowerPC处理器构架,也就意味着不兼容市场上常见的PC机。在2005年6月6日WWDC大会上,乔布斯宣布所有的Macintosh都转为使用Intel CPU构架。这就意味着从这之后的Mac OS可能可以被安装在普通的PC机上。比如我们常说的Tiger与Leopard。同时这也意味着在Macintosh上可以安装Windows操作系统了。

中文维基百科链接:关于蘋果公司 Mac OS X歷史

英文维基百科链接:关于Apple Inc. Mac OS X 注:这两篇文章异常强大~能延伸到很多内容~强烈推荐阅读~

接下来就几个目前常见的Mac关键字进行解释。大多是为新手准备的。

1.EFI

关于osx86上的EFI的英文介绍的翻译,偶终于完成了,给出地址:

http://xiaolife.com/pages/EFI – OSx86.htm

中文维基百科链接:关于EFI OsX86链接(英文)-EFI

英文维基百科链接:关于EFI SMBIOS

2.Mac OSX的分区属性

原版的Macintosh上,Mac OSX应该是被安装在GPT分区的硬盘上的。

如同Windows使用FAT系列和NTFS分区格式一样,Mac OSX使用自有的HFS+分区格式。这种格式无法使用非Mac分区工具格式化得到。通常我们使用Mac OSX系统自带的磁盘工具进行抹盘得到。抹盘的意思其实就是将某个分区格式化为HFS+格式。注意对于HFS+格式,抹盘时也有4种可选,通常情况下建议选择日志型HFS+

用Mac OSX自带的磁盘工具对硬盘进行分区的话,会得到一个GPT分区表。目前的Windows还不支持GPT分区表

在Mac OSX下,ntfs与其他一些linux常用磁盘格式是不可写入的,可读,需要安装第三方软件实现读写。FAT32则是可读写。

英文维基百科链接:关于HFS Plus

3.Mac OSX下的应用程序结构

如你所见,其下的普通的应用程序,实际上是一个以.app结尾的文件夹,在Leopard下显示为带有图标的可执行程序,你可以在其上点右键选择显示包内容,则会由finder打开其内部,里面有许多编译好的部分,值得注意的是,resource部分通常包含可编辑的语言资源,汉化也通常从这里入手。

而在Mac OSX下,程序脚本则多以.sh.script结尾,他们类似于win下的批处理但实际上要强大的多。

常见的安装程序后缀为.mpkg.pkg,他们在win下也显示为文件夹,但实际上是整体,在Mac OSX下可以直接双击运行,通常点右键选择显示包内容,可以用finder进入其内部,但是看不到什么清晰的结构。使用pacifist可以浏览和修改安装包内容。

在Mac OSX中,许多可以独立运行的程序是不需要单独的安装程序的。所需要做的只是将他们拖入application(应用程序)文件夹即可。删除时也只需将他们从application拖到废纸篓即可。有些大型的软件会提供删除脚本,因为他们可能在某些地方储存了用户配置文件,需要额外的删除。

4.关于QE/CI

QE实际上是所谓的Quartz Extreme的缩写,而CI则指的是Core Image(核心影像)。这二者是什么呢?实际上他们都是整个Mac OSX系统图形绘制框架的组成部分。很好,看到这里就不要再问什么特效之类的。他们与特效无关,虽然很多特效是基于Core Image实现,但是技术本身不是特效。Quartz Extreme则可以理解为Mac OSX 2D合成层Quartz的加强版本。几乎所有MacOSX下的和图形有关的应用程序,哪怕是Quciktime或者是office2008,他们都用到了这些技术。

为什么会存在没有打开QE/CI的情况?我们知道大多数hackintosh的显卡驱动,都是由第三方制作的,而不是APPLE原生的。原因是,不同的显卡,他们的输出所用的GFX-string是不同的(具体信息恐怕我也无法解释清楚,这个东西和显卡的输出貌似有莫大的关系,包括双显示等等都与之密切相关。),我们的显卡驱动制作很多时候就是通过收集分析常见的gfx-string,以制作显卡驱动。不过目前还是很不完善的,一旦对应的底层存在偏差,自然QE/CI是不会被打开了。

中文维基百科链接:Core Image Quartz

还有?没写完呢~加油~

如果对这篇教程有什么疑问,可以直接在下面留言,我每天至少上线一次,看到留言后会立刻回复,并且会用email通知您。