前言
你好,欢迎来到 Linux 运维第五章(5-1)!
前面四章我们学习了文件管理、用户权限、进程管理和存储管理,你已经能够熟练地操作一个正在运行的 Linux 系统了。但有一个问题可能一直悬而未决——系统是怎么启动起来的?
当你按下电源键,屏幕上一串串字符飞速滚动,直到出现登录提示符。这中间发生了什么?如果系统启动卡住了,怎么排查?如果忘记了 root 密码,怎么重置?这些问题的答案,都藏在 Linux 的启动流程中。
今天我们将系统学习:
- Linux 启动流程全景:从 BIOS/UEFI 到用户空间的完整链路
- GRUB2 引导配置:启动菜单、内核参数、配置文件修改
- 运行级别与 systemd target:SysVinit 与 systemd 的对比与切换
- 单用户模式与救援模式:重置 root 密码、修复启动故障
- 启动故障排查:查看日志、定位问题
- Rocky vs Ubuntu 启动流程差异
学完今天的内容,你将能理解 Linux 启动的"黑盒",并在系统无法启动时从容应对。
好,让我们正式开始今天的旅程 🚀
一、Linux 启动流程全景
1.1 启动链路(从硬件到用户空间)
Linux 的启动过程可以分为五个主要阶段:
① 硬件初始化 → ② 引导程序 → ③ 内核初始化 → ④ 临时根文件系统 → ⑤ 系统初始化
BIOS/UEFI GRUB2 Kernel initramfs systemd
硬件自检、 加载内核和 解压内核、 加载关键驱动、 挂载根文件系统、
选择引导设备 initramfs 初始化硬件 提供临时根环境 启动所有服务
| ① 硬件初始化 | BIOS/UEFI | 硬件自检(POST)、选择引导设备 | 检测 CPU、内存、硬盘、键盘 |
| ② 引导程序 | GRUB2 | 加载内核和 initramfs 到内存 | 显示启动菜单、加载内核 |
| ③ 内核初始化 | Kernel | 解压内核、加载驱动 | 初始化硬件、调度器、内存管理 |
| ④ 临时根文件系统 | initramfs | 提供临时根环境,加载关键驱动 | 加载 LVM/RAID/文件系统模块 |
| ⑤ 系统初始化 | systemd(PID 1) | 启动所有系统服务、进入默认 target | 并行启动服务、挂载文件系统 |
1.2 各阶段详解
1. BIOS/UEFI(固件层)
- BIOS(传统)或 UEFI(现代)执行硬件自检(POST,Power-On Self-Test)
- 检测 CPU、内存、硬盘、键盘等硬件是否正常
- 根据启动顺序(Boot Order)选择引导设备(硬盘、U 盘、网络等)
2. GRUB2(引导加载程序)
GRUB2(Grand Unified Bootloader version 2)负责加载内核和 initramfs:
- 显示启动菜单(可选)
- 加载选中的内核(vmlinuz)到内存
- 加载 initramfs(初始内存文件系统)到内存
- 将控制权移交给内核
3. Kernel(内核初始化)
- 内核解压并加载初始化
- 检测并加载硬件驱动(CPU、内存、PCI 设备等)
- 挂载 initramfs 为临时根文件系统
- 启动 initramfs 中的第一个进程(在 systemd 系统中即为 systemd)
4. initramfs(临时根文件系统)
initramfs 是一个小型的临时根文件系统,包含:
- 存储设备驱动(SATA、SCSI、NVMe)
- 文件系统模块(ext4、xfs、btrfs)
- LVM、RAID、加密卷等工具
其作用是在真正的根文件系统挂载前,加载必需的驱动,确保内核能够访问真实的根文件系统。
5. systemd(PID 1)
- 挂载真正的根文件系统(/)
- 启动所有系统服务(并行启动,加快速度)
- 进入默认的运行目标(target)
1.3 启动流程中的关键文件
| 内核文件 | /boot/vmlinuz-* | /boot/vmlinuz-* |
| initramfs 映像 | /boot/initramfs-*.img | /boot/initrd.img-* |
| GRUB 配置文件 | /boot/grub2/grub.cfg | /boot/grub/grub.cfg |
| GRUB 默认配置 | /etc/default/grub | /etc/default/grub |
| 默认 target 链接 | /etc/systemd/system/default.target | /etc/systemd/system/default.target |
二、GRUB2 引导配置
2.1 GRUB2 是什么?
GRUB2 是 Linux 系统最常用的引导加载程序(Boot Loader)。它的核心职责是:
- 允许用户选择启动哪个操作系统或内核版本
- 向内核传递启动参数
- 提供救援模式和单用户模式的入口
2.2 /etc/default/grub 核心参数
| GRUB_TIMEOUT | 启动菜单等待时间(秒) | 5(5秒),-1(无限等待) |
| GRUB_DEFAULT | 默认启动项(0 表示第一个) | 0(第一个),saved(记住上次选择) |
| GRUB_CMDLINE_LINUX | 内核启动参数 | rhgb quiet(图形启动+减少日志) |
常用内核启动参数:
| rhgb | Red Hat Graphical Boot(图形化启动,显示进度条) | RHEL 默认 |
| quiet | 减少内核启动日志输出(静默模式) | 生产环境,减少干扰 |
| splash | Ubuntu 启动画面 | Ubuntu 默认 |
2.3 修改 GRUB 配置(实战案例)
案例一:调整启动菜单等待时间
场景:服务器开机时 GRUB 菜单等待时间太短(5 秒),来不及选择其他内核版本,需要调整为 30 秒。
Rocky 10:
# 1. 查看当前配置
cat /etc/default/grub | grep TIMEOUT
输出示例:
GRUB_TIMEOUT=5
# 2. 修改等待时间为 30 秒
vim /etc/default/grub
将 GRUB_TIMEOUT=5 改为:
GRUB_TIMEOUT=30
# 3. 重新生成 GRUB 配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
输出示例:
Generating grub configuration file ...
Adding boot menu entry for UEFI Firmware Settings ...
done
# 4. 重启系统
reboot
Ubuntu 26.04:
# 1. 查看当前配置
cat /etc/default/grub | grep TIMEOUT
输出示例:
GRUB_TIMEOUT=5
# 2. 修改等待时间为 30 秒
sudo vim /etc/default/grub
将 GRUB_TIMEOUT=5 改为:
GRUB_TIMEOUT=30
# 3. 重新生成 GRUB 配置文件
sudo update-grub
输出示例:
Sourcing file '/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.8.0-31-generic
Found initrd image: /boot/initrd.img-6.8.0-31-generic
done
# 4. 重启系统
sudo reboot
💡 提示:GRUB_TIMEOUT=-1 表示无限等待,直到用户手动选择。
💡 提示 2:新版 GRUB 2.04+ 引入了 GRUB_TIMEOUT_STYLE 参数,默认值为 hidden,表示启动时不显示菜单,按 ESC 键才会显示,倒计时结束后直接启动默认系统。
案例二:添加内核启动参数(禁用图形启动)
场景:系统启动时卡在图形进度条界面,看不到详细报错信息,需要去掉 rhgb quiet 参数显示详细启动日志,便于排查问题。
Rocky 10:
# 1. 查看当前内核参数
cat /etc/default/grub | grep CMDLINE_LINUX
输出示例:
GRUB_CMDLINE_LINUX="rhgb quiet"
# 2. 删除 rhgb quiet(显示详细启动日志)
vim /etc/default/grub
将:
GRUB_CMDLINE_LINUX="rhgb quiet"
改为:
GRUB_CMDLINE_LINUX=""
# 3. 重新生成 GRUB 配置
grub2-mkconfig -o /boot/grub2/grub.cfg
# 4. 重启系统
reboot
Ubuntu 26.04:
# 1. 查看当前内核参数
cat /etc/default/grub | grep CMDLINE_LINUX
输出示例:
GRUB_CMDLINE_LINUX="quiet splash"
# 2. 删除 quiet splash(显示详细启动日志)
sudo vim /etc/default/grub
将:
GRUB_CMDLINE_LINUX="quiet splash"
改为:
GRUB_CMDLINE_LINUX=""
# 3. 重新生成 GRUB 配置
sudo update-grub
# 4. 重启系统
sudo reboot
2.4 修改 GRUB 配置流程总结
| 编辑默认配置 | vim /etc/default/grub | vim /etc/default/grub |
| 生成配置文件 | grub2-mkconfig -o /boot/grub2/grub.cfg | update-grub |
| GRUB 配置文件位置 | /boot/grub2/grub.cfg | /boot/grub/grub.cfg |
三、运行级别与 systemd target
3.1 SysVinit 运行级别(传统)
SysVinit 是 Linux 早期使用的初始化系统,使用运行级别(Runlevel) 来控制系统状态:
| 0 | 关机(Halt) | 关闭系统 |
| 1 | 单用户模式(Single-user) | 维护模式,仅 root 可登录,不启动网络 |
| 2 | 多用户模式(Multi-user) | 多用户模式,不启动网络服务(Debian 系统默认) |
| 3 | 多用户(命令行) | 完整的多用户命令行模式(RHEL 系统默认) |
| 4 | 未使用(自定义) | 用户可自定义 |
| 5 | 图形界面(X11) | 多用户 + 图形界面(GUI) |
| 6 | 重启(Reboot) | 重启系统 |
3.2 systemd target(现代)
systemd 使用 target 替代了传统的运行级别:
| 0 | poweroff.target | 关机 |
| 1 | rescue.target | 单用户/救援模式 |
| 2 | multi-user.target | 多用户模式(无网络,Debian 系统默认) |
| 3 | multi-user.target | 多用户命令行模式(RHEL 系统默认) |
| 4 | multi-user.target | 未使用 |
| 5 | graphical.target | 图形界面模式 |
| 6 | reboot.target | 重启 |
3.3 systemd vs SysVinit 对比
| 启动方式 | 顺序启动(串行) | 并行启动 |
| 启动速度 | 慢 | 快 |
| 依赖管理 | 手动设置依赖顺序 | 自动解析依赖关系 |
| 配置复杂度 | 简单但僵化 | 灵活但学习曲线陡峭 |
| 当前状态 | 已被取代 | 主流(RHEL 7+/Ubuntu 15.04+) |
3.4 查看和切换运行级别/target
查看当前 target:
systemctl get-default
输出示例:
multi-user.target
# 或查看链接
ls -l /etc/systemd/system/default.target
切换 target(临时):
# 切换到救援模式
systemctl rescue
# 切换到紧急模式
systemctl emergency
# 重启系统
systemctl reboot
# 关机
systemctl poweroff
设置默认 target(永久):
# 设置为命令行模式
systemctl set-default multi-user.target
# 设置为图形界面模式
systemctl set-default graphical.target
3.5 查看 target 的依赖关系
# 查看 multi-user.target 依赖的服务
systemctl list-dependencies multi-user.target
# 查看 graphical.target 依赖的服务
systemctl list-dependencies graphical.target
四、单用户模式与救援模式
4.1 什么是单用户模式?
单用户模式是一种维护模式,用于:
- 重置 root 密码(忘记 root 密码时)
- 修复文件系统错误
- 排查启动故障
- 移除损坏的软件包
4.2 进入单用户模式(通过 GRUB)
Rocky 10:
# 1. 重启系统,在 GRUB 菜单中按 e 键编辑启动项
# 2. 找到 linux 开头的行(内核启动参数行)
# 3. 在行末添加 rd.break(中断启动进入 initramfs)
# 4. 按 Ctrl+x 启动
进入后:
# 根文件系统挂载在 /sysroot,需要重新挂载为读写
mount -o remount,rw /sysroot
chroot /sysroot
# 执行维护操作…
exit
reboot
Ubuntu 26.04:
# 1. 重启系统,在 GRUB 菜单中按 e 键编辑启动项
# 2. 找到 linux 开头的行(内核启动参数行)
# 3. 在行末添加 single 或 1
# 4. 按 Ctrl+x 启动
4.3 重置 root 密码(实战场景)
方法一:使用 rd.break(Rocky 10)
# 1. 在 GRUB 界面按 e 键编辑
# 2. 在 linux 开头的行末尾添加 rd.break
# 3. 按 Ctrl+x 启动
mount -o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel # SELinux 重新标记(Rocky 需要)
exit
reboot
方法二:使用 single 参数(Ubuntu 26.04 / 通用)
# 1. 在 GRUB 界面按 e 键编辑
# 2. 在 linux 开头的行末尾添加 single
# 3. 按 Ctrl+x 启动
mount -o remount,rw /
passwd root
reboot
4.4 rescue.target vs emergency.target
| 根文件系统 | 挂载为只读 | 不挂载任何文件系统 |
| 网络 | 通常不启动 | 不启动 |
| 服务 | 启动基础服务 | 只启动 systemd 核心 |
| 适用场景 | 文件系统损坏修复 | 需要完全手动挂载和修复 |
| 进入方式 | systemd.unit=rescue.target | systemd.unit=emergency.target |
| RHEL 系统 | rd.break 或 systemd.unit=rescue.target | systemd.unit=emergency.target |
| Debian 系统 | single 或 1 | emergency |
五、启动故障排查常用操作
5.1 查看启动日志
# 查看本次启动日志
journalctl -b
# 查看上次启动的日志(排查重启原因)
journalctl -b -1
# 查看启动过程中失败的服务
systemctl –failed
# 查看特定服务的启动状态
systemctl status nginx
5.2 常用启动参数速查
| 3 或 multi-user.target | 启动到命令行模式 | 图形界面故障 |
| single 或 1 | 启动到单用户模式 | 重置密码、修复系统 |
| rd.break | 在 initramfs 阶段中断 | RHEL 重置密码 |
| systemd.unit=emergency.target | 启动到紧急模式 | 无法挂载根文件系统 |
| init=/bin/bash | 直接启动 bash | 系统完全无法启动时 |
5.3 常见启动故障排查流程
系统无法启动
│
▼
看到什么?
│
┌───┴───┐
▼ ▼
GRUB菜单 黑屏/卡死/服务失败
│ │
▼ ▼
检查GRUB配置 进入单用户模式
尝试旧内核启动 查看 journalctl -b
查看失败服务 systemctl –failed
修复完成 → reboot
六、Rocky 10 vs Ubuntu 26.04 启动流程差异
| 引导配置生成 | grub2-mkconfig -o /boot/grub2/grub.cfg | update-grub |
| GRUB 配置文件 | /boot/grub2/grub.cfg | /boot/grub/grub.cfg |
| initramfs 映像 | /boot/initramfs-*.img | /boot/initrd.img-* |
| initramfs 生成工具 | dracut | update-initramfs |
| 进入单用户模式 | rd.break 或 systemd.unit=rescue.target | single 或 1 |
| 默认运行级别 | multi-user.target(命令行) | graphical.target(图形) |
| 内核包名 | kernel | linux-image |
| SELinux | 默认启用(需 /.autorelabel) | 默认不使用 |
| 包管理器 | dnf | apt |
七、结语
恭喜你!😊 到这里,你已经完成了 Linux 运维第五章(5-1)的全部学习内容。
今天我们系统学习了:
- Linux 启动流程全景:BIOS/UEFI → GRUB2 → Kernel → initramfs → systemd
- GRUB2 引导配置:/etc/default/grub 参数、grub2-mkconfig / update-grub
- 运行级别与 systemd target:SysVinit 运行级别与 systemd target 的映射关系
- 单用户模式与救援模式:rd.break、single、rescue.target、emergency.target
- 重置 root 密码:通过单用户模式修改密码
- 启动故障排查:journalctl -b、systemctl –failed
- Rocky vs Ubuntu 启动差异:配置文件位置、单用户进入方式
理解了 Linux 启动流程,你就掌握了系统故障排查的"第一性原理"。当系统无法启动时,你不再束手无策,而是能有条不紊地定位和解决问题。
如果在学习过程中遇到任何问题,欢迎在评论区留言讨论!也别忘了点赞收藏,方便以后查阅~
附录:核心知识点速查表
| 查看当前 target | systemctl get-default |
| 设置默认 target(命令行) | systemctl set-default multi-user.target |
| 设置默认 target(图形) | systemctl set-default graphical.target |
| 查看 target 依赖 | systemctl list-dependencies multi-user.target |
| 查看本次启动日志 | journalctl -b |
| 查看上次启动日志 | journalctl -b -1 |
| 查看失败的服务 | systemctl –failed |
| 重启系统 | systemctl reboot |
| 关机 | systemctl poweroff |
| 修改 GRUB 配置(Rocky) | grub2-mkconfig -o /boot/grub2/grub.cfg |
| 修改 GRUB 配置(Ubuntu) | update-grub |
附录:运行级别与 target 对照表
| 0 | poweroff.target | 关机 |
| 1 | rescue.target | 单用户/救援模式 |
| 2 | multi-user.target | 多用户模式(无网络) |
| 3 | multi-user.target | 多用户命令行模式 |
| 4 | multi-user.target | 未使用 |
| 5 | graphical.target | 图形界面模式 |
| 6 | reboot.target | 重启 |
附录:GRUB 启动参数速查
| rhgb | 图形化启动(RHEL) |
| quiet | 减少启动日志 |
| splash | 启动画面(Ubuntu) |
| single 或 1 | 单用户模式 |
| rd.break | initramfs 阶段中断(RHEL) |
| systemd.unit=rescue.target | 救援模式 |
| systemd.unit=emergency.target | 紧急模式 |
| init=/bin/bash | 直接启动 bash |
附录:Rocky vs Ubuntu 快速对照表
| 生成 GRUB 配置 | grub2-mkconfig -o /boot/grub2/grub.cfg | update-grub |
| GRUB 配置文件 | /boot/grub2/grub.cfg | /boot/grub/grub.cfg |
| 单用户模式入口 | rd.break | single |
| 默认 target | multi-user.target | graphical.target |
| 重置密码后 SELinux | touch /.autorelabel | 不需要 |



