1. BIOS/UEFI 阶段
-
硬件自检(POST)
- BIOS/UEFI 执行硬件检查(内存、CPU、外设等)。
- 若硬件异常,通过蜂鸣码或屏幕提示错误。
-
选择启动设备
- 按配置顺序(硬盘、U盘、网络等)寻找可引导设备。
- BIOS:读取磁盘第一个扇区的 MBR(512字节)。
- UEFI:从 ESP 分区(EFI System Partition)加载
.efi
文件(如grubx64.efi
)。
2. 引导加载程序(Bootloader)
常见工具:GRUB2(GNU GRand Unified Bootloader)
GRUB2 工作流程:
-
Stage 1(MBR 或 ESP 分区)
- 加载 Stage 1.5(如
core.img
),提供基础文件系统驱动。
- 加载 Stage 1.5(如
-
Stage 2(
/boot/grub/
)- 加载配置文件
/boot/grub/grub.cfg
,显示启动菜单。 - 用户可选择内核版本或进入救援模式。
- 加载配置文件
-
加载内核与 initramfs
- 将选定的 内核(vmlinuz) 和 initramfs 镜像加载到内存。
关键文件:
grub.cfg
:由grub-mkconfig
生成(编辑/etc/default/grub
后需更新)。initramfs-*.img
:包含根文件系统挂载前的必要驱动和工具。
3. 内核初始化
-
解压与初始化
- 内核解压并初始化硬件(CPU、内存、设备树等)。
- 挂载临时根文件系统(initramfs),加载关键驱动(如磁盘控制器、文件系统驱动)。
-
切换至真实根文件系统
- 通过
initramfs
中的脚本(如/init
)挂载真正的根分区(/
)。 - 卸载 initramfs,释放内存。
- 通过
-
启动第一个用户进程
- 内核启动 PID=1 的进程:
- 传统系统:
/sbin/init
(SysV init) - 现代系统:
systemd
- 传统系统:
- 内核启动 PID=1 的进程:
4. 用户空间初始化
(1)SysV init 流程
- 读取
/etc/inittab
- 确定默认运行级别(
id:3:initdefault:
)。
- 确定默认运行级别(
- 执行
/etc/rc.d/rc.sysinit
- 初始化网络、挂载文件系统、加载内核模块等。
- 按运行级别启动服务
- 运行级别目录(如
/etc/rc3.d/
),按S##Service
顺序启动服务。
- 运行级别目录(如
(2)systemd 流程
- 加载默认 Target
- 默认目标:
graphical.target
(图形界面)或multi-user.target
(命令行)。
- 默认目标:
- 并行启动服务
- 根据单元(Unit)依赖关系并发启动服务,加速启动。
- 关键命令:
systemctl get-default # 查看默认 Target systemctl set-default TARGET# 修改默认 Target
5. 运行级别(Runlevel)与 Target 对照
SysV 运行级别 | systemd Target | 描述 |
---|---|---|
0 | poweroff.target | 关机 |
1 | rescue.target | 单用户模式(救援) |
3 | multi-user.target | 多用户命令行模式 |
5 | graphical.target | 图形界面模式 |
6 | reboot.target | 重启 |
6. 用户登录
- 显示管理器(Display Manager)
- 图形登录:GDM(GNOME)、LightDM 等。
- 终端登录
- 启动
getty
进程,提供 TTY 登录界面。
- 启动
- 登录后加载 Shell
- 执行用户配置(
/etc/profile
、~/.bash_profile
等)。
- 执行用户配置(
常见故障排查
-
GRUB 损坏
- 使用 Live CD 修复或重装 GRUB:
grub-install /dev/sda update-grub
- 使用 Live CD 修复或重装 GRUB:
-
内核启动失败
- 在 GRUB 菜单中选择旧版本内核启动。
- 检查
/var/log/boot.log
或journalctl -b
(systemd 日志)。
-
根文件系统挂载失败
- 在启动参数中添加
init=/bin/bash
进入救援 Shell。 - 检查
/etc/fstab
或手动挂载根分区。
- 在启动参数中添加
四、流程图
BIOS/UEFI → Bootloader → Kernel → Init Process → Target/Runlevel → Login
附录
- 查看启动时间:
systemd-analyze
- 重建 initramfs:
mkinitramfs -o /boot/initrd.img-$(uname -r)
- 修改内核参数:编辑
/etc/default/grub
→GRUB_CMDLINE_LINUX
→ 运行update-grub
通过理解启动流程,可更高效地诊断系统问题或优化启动速度。