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 菜单中临时修改内核参数,进入救援模式或紧急模式。

操作步骤:

  1. 重启系统,在 GRUB 菜单出现时按任意键(除 Enter 外)中断倒计时。
  2. 选择要启动的内核条目,按 e 键编辑。
  3. 找到以 linux 开头的内核命令行,在末尾添加:
    • systemd.unit=emergency.target(紧急模式,最简环境)
    • systemd.unit=rescue.target(救援模式,单用户)
  4. Ctrl + X 启动。

4. 重置 root 密码(两种常用方法)

方法一:rd.break(官方推荐)

  1. 重启,在 GRUB 菜单编辑内核行,在末尾添加 rd.break

  2. Ctrl + X 启动,系统会进入 initramfs 的 shell(提示符 switch_root:/#)。

  3. 以读写方式重新挂载真实根目录:

    bash

    mount -o remount,rw /sysroot
    
  4. 切换根目录:

    bash

    chroot /sysroot
    
  5. 修改 root 密码:

    bash

    passwd root
    
  6. 如果启用了 SELinux,必须创建重新标记文件:

    bash

    touch /.autorelabel
    
  7. 输入两次 exit 退出 chroot 和 shell,系统会继续启动并自动重新标记 SELinux,然后重启。

方法二:init=/bin/bash(快速但风险较高)

  1. 在 GRUB 内核行末尾添加 init=/bin/bash

  2. Ctrl + X 启动,直接获得 root shell(PID 1 被 bash 替代)。

  3. 以读写方式重新挂载根目录:

    bash

    mount -o remount,rw /
    
  4. 修改密码:

    bash

    passwd
    
  5. 如果启用了 SELinux,也需 touch /.autorelabel

  6. 必须执行以下命令正常启动 systemd,否则可能损坏文件系统:

    bash

    exec /sbin/init
    

对比:rd.break 更安全、官方推荐;init=/bin/bash 如果忘记 exec /sbin/init 直接重启容易导致文件系统损坏,不推荐生产环境使用。


5. /etc/fstab 引起的启动故障及修复

故障1:挂载点目录不存在

  • 现象:启动时自动创建缺失的挂载点(CentOS 7 会自动创建),通常不会导致启动失败。

故障2:设备名称写错或设备不存在

  • 现象:启动超时(约 1分30秒)后进入 emergency mode,提示修复。
  • 解决
    1. 输入 root 密码进入 emergency shell。
    2. 编辑 /etc/fstab,修正错误的设备名或注释掉该行。
    3. 执行 reboot 重启。

故障3:文件系统损坏

  • 现象:启动时尝试修复失败,进入 emergency mode。
  • 解决
    1. 进入 emergency shell。
    2. 运行 fsck 修复对应分区(如 fsck /dev/sdb1)。
    3. 修复完成后输入 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 修复是运维必备技能。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐