CentOS 7 启动流程详解与故障修复实战(rd.break 、fstab 、GRUB2)
CentOS 7 系统启动原理与故障排除
本文详细介绍了 CentOS 7 的启动流程、systemd 的 target 概念,以及常见的启动故障修复方法(包括重置 root 密码和修复 /etc/fstab 问题)。
1. CentOS 7 启动流程(概述)
从按下电源键到出现登录提示符,大致经历以下 9 个阶段:
| 阶段 | 说明 |
|---|---|
| 1. 开机自检(POST) | 固件(BIOS/UEFI)初始化硬件,检测内存、键盘等。 |
| 2. MBR 引导 | 固件按顺序查找启动设备,读取磁盘的主引导记录(MBR),加载 boot loader(GRUB2)。 |
| 3. GRUB 菜单 | GRUB2 读取 /boot/grub2/grub.cfg,显示操作系统选择菜单。 |
| 4. 加载内核与 initramfs | 根据选中的菜单项,将内核和 initramfs 加载到内存。initramfs 包含必要的驱动和初始化脚本。 |
| 5. 运行 systemd(PID 1) | initramfs 中的 /sbin/init 指向 systemd,systemd 成为第一个进程。 |
| 6. 加载默认 target | systemd 根据内核参数或默认配置(default.target)启动对应的目标(如 multi-user.target 或 graphical.target)。 |
| 7. 初始化系统 | sysinit.target 挂载 /etc/fstab 中的文件系统,启动日志服务(journald)等。 |
| 8. 启动服务 | default.target 会激活所有开机自启的服务单元。 |
| 9. 登录界面 | getty.target 打开 tty1 终端,等待用户登录。 |
2. systemd 的 target(运行级别替代)
CentOS 7 使用 target 替代传统的 SysV init 运行级别(runlevel)。对应关系如下:
| 运行级别 | target | 作用 |
|---|---|---|
| 0 | poweroff.target | 关机 |
| 1 | rescue.target / emergency.target | 单用户模式(修复系统) |
| 2 | multi-user.target(无 NFS) | 多用户文本模式(不常用) |
| 3 | multi-user.target | 多用户文本模式(常用) |
| 4 | 未使用 | — |
| 5 | graphical.target | 多用户图形模式(带 X Window) |
| 6 | reboot.target | 重启 |
常用命令
bash
# 查看当前默认 target
systemctl get-default
# 设置默认 target(永久生效)
systemctl set-default multi-user.target
# 临时切换当前 target(不重启)
systemctl isolate graphical.target
# 查看 target 的依赖关系
systemctl list-dependencies graphical.target
# 查看某个服务被哪些 target 依赖
systemctl list-dependencies sshd.service --reverse
3. 启动时临时选择其他 target
如果系统无法正常启动,可以在 GRUB 菜单中临时修改内核参数,进入救援模式或紧急模式。
操作步骤:
- 重启系统,在 GRUB 菜单出现时按任意键(除 Enter 外)中断倒计时。
- 选择要启动的内核条目,按
e键编辑。 - 找到以
linux开头的内核命令行,在末尾添加:systemd.unit=emergency.target(紧急模式,最简环境)systemd.unit=rescue.target(救援模式,单用户)
- 按
Ctrl + X启动。
4. 重置 root 密码(两种常用方法)
方法一:rd.break(官方推荐)
-
重启,在 GRUB 菜单编辑内核行,在末尾添加
rd.break。 -
按
Ctrl + X启动,系统会进入 initramfs 的 shell(提示符switch_root:/#)。 -
以读写方式重新挂载真实根目录:
bash
mount -o remount,rw /sysroot -
切换根目录:
bash
chroot /sysroot -
修改 root 密码:
bash
passwd root -
如果启用了 SELinux,必须创建重新标记文件:
bash
touch /.autorelabel -
输入两次
exit退出 chroot 和 shell,系统会继续启动并自动重新标记 SELinux,然后重启。
方法二:init=/bin/bash(快速但风险较高)
-
在 GRUB 内核行末尾添加
init=/bin/bash。 -
按
Ctrl + X启动,直接获得 root shell(PID 1 被 bash 替代)。 -
以读写方式重新挂载根目录:
bash
mount -o remount,rw / -
修改密码:
bash
passwd -
如果启用了 SELinux,也需
touch /.autorelabel。 -
必须执行以下命令正常启动 systemd,否则可能损坏文件系统:
bash
exec /sbin/init
对比:rd.break 更安全、官方推荐;init=/bin/bash 如果忘记 exec /sbin/init 直接重启容易导致文件系统损坏,不推荐生产环境使用。
5. /etc/fstab 引起的启动故障及修复
故障1:挂载点目录不存在
- 现象:启动时自动创建缺失的挂载点(CentOS 7 会自动创建),通常不会导致启动失败。
故障2:设备名称写错或设备不存在
- 现象:启动超时(约 1分30秒)后进入 emergency mode,提示修复。
- 解决:
- 输入 root 密码进入 emergency shell。
- 编辑
/etc/fstab,修正错误的设备名或注释掉该行。 - 执行
reboot重启。
故障3:文件系统损坏
- 现象:启动时尝试修复失败,进入 emergency mode。
- 解决:
- 进入 emergency shell。
- 运行
fsck修复对应分区(如fsck /dev/sdb1)。 - 修复完成后输入
exit继续启动。
6. GRUB2 配置简述
- 主配置文件:
/boot/grub2/grub.cfg(不要直接编辑,由工具生成)。 - 自定义配置:修改
/etc/default/grub和/etc/grub.d/下的脚本,然后用grub2-mkconfig生成。
示例:修改菜单超时时间
bash
vim /etc/default/grub
# 修改 GRUB_TIMEOUT=10
grub2-mkconfig -o /etc/grub2.cfg
reboot
小结:掌握 CentOS 7 的启动流程和 systemd target 管理,能帮助您快速定位启动故障,熟练使用 rd.break 和 fstab 修复是运维必备技能。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)