Linux引导过程详解:6个步骤一步步来
理解Linux引导过程对新手和老鸟都至关重要。 知道系统后台怎么启动,能让你更快排查问题,自定义优化启动流程,还能欣赏Linux操作系统的复杂性。
1. BIOS/UEFI固件初始化
现代电脑使用预装的UEFI(统一可扩展固件接口)以启动系统。
传统BIOS(Legacy BIOS)存储在只读存储器(ROM)里,包含机器码检测存储驱动、键盘、扩展卡,进行开机自检(POST)。 按下电源键,BIOS代码运行,检查硬件就绪,按配置在指定存储驱动找引导代码。这让BIOS平台和厂商相关。
而现代系统用更先进的UEFI(统一可扩展固件接口),在硬件上跑32位或64位保护模式。UEFI启动更快,有支持安全引导,图形设置界面。
去年发货4.92亿台UEFI电脑,已成大多数现代Linux发行版的默认固件标准。但很多系统还支持传统BIOS模式。
最佳实践,我建议Linux用户启用带安全引导的UEFI,提升系统安全。通过校验和验证,防止未授权代码和恶意软件篡改引导过程。
2. 通过MBR或GPT初始化引导加载器
硬件初始化后,系统固件(传统BIOS或者UEFI)需找并执行主引导程序。这取决于用传统BIOS还是UEFI。 传统BIOS使用主引导记录(MBR),而UEFI使用GUID分区表
主引导记录(MBR)
MBR结构: 传统BIOS系统,主引导记录(MBR)在引导盘(一般为盘前512字节),含可执行引导代码和分区表定义盘分区。
- 引导代码(446 字节):包含引导加载程序(如 GRUB)的初始代码,负责启动操作系统。
- 分区表(64 字节):最多支持 4 个主分区,或 3 个主分区加 1 个扩展分区(扩展分区可包含多个逻辑分区)。
- 签名(2 字节):用于标识 MBR 的有效性。
MBR分区从1980年代MS-DOS引进时,盘限2TB。随着盘超限,老MBR过时。现在推荐GPT分区。
GUID分区表(GPT)
结构
LBA 0: 保护性 MBR
LBA 1: 主 GPT 头
LBA 2-33: 主分区表(128 个分区条目,每个 128 字节,共 16 KB)
LBA 34+: 数据分区(EFI 系统分区、根文件系统等)
...
倒数第 33-2 LBA: 备份分区表
最后一个 LBA: 备份 GPT 头(主 GPT 损坏时,可通过备份恢复分区信息)
UEFI用GUID分区表(GPT),支持盘到9.4ZB(泽字节)! GPT 提供了 EFI 系统分区(ESP) EFI 是 UEFI(Unified EFI)的核心部分,是一种现代固件接口,取代传统 BIOS,用于初始化硬件并加载操作系统. EFI 通常大小为 100-512 MB,FAT32 格式, 挂载在 /boot/efi。 ESP 存储 UEFI 引导程序(如 GRUB的 grubx64.efi)和配置文件。 UEFI通过GPT找到EFI分区里的引导程序GRUB加载系统内核。
3. 引导加载器 – GRUB
传统BIOS或UEFI通过GRUB加载器负责加载Linux内核(vmlinuz 文件)和初始 RAM 磁盘(initramfs),并传递启动参数,完成内核初始化。
4. 内核初始化
该Linux内核上场!这节重点聊它必须做的初始任务。 Linux内核是核心“大脑”,提供关键能力如:
- 内存、进程、任务管理
- 设备/驱动硬件接口
- 文件系统挂载访问
- 网络、IPC、同步原语
- 用户程序系统调用API
内核(vmlinuz 文件)被加载到内存并开始执行。 内核解压并初始化硬件,包括 CPU、内存和设备驱动。 挂载初始 RAM 磁盘(initramfs),提供临时的根文件系统,包含必要的驱动和工具,用于挂载实际的根文件系统。 内核执行 initramfs 中的 /init 脚本,完成设备初始化和根文件系统挂载。 加载到内存后,内核需通过内置和模块驱动代码初始化子系统,挂载根文件系统,准备用户空间环境。
最后一步,内核跑/sbin/init守护,转交初始化给第一个用户空间进程。
5. Init、运行级别和Systemd
终于到用户空间!/sbin/init进程启动剩余系统服务。
历史上,Unix系统用“运行级别” – 0到6数字码 – 引导OS到特定模式。比如运行级别3可能是文本单用户模式。
init守护按/etc/inittab默认运行级别,查/etc/rc.d里.sh启动脚本,配置整体系统状态。
几十年间,Upstart和systemd等替代初始化系统出现。大多数主流Linux发行版现在转systemd,提升依赖和并行。
但运行级别概念残留,比如重启到单用户模式,或排查引导问题禁用服务。懂老上下文对Linux管理员还有益。
回顾经典SysV vs 现代systemd初始化:
A) SysV init运行级别
SysV init守护查/etc/inittab‘initdefault’默认运行级别,执行对应脚本:
# /etc/inittab
id:3:initdefault:
# 运行级别3脚本
/etc/rc.d/rc3.d/
├─S10network
├─S20nfs-common
├─S55sshd
├ ...
这可靠初始化顺序脚本。但服务间没依赖知识,常导致竞争条件。
常见运行级别: 0 – 关机
1 – 单用户模式
2 – 多用户,无NFS
3 – 完整多用户文本
4 – 未用
5 – 完整多用户图形(默认)
6 – 重启
管理员手动确保脚本顺序。整体,这方法简单但有限。
B) systemd初始化
现代systemd init系统通过改进依赖,提升初始化。解析/etc/systemd/system/*.service单元文件元数据,构建引导依赖图。每个包含信息如:
[Unit]
Description=Networking Service
Wants=network.target
Before=network-pre.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/systemctl start network
[Install]
WantedBy=multi-user.target
这声明模型让systemd解析元数据建引导依赖图。[Install]节处理跟引导目标集成。
我专业管理无数Linux系统经验,这systemd模型大幅提升管理和启动速度。但需适应非传统初始化概念。
关键要点
- SysV init用运行级别和脚本
- 运行级别切换操作模式
- Systemd用单元文件和目标
- 单元文件声明能力和依赖
6. 登录提示及后续!
所有引导服务启动,用户能通过虚拟终端、串口或网络设备访问登录提示。
图形系统额外呈现图形显示管理器如GDM、LightDM或SDDM,平滑输入凭证。
登录生成per-user systemd –user实例,由systemd logind守护处理。初始化用户进程、会话、主目录、dbus上下文等。
到此 – 多阶段Linux引导过程结束!操作系统全功能在你指尖。