Boot
BIOS vs UEFI
BIOS
Legacy 启动模式: 检查所有连接设备的 MBR,如果找不到引导加载程序,Legacy 会切换列表中下一个设备并重复此过程,直到找到加载程序,否则返回错误
基本输入输出系统: Basic Input/Output System
- 开机加电硬件自检, POST(Power-On Self-Test) 该过程主要对计算机各种硬件设备进行检测,如 CPU、内存、主板、硬盘、CMOS 芯片等,如果出现致命故障则停机,并且由于初始化过程还没完成,所以不会出现任何提示信号;如果出现一般故障则会发出蜂鸣;若未出现故障,加电自检完成(枚举本地硬件设备初始化).
- 按 Boot Sequence 查找可用的存储设备, 找到后从该设备第一个扇区读取 MBR 或 GPT(Linux 系统) 引导启动操作系统.
- [[boot#MBR|MBR]]
- [[boot#GPT|GPT]]
UEFI
UEFI 启动模式: 引导数据存储在 .efi 文件中. UEFI 启动模式包含一个特殊 EFI 分区,用于存储 .efi 文件并用于引导过程和引导加载程序.
统一可扩展固件接口: Unified Extensible Firmware Interface
- 开机加电硬件之间, POST(Power-On Self-Test)
- 从该设备第一个扇区读取 GPT 方式引导操作系统.
- [[boot#GPT|GPT]]
MBR vs GPT
- LBA(Logical Block Address 逻辑块地址): 默认已 512B 进行规划, LBA 从0开始.
- Sector(硬盘扇区): 目前为单个 512B (部分新磁盘为4096B).
MBR
主引导记录: Master Boot Record
- LBA0: 保存 MBR 信息.
起始字节 | 字节长度 | 说明 |
---|---|---|
1 | 446B | Boot loader: 主引导加载程序,加载内核到内存中运行. |
447 | 64B | Disk Partition Table: 分区表,记录每个分区信息(大小,起始扇区和大小等).每个分区16B,最多四个主分区. |
511 | 2B | Boot Flag: 分区表标记,表示设备是否可启动. |
- 分区表: 最多4个主分区. 或3个主分区+1个扩展分区+多个逻辑分区.扩展分区可以分成两个逻辑分区,第二个逻辑分区可以继续分逻辑分区,直到找到分区表本身(只有一个分区项)
- Boot loader: Linux 中为 grub 或 grub2
GPT
GUID 分区表: GUID Partition Table
- LBA0: 第一部分前446B 保留 MBR Boot loader,第二部分保存 GPT 磁盘分区格式标识.
- LBA1: GPT HDR 分区表头记录.记录分区表本身位置与大小,同时记录备份用 GPT 分区位置(磁盘最后的34个 LBA), 通过放置的分区表校验码(CRC32)错误时从备份 GPT 中恢复运行.
起始字节 | 字节长度 | 说明 |
---|---|---|
0 | 8B | 分区表头签名 |
8 | 4B | 版本号 |
12 | 4B | 分区表头大小 |
16 | 4B | GPT 头 CRC 校验和 |
20 | 4B | 保留,必须为0 |
24 | 8B | 当前 LBA(这个分区表头的位置) |
32 | 8B | |
... | ... | ... |
- LBA2~LBA33: GPT 分区表信息.每个 LBA 提供4组分区记录,默认情况下有4x32=128个分区.
起始字节 | 字节长度 | 说明 |
---|---|---|
0 | 16B | 分区类型, 如{C12A7328-F81F-11D2-BA4B-00A0C93EC93B}代表 EFI 系统分区 |
16 | 16B | 分区 GUID |
32 | 8B | 分区起始 LBA(小端序) |
40 | 8B | 分区末尾 LBA |
48 | 8B | 分区属性标签(0:系统分区, 1:EFI隐藏分区, 2:传统BIOS可引导分区, 60:只读, ...) |
56 | 72B | 分区名(可以包括36个UTF-16(小端序)字符) |
- LBA34~LBA-34: GPT 实际分区内容
- LBA-33~LBA-2: GPT 分区表的备份,对 LBA2~LBA33 的备份
- LBA-1: GPT 表头记录备份,对 LBA1 的备份
![[/Operations/System/attachements/Pasted image 20240320154944.png]]
Kernel
- 内核初始化硬件
- 加载驱动
- 初始化内存管理,进程管理
- 挂载根文件系统
- 切换 rootfs
- 运行 init 程序(systemd)
- systemd: 系统初始化与服务启动
Systemd
/etc/rcX.d/ /etc/init.d/
Reference: