Skip to content

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引导过程结束!操作系统全功能在你指尖。