Boot Process Overview

近年来, boot 的程序逐步从较为复杂的 BIOSs 简化为 UEFI 程序

而最近的系统 采用的是一个 system manager daemon systemd 而非传统的 UNIX init, systemd 通过添加 dependency management 来精简 (streamline) 开机流程, 因为 dependency 机制可以允许并发开机的请求

在 bootstrapping (即 boot) 期间, kernel 会被读入到 mem 中并且开始执行

![[Pasted image 20250523131345.png]]

在系统完全开机之前 文件系统会被 check 一次, 并且系统守护进程 daemon 会开始运行

这些指令 (shell scripts) 统一称为 init scripts

System Firmware 硬件基础

机器开机的时候, CPU 会被固件层执行 boot code (存储在 ROM 中), 在诸如虚拟机等的
virtual 环境中, 这个也是虚拟的但是概念相近

系统固件(system firmware, SF) 会知道主板上 (mother board) 的所有硬件信息, 比如
network interface (网卡), usb controller, sensor for power and temperature, etc.

除了硬件层的 configuration
信息, 固件系统还会让用户手动设定是否要采用某几个硬件设备

boot 程序会提供给用户一个 interface
进行交互, 也就是会在系统启动阶段需要按某一个固定键位来进入这个状态

启动阶段的每一步的 boot 程序都会先 probe
各个相关硬件设备是否就绪, 然后查询下一步的 boot 程序地址

BIOS vs. UEFI

传统计算机 boot 程序称为 BIOS (Boot Input/Output System), 而过去十年来逐步升级为
UEFI (Unified Extensible Firmware Interface), 也有称呼 UEFI 为 UEFI BIOS
的, 并且大多数 UEFI 是可以退化为 BIOS legacy 程序的

虚拟环境很多接受 BIOS 作为启动程序的, 因此 BIOS 并没有灭绝的风险

Legacy BIOS

传统 BIOS 会认为系统启动的时候会跑在一个 MBR (master board record) 上, 这包含了
first-stage boot loader (aka “boot block”), 和一个 primitive disk partition
table (硬盘分区表, 用来确保你要登录的系统的硬盘区间和内存存储区间)

boot loader 需要用到的空间是很小的 (往往小于 512B),
并且功能固定, 只能运行自身并指向下一个程序

UEFI

与 bios 不同的是,uefi 采用的是一个 现代的 硬盘分区模式称为 GPT (GUID Partition
Table, GUID = globally unique identifier) 分区, UEFI 也能接受 FAT (File
Allocation Table) 分区系统, 这些特性组成了 EFI System Partition (ESP),
在启动的时候 固件系统会请求 GPT 分区表来识别 ESP 盘分区,
然后再从文件中直接读取 configured target application 并且执行之

ESP 本身是一个通用的(generic) FAT 分区, 其支持 mount, read, write, maintain by
各种 OS,且这并不是一个系统启动之必须,不过绝大多数的系统都会使用这个分区

UEFI 会存储指向对应 efi 启动文件的路径,比如不加任何配置的情况下路径是
/efi/boot/bootx64.efi (x64 是指 64 位的 CPU 架构, 32 位的 CPU 架构是 x86,
这里指现代 intel 芯片系统), 而另一个非常经典的启动程序是
/efi/ubuntu/grubx64.efi 表示 ubuntu 系统采用的 grub 程序启动

对于 intel 8086架构的系统指令可以使用 efibootmgr 指令来更换 boot
顺序,选择 boot option 等

Boot Loader