很久之前就对开机引导流程有一个大致的了解,但是始终不够清晰和深入。今天看了下《鸟哥的私房菜》,对这个概念又了解了一些,便趁热写下了这篇文章巩固一下。
讲到开机引导流程,便得先谈起 BIOS。BIOS 即 Basic Input/Output System,是现今世界上大部分主板上搭载的固件。电脑接通电源后,便开始运行 BIOS 内的最基本的引导加载程序。此时 BIOS 会进行开机自检,如检查内存及外围硬件设备情况等,然后根据 BIOS 的设置读取引导设备(一般是硬盘,当然也可以是 U 盘,光盘等)的引导区。硬盘的引导区即 MBR (Main Boot Record),存在于硬盘的第一个扇区内,而硬盘的扇区一般为 512 字节,因此 MBR 的容量也是 512 字节。
MBR 的结构如图所示(出处)。前面 446 个字节存放的是引导程序代码,一般在安装操作系统时写入;之后的 447-510 字节区域存放的是分区表的内容,一共 64 字节。MBR 的分区表只能有四项,每项的信息占 16 字节。这四个分区被称为主分区(Primary)或者扩展分区(Extended)。
这里有几点信息值得一提:
有过 Windows 使用经验的同学都知道,一个硬盘上的分区经常不止 4 个,可能有 C, D, E, F, G, H 等等数量的分区。可是 MBR 里面只能保存 4 个分区信息,那为何还可以有 5 个以上的分区存在呢?
这就是扩展分区帮的忙啦。扩展分区使用额外的扇区来纪录扩展分区内的分区结构,于是一个扩展分区可以分为数个逻辑分区。
上图是我的硬盘的分区表。第一个分区是主分区,用来放 Win7;第二个分区是扩展分区,分个 5 个逻辑分区,其中 3 个供 Windows 使用,为 NTFS 文件格式。另外两个,一个挂载 openSUSE 的 /home
目录,一个作为交换空间。而最后一个分区为主分区,挂载 openSUSE /
目录。值得一提的是,每个分区都有自己的引导扇区,供 MBR 读取及调用,但是引导扇区似乎只能存在于主分区,而不能存在于扩展分区或逻辑分区。
由于 MBR 的分区机制,便出现了诸如合并主分区和逻辑分区的问题,或者把逻辑分区变成主分区的问题。这些操作都会修改扩展分区的信息,使用软件做出更改时要多加小心,避免扩展分区信息被破坏或者搞乱。
接下来说说 Linux 系统中对于硬盘分区的设备文件名。现在主流的电脑大多数提供的是 SATA 接口,而 IDE 接口只在老旧的电脑上出现,因此这里只讨论 SATA 接口,IDE 接口也是类似的。
SATA/USB/SCSI 等磁盘接口都是使用 SCSI (我不知道是啥) 模块来驱动的,因此这些接口的磁盘设备文件名都是 /dev/sd[a-p]
格式。而且设备文件名是由 Linux 系统检测到的顺序来命名的。
比如你的 PC 上有两片 SATA 硬盘及插有一个 U 盘,则两个 SATA 硬盘的文件名为 /dev/sda
及 /dev/sdb
,而 U 盘在开机完成后才被识别(鸟哥说言,不知道现在是否仍是这个情况),因此被命名为 /dev/sdc
。
而 /dev/sda
这种文件只表示硬盘,但是操作硬盘上的文件需要用到具体的分区。分区的设备文件名是在 /dev/sda
后加上数字,形成诸如 /dev/sda1
之类的文件名。
Linux 系统将前 4 个号分给了 MBR 分区表的 4 个纪录。因此,逻辑分区的设备文件名至少是 5 及 5 以上的号。根据上图我的机器的分区表,可以推测出哪个分区挂载在哪个设备文件名上:
/dev/sda1
: Windows 下 C 盘/dev/sda2
: 扩展分区/dev/sda5
: Windows 下 D 盘/dev/sda6
: Windows 下 E 盘/dev/sda7
: Linux EXT3 分区,挂载 /home
/dev/sda8
: Linux Swap 分区/dev/sda9
: Windows 下 F 盘/dev/sda3
: Linux EXT3 分区,挂载 /
说完分区的事情,再来谈谈开机引导流程。从上文中也大概可以知道,需要经过 BIOS,MBR 等过程。大致的过程为:
虽然大部分的机器使用的固件为 BIOS,且硬盘引导使用的是与 BIOS 相对应 MBR,但是 MBR 是 1983 年提出的,带有那个时代的局限性,因此就有人提出了 EFI 规范以制定新的固件来代替 BIOS。MBR 存在的一个主要问题是,它用了 4 个字节来表示分区的扇区数,而一个扇区为 512 字节,这意思着一个分区至多为 pow(2, 32) * 512
,即 2TB 大小。而 EFI 规范定义了一种新的分区方式,称为 GPT (GUID Partition Table),在兼容 MBR 的情况下比较好地解决了 MBR 存在的一些问题。具体内容我也了解不多,有兴趣的同学可以参考下面的文献: