前言
OS X 与 Windows 在引导流程上有很大的差别,而且在 Mac 上运行 Windows 需要经过特殊的处理。造成这种差异的原因在于磁盘分区表格式。
分区表
一个磁盘抛开物理组成部分的话,它就是一个地址序列,这个序列从 0~n-1 ,每个地址包含 512B(字节)的空间。一般我们将这些地址称作逻辑块地址(LBA),每块由 512B 组成。分区表告诉操作系统,磁盘的分区有几个,从哪里开始到哪里结束。当将一个磁盘插入已经含有操作系统的机器上时,操作系统会检索这个磁盘的分区表,并正确认识它的分区结构。一个磁盘是先有分区表,后有分区,然后才有文件系统,有了文件系统才能被操作系统读写删。
分区表格式与系统引导的关系
磁盘分区表格式目前主要有两种,分别是 MBR 分区表 和 GUID 分区表,两种分区表的主要区别在支持的分区数量上。前者仅支持4个主要分区,后者则可以扩展到超过128个。
MBR,即 Master Boot Record ,位置在磁盘的第一个逻辑扇区,即 LBA0 的位置。一个逻辑扇区仅有 512B(字节) ,而且分给 MBR 分区表 的只有 64B ,每个分区占分区表的 16B ,剩下的字节由 MBR 引导代码和其它组成。因为每个分区只有 16B 大小的分区表记录,所以寻址最大只能到 2.2TB 。下图的绿色部分
PBR,即 Partition Boot Record ,位置在每个磁盘分区的开始部分,占用扇区不定。这个扇区一般保存着操作系统引导程序的所在位置。下图的红色部分。
文件系统,File System ,操作系统对磁盘的所有操作都需要经过文件系统,删除文件指的是在文件系统里删除文件的索引条目,创建文件就是在在文件系统里添加索引条目并将具体数据写入磁盘。常见的文件系统格式有: FAT exFAT NTFS HFS+ 。文件系统位置一般在PBR之后。下图黄色部分
传统的 BIOS 引导操作系统过程如下图:
计算机器开机后,固化在 ROM 里的 BIOS 就会被加载到内存运行,BIOS 自检完毕以后加载 COMS 的参数,通过 COMS 的参数, BIOS 程序加载启动磁盘的 MBR 到内存里运行。通过运行 MBR 的代码,记录在 MBR 分区表中,标记为活动分区的磁盘分区 PBR 被加载到内存。与 MBR 类似,PBR 在运行后加载操作系统的引导程序到内存运行,例如 Windows 的 bootmgr 。当引导程序运行后操作系统内核就被加载运行,完成从 BIOS 程序中接手的引导流程。
传统的 BIOS 比较低级,它不能像操作系统一样识别文件系统,所以磁盘必须要有一个固定的物理块作为引导块(Boot Block),这个引导块就是 MBR 。
GPT,即 Globally Unique Identifier Table ,全局唯一标识码分区表,简称 GPT 或 GUID 分区表(下面将混用这两个称呼)。由于 MBR 分区表 的局限性(还有 BIOS 的),GPT 诞生了。GPT 由 GPT 头和 GPT 主体,GPT 备份 组成。起始于磁盘 LBA1的位置,相对的 LBA0 仍然为 MBR ,但是这个 MBR 是被保护的,没有引导代码,仅仅有一个被标识为未知的分区,当支持 GPT 分区表的操作系统检索到这个 MBR 后就会自动忽略并跳到 LBA1 读取 GPT 分区表。如下图,由于篇幅的关系,表的长度比例不等同与实际在磁盘地址里的实际比例。
EFI,是一种取代传统 BIOS 的一种技术。如果将 BIOS 比作是一个程序的话,那么 EFI 就是一个简化的操作系统。比起传统的 BIOS ,EFI BIOS 有更多的扩展性。下图介绍 EFI 引导操作系统的流程。
在 EFI 系统启动后,GUID 分区表就会被识别,之后 EFI 系统就启动 Boot Loader 程序加载操作系统内核。对于分区表格式为 MBR 分区表 的磁盘,EFI 系统会 先启动 CSM 兼容模式后按传统 BIOS 的步骤加载操作系统的内核。如下图。
一般的 EFI 系统仅能识别 FAT32 ,不同于 BIOS 只能识别固定位置的磁盘引导块。这意味着只要将引导程序放到 FAT32 分区里,EFI 系统就能通过分区表的指引找到这个保存着引导程序的 FAT32 分区。
EFI 系统是由模块化的 C 语言程序写出来的,所以通过添加或修改程序模块就能获得更多的功能。例如支持更多的文件系统,图形界面,甚至能使用浏览器浏览网页。
OS X 的磁盘分区结构
Mac 很早前就使用了 EFI ,因此在引导上与上文提到的 EFI 引导方式类似。另外,Mac 是使用 GUID 分区表格式的磁盘。结构如下图:
OS X 是不需要 PBR 的,引导是直接从启动分区里找到引导程序加载内核。
Boot Camp 引导
自从 Mac 使用 x86 架构以后,在其上面运行 Windows 已经成为了可能。苹果在 Mac 上开发了一种引导 Windows 的技术,叫做 Boot Camp 。
在探讨 Boot Camp 之前,混合分区表格式需要引起关注。在我们较早前的讨论里得知,Windows 和 OS X 是分别使用两种引导方式的,前者基于传统 BIOS ,后者基于 EFI ,不幸的是 BIOS 是无法引导GPT 磁盘里的操作系统的。为了解决这个问题,混合分区表的概念产生了。
GPT 磁盘保留了一个 Protect MBR ,在一般情况下这个 MBR 是空白的。Mac 开机后 EFI 系统直接跳过 MBR 读取 GPT 分区表。假如我们在这个 Protect MBR 上写入分区表和引导代码后会怎样呢?当 EFI 检索到这个磁盘后会加载那个分区表?
带着上面的两个问题,我们来探讨一下。EFI 是一个简化的操作系统,那么可以通过加载一些特别的程序让它只读 GPT 分区表是可能的。同样,让它只读 MBR 分区表也是可能的。这就是 BootCamp 程序的真面目。
创建混合分区非常简单,使用 OS X 的 Boot Camp 助理安装 Windows 时自动产生。这时 GUID 分区表起始的4个分区就复制到 MBR 分区表。不使用 Boot Camp 助理也是可以手动创建的,通过磁盘工具在 GPT 磁盘上创建一个 FAT32 或 exFAT 分区后,系统自动地将 GUID 分区表的内容复制到 MBR 分区表。
EFI 系统通过加载 Nvram 的参数来决定是否启动 BootCamp程序。启动过程如下图:
双系统磁盘分区结构
BootCamp 首先加载磁盘上的 MBR 到内存并运行,这时标记为活动的 BootCamp 分区 PBR 被找到,接着加载 bootmgr 后引导 Windows。值得注意的是,GPT 保护分区包含了整个 GPT 头 和 GPT 主体和第一个 EFI 系统分区。
注意事项
MBR 分区表只支持4个主要分区,如果按照一般的情况来安装 Windows 的话是不能再添加一个分区的。如果不幸对这个磁盘进行了分区,根据分区的方式会出现如下情况:
安装 Windows 时或后将 GPT 保护分区格式化
GPT 保护分区包含从 LBA1~LBA409639的所有数据,其中 GPT 头 和 GPT 主体部分都在这里。格式化这个分区意味着磁盘从混合分区表格式变为 MBR 分区表格式。尽管两个系统都还能继续启动,但对于 OS X 来说是灾难,首先磁盘无法进行动态分区,无法用 Boot Camp 助理移除 WIndows ,无法更新 OS X 等等。
安装 Windows 后在 OS X 里添加一个分区
这种做法对于 Windows 来说是一个灾难,当在 OS X 里添加一个分区后,GPT 分区表会跟 MBR 分区表同步,这时 GPT 已经有5个分区了,第5个刚好是 BootCamp ,所以 MBR 分区表自动将 BootCamp 踢出去,造成 Windows 无法引导。
正确的多分区安装方法必须要在安装 OS X 前做好磁盘分区规划。如下表:
GPT保护分区 |
Windows |
共享1 |
共享2 |
OS X |
Recovery HD |
从 GPT 保护分区开始到共享2会被复制到 MBR 分区表,剩下的部分 MBR 分区表会识别为可用空间,但是无法使用这片可用空间创建任何分区。
题外
对于 EFI 启动的操作系统来说,EFI 提供底层硬件的接口,这样的好处在于保护硬件,而且让驱动的更新更方便。
传统的 BIOS 启动 Windows 在 BIOS 移交控制权后,Windows 全权掌握硬件服务层。
在 EFI 主板上使用兼容模式 CSM 来启动的 Windows 也是类似的。
对比起 WIndows 来说,OS X 并不掌握全部的硬件服务,OS X 需要 EFI 系统给出的硬件编程接口才能访问硬件。
BootCamp 启动的 Windows 则有点特别,与普通 EFI 主板上的兼容模式不同,Windows 在访问硬件需要经过 EFI 系统。这样做的作用就是 EFI 全权控制着 WIndows 的硬件访问能力,只要苹果有意,完全可以在驱动上限制 Windows 。
从 Boot Camp 引导的原理来看,要在 Mac 上实现单独安装 Windows 是非常简单的。Boot Camp 程序是固化在 EFI 系统里的,所以通过简单设置一下 Nvram 的变量,就可以引导 Windows,无需混合分区表格式。修改 Nvram 变量需要通过运行在 WIndows 下的 BootCamp 程序,这意味着,只要装好了苹果提供的 BootCamp 驱动,你的 Windows 就能运行在 Mac 上。更有甚者在第二块磁盘上安装一个完全独立的 Windows ,而且是基于纯净的 MBR 分区表上安装,这样可以忽略掉与 OS X 共享一个磁盘又不能多分区的尴尬。
尽管在 Mac 上单独装 Windows 也是很简单的,但 Mac 本身的 EFI 版本比较低,比很多 PC 主板的还低,所以一些较旧的型号甚至连 U 盘也不识别。这种旧型号的机器想要用上 Windows 得将磁盘拆下接到其它机器上装好系统再装回 Mac 。