引导过程概览
启动过程在最近几年发生了很大的变化。现代BIOS的出现(UEFI)简化了早期引导阶段,从概念上来说。目前,大部分的Linux发行版都用系统管理守护进程(systemd daemon)systemd替代了UNIX中传统的init。systemd通过添加依赖管理、并发启动进程支持以及全面的日志记录等特性简化了引导过程。
随着系统向云端迁移,引导管理也出现了变化。虚拟化、云实例、容器化的倾向降低了管理员接触物理硬件的需要。取而代之的是,镜像管理、API以及控制平面。
引导过程中的大部分过程,管理员基本上无法直接进行交互控制。能做的要么是通过编辑系统启动脚本来修改引导配置,要么是改变传入内核的引导装载程序参数。
在系统引导完毕之前,必须检查并挂载文件系统,启动系统守护进程。相关过程由init一次运行的一系列shell脚本或者是systemd负责解析的一组文件来控制。
系统固件
机器加电后,CPU会固定执行存储在ROM中的引导代码。系统固件通常知晓主板上安装的所有设备,比如SATA控制器、网卡、USB控制器以及电源和温度传感器。除了允许在硬件层面配置这些设备,归案还可以让你选择是将设备呈现给操作系统还是将其隐藏。对于物理硬件,多数固件都提供了用户界面。不过这个界面一般都比较粗糙,而且不太容易访问到。通常情况下,你需要在按下电源的一瞬间,迅速按下特定的键(具体实现由各大主板厂商实现)。
正常情况下,系统固件会侦测硬件和磁盘,执行一些简单的健康检查,然后查找下一阶段的引导代码。可以使用固件的用户界面指定引导设备,一般是通过设置一组可用设备的优先级来实现(例如,先尝试从硬盘驱动器启动,然后是USB,在然后是网络等)。多数情况下,系统的磁盘驱动器处于次启动优先级。要想从特定的驱动器启动,必须将其设置为最高启动优先级,同时确保将硬盘作为引导设备。
BIOS与UEFI
传统的系统固件叫做BIOS,其英文全称为Basic Input/Output System,中文名称为基本输入/输出系统。目前,BIOS已经基本上被UEFI所替代,其英文全称为Unified Exensible Firmware Interface,统一可扩展固件接口。
BIOS
BIOS认为引导设备是以主引导记录(Master Boot Record,MBR)作为起始。MBR包括第一阶段的引导装载程序(也叫做“引导快”)和 一个原始的磁盘分区表。可供引导装载程序使用的空间非常有限,不足512字节,所以除了载入并运行第二阶段的引导装载程序之外,也干不了其它事情。
引导块和BIOS并不能做到读取任意类型的标准文件系统,所以第二阶段的引导装载程序必须放在一个 容易找到的地方。在典型场景中,引导块从MBR中读取分区信息,识别出标注为“活动(active)”的磁盘分区。然后读取并执行位于该分区起始位置上的第二阶段引导装载程序。分区上的这个区域被称作卷引导记录。
也可以将第二阶段引导装载程序放在MBR与第一个磁盘分区之间的闲置区。由于历史原因,第一个 磁盘分区是从第64个磁盘块开始的,因此这块闲置区至少有32KB,尽管仍不算大,但已经足够容纳一个文件系统驱动程序了。GRUB引导装载程序采用了该方案。
要想引导成功,引导链上的所有组成部分都必须正确安装,彼此之间相互兼容。MBR引导块独立于操作系统,它假定第二阶段的引导过程始于某个特定位置,因此可以在此安装多种不同版本的装载程序。第二阶段引导装载程序普遍了解操作系统以及文件系统(可能支持多种操作系统和文件系统),另外还通常拥有自己的配置选项。