Linux 系统的启动流程
Linux 系统的启动流程是一个复杂的过程,涉及多个阶段和组件。以下是 Linux 系统启动的详细流程:
1. BIOS/UEFI 启动
- BIOS(Basic Input/Output System) 或 UEFI(Unified Extensible Firmware Interface) 是计算机硬件启动的第一阶段。
- BIOS:传统的启动方式,主要用于旧式硬件。BIOS 会进行硬件自检(POST,Power-On Self Test),检测硬件是否正常工作,并加载启动设备(如硬盘)上的引导记录。
- UEFI:现代的启动方式,支持更大的启动分区和更安全的启动过程。UEFI 也会进行硬件检测,并从启动设备中加载 EFI 引导程序。
- Legacy 是一种启动模式,用于兼容旧式硬件和软件,通常依赖 BIOS 来完成启动过程。
2. MBR/GPT 引导记录
- MBR(Master Boot Record) 或 GPT(GUID Partition Table) 是硬盘上的引导记录。
- MBR:位于硬盘的第一个扇区(512 字节),包含启动代码和分区表。MBR 中的引导程序会加载活动分区的引导程序。
- GPT:用于大容量硬盘(大于 2TB),支持更多的分区。GPT 引导程序通常位于 EFI 系统分区(ESP)中。
3. Bootloader(引导程序)
- GRUB(GRand Unified Bootloader) 是最常用的 Linux 引导程序。
- GRUB 阶段 1:从 MBR 或 ESP 中加载 GRUB 的第一阶段代码。
- GRUB 阶段 2:加载 GRUB 配置文件(
/boot/grub/grub.cfg
),显示启动菜单,允许用户选择操作系统或内核版本。 - GRUB 阶段 3:加载选定的内核和初始化内存盘(initrd)。
4. Kernel(内核)启动
- 内核加载:GRUB 将 Linux 内核(通常是
/boot/vmlinuz
)和初始化内存盘(initrd)加载到内存中。 - 内核初始化:
- 硬件检测:内核会检测系统硬件并加载相应的驱动程序。
- 初始化进程:内核启动后,会创建第一个用户空间进程,通常是
init
或systemd
。
5. Systemd 或 Init 系统
- Systemd(现代 Linux 系统的默认初始化系统)或 SysVinit(传统的初始化系统)负责启动用户空间的进程和服务。
- Systemd:
- Target:Systemd 使用目标(target)来定义启动级别,例如
multi-user.target
(多用户图形界面)或runlevel3.target
(多用户命令行)。 - Service:Systemd 管理各种服务(如网络服务、SSH 服务等),通过
.service
文件定义服务的启动条件和行为。 - Unit:Systemd 使用单元(unit)来管理各种资源,包括服务、设备、挂载点等。
- Target:Systemd 使用目标(target)来定义启动级别,例如
- SysVinit:
- Runlevel:SysVinit 使用运行级别(runlevel)来定义系统的启动状态,例如
runlevel 3
(多用户命令行)或runlevel 5
(多用户图形界面)。 - Init Script:SysVinit 使用启动脚本(位于
/etc/init.d/
)来管理服务的启动和停止。
- Runlevel:SysVinit 使用运行级别(runlevel)来定义系统的启动状态,例如
- Systemd:
6. 用户登录
- 登录管理器:Systemd 或 SysVinit 启动登录管理器(如
getty
或lightdm
),允许用户输入用户名和密码进行登录。 - 用户会话:登录后,系统会启动用户会话,加载用户配置文件(如
.bashrc
、.profile
等),并启动用户的应用程序和服务。