系统启动原理
一、系统启动过程
从接通电源到系统呈现登录提示符,需硬件初始化、固件引导、内核加载、系统初始化等多环节配合。
以下从宏观层面梳理 CentOS 7 完整启动流程:
-
计算机接通电源后,系统固件(UEFI 或传统 BIOS)首先执行开机自检(POST),检测 CPU、内存、硬盘等核心硬件是否正常。
- 配置说明:启动早期按特定快捷键(如 F2)可进入固件配置界面,调整启动顺序、硬件参数等。
-
固件按配置的启动顺序搜索启动设备,读取磁盘主启动记录(MBR)中的引导加载器(CentOS 7 默认为 GRUB2),并将系统控制权移交 GRUB2。
- 配置说明:通过 grub2-install 命令可将 GRUB2 安装为磁盘默认启动加载器。
-
GRUB2 读取 /boot/grub2/grub.cfg 配置文件,显示操作系统选择菜单。
- **配置说明:**不可直接编辑 grub.cfg,需通过修改 /etc/grub.d/ 目录下的脚本、/etc/default/grub 配置文件,再执行 grub2-mkconfig 命令生成新的 grub.cfg。
-
引导加载器根据选中的启动项,从磁盘加载内核(vmlinuz)和 initramfs 到内存,并将内核参数、initramfs 内存地址传递给内核。
-
initramfs 是临时内存文件系统,包含启动所需的硬件驱动、初始化脚本等,内核通过它完成硬件初始化。
-
配置说明:通过 /etc/dracut.conf.d/ 目录、dracut 命令生成 initramfs,lsinitrd 命令可查看 initramfs 内容。
-
-
initramfs 执行 /sbin/init(CentOS 7 中该文件为 systemd 的软链接),作为系统首个进程(PID 1)。
- **配置说明:**可通过内核参数 init=command 指定自定义初始化程序。
-
systemd 加载内核命令行指定的 target,或系统默认的 default.target(通常为文本/图形登录界面)。
- **配置说明:**通过 systemctl 命令设置默认 target(如 systemctl set-default multi-user.target)。
-
default.target 依赖 sysinit.target,该 target 完成系统基础初始化:读取 /etc/fstab 挂载文件系统、激活日志服务(systemd-journald)等。
- **配置说明:**通过 /etc/fstab 配置文件设置文件系统开机自动挂载规则。
-
default.target 激活所有配置为开机自启的 systemd 单元(如服务、定时器等)。
- **配置说明:**通过 systemctl enable <服务名> 设置服务开机自启。
-
default.target 激活 getty.target,打开 tty1 终端,提供用户登录入口。
二、 系统 target 机制
目录和子目录、子文件之间关系:目录包含子目录和子文件。
-
service一个服务,例如sshd,提供远程执行命令、复制文件。
-
target 是一个可以包含service、time等对象的特殊unit。systemctl start target,激活该target包含的所有对象。
systemd 以 target 类型单元对各类系统单元(服务、挂载、设备等)进行分组管理,target 可嵌套依赖,形成层级化的启动逻辑。
bash
# 查看 graphical.target 的直接/间接依赖
[root@centos7 ~]# systemctl list-dependencies graphical.target
graphical.target
● ├─accounts-daemon.service
● ├─gdm.service
● ├─initial-setup-reconfiguration.service
● ├─network.service
● ├─rtkit-daemon.service
● ├─systemd-readahead-collect.service
● ├─systemd-readahead-replay.service
● ├─systemd-update-utmp-runlevel.service
● ├─udisks2.service
● └─multi-user.target
......
[root@centos7 ~]# systemctl list-dependencies multi-user.target
multi-user.target
● ├─abrt-ccpp.service
● ├─abrt-oops.service
● ├─abrt-vmcore.service
● ├─abrt-xorg.service
● ├─abrtd.service
● ├─atd.service
......
# 查看 sshd.service 的反向依赖(哪些 target 依赖该服务)
[root@centos7 ~]# systemctl list-dependencies sshd.service --reverse
sshd.service
● └─multi-user.target
● └─graphical.target
传统 SysVinit 定义 7 个运行级别(0-6),CentOS 7 虽使用 systemd,但仍保留对运行级别的兼容映射,具体如下:
三、系统运行目标配置
切换当前系统的运行 target:
bash
# 切换为文本界面(multi-user.target)
[root@centos7 ~ 13:59:31]# systemctl isolate multi-user.target
# 切换为图形界面(graphical.target)
[root@centos7 ~ 14:01:50]# systemctl isolate graphical.target
设置系统启动默认 target:
bash
# 查看当前默认 target
[root@centos7 ~ 14:02:10]# systemctl get-default
graphical.target
# 设置默认 target 为 multi-user.target(文本界面)
[root@centos7 ~ 14:02:50]# systemctl set-default multi-user.target
# 重启系统验证配置
[root@centos7 ~ 14:03:01]# reboot
四、ROOT 密码重置
4.1重启系统,中断 GRUB2 菜单倒计时,选中第一个内核条目并按 e 编辑
4.2定位到 linux16 开头的行,行尾添加 rd.break(在 initramfs 移交控制权前中断),按 Ctrl+x 启动。
bash
# 1.系统进入 root shell,此时根文件系统(/sysroot)为只读挂载,重新挂载为读写:
bash switch_root:/# mount -o remount,rw /sysroot
# 2.切换根目录到 /sysroot(实际系统根目录):
bash switch_root:/# chroot /sysroot
# 3.设置新 root 密码(将 password 替换为自定义密码):
bash sh-4.2# echo password | passwd --stdin root
# 4.若启用 SELinux,需触发文件重新打标(否则密码修改可能失效):
bash sh-4.2# touch /.autorelabel
# 5.退出 chroot 环境并继续启动:
bash sh-4.2# exit switch_root:/# exit
# 6.系统重启后,使用新密码登录 root 验证。
五、/etc/fstab 配置故障排查
/etc/fstab 用于定义文件系统开机自动挂载规则,配置错误会导致系统启动异常,以下为常见故障及修复方法。
5.1环境准备(模拟故障前的正常配置)
bash
# 为 /dev/sdb 创建 MBR 分区表
[root@centos7 ~ 14:03:20]# parted /dev/sdb mklabel msdos
# 创建 10GB 主分区
[root@centos7 ~ 14:03:41]# parted /dev/sdb unit MiB mkpart primary 1 10241
# 格式化为 XFS 文件系统
[root@centos7 ~ 14:03:44]# mkfs.xfs /dev/sdb1
# 创建挂载点
[root@centos7 ~ 14:03:52]# mkdir /data01
# 添加 fstab 持久化挂载规则
[root@centos7 ~ 14:04:01]# echo '/dev/sdb1 /data01 xfs defaults 0 0' >> /etc/fstab
# 挂载并验证
[root@centos7 ~ 14:04:16]# mount -a
[root@centos7 ~ 14:04:28]# df -h /data01
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 10G 33M 10G 1% /data01
5.2 故障 2:设备名称错误/设备不存在
模拟故障:修改 fstab 中设备名(如 sdb1 → sdb2):
bash
[root@centos7 ~ 14:05:07]# vim /etc/fstab
/dev/sdb2 /data01 xfs defaults 0 0
**故障现象:**启动时无法找到 /dev/sdb2,超时(90秒)后进入 emergency 模式。
**修复方法:**在 emergency 模式下,编辑 /etc/fstab 修正设备名或注释错误条目,输入 exit 继续启动。