20260410 系统启动原理

系统启动原理

一、系统启动过程

从接通电源到系统呈现登录提示符,需硬件初始化、固件引导、内核加载、系统初始化等多环节配合。

以下从宏观层面梳理 CentOS 7 完整启动流程:

  1. 计算机接通电源后,系统固件(UEFI 或传统 BIOS)首先执行开机自检(POST),检测 CPU、内存、硬盘等核心硬件是否正常。

    • 配置说明:启动早期按特定快捷键(如 F2)可进入固件配置界面,调整启动顺序、硬件参数等。
  2. 固件按配置的启动顺序搜索启动设备,读取磁盘主启动记录(MBR)中的引导加载器(CentOS 7 默认为 GRUB2),并将系统控制权移交 GRUB2。

    • 配置说明:通过 grub2-install 命令可将 GRUB2 安装为磁盘默认启动加载器。
  3. GRUB2 读取 /boot/grub2/grub.cfg 配置文件,显示操作系统选择菜单。

    • **配置说明:**不可直接编辑 grub.cfg,需通过修改 /etc/grub.d/ 目录下的脚本、/etc/default/grub 配置文件,再执行 grub2-mkconfig 命令生成新的 grub.cfg。
  4. 引导加载器根据选中的启动项,从磁盘加载内核(vmlinuz)和 initramfs 到内存,并将内核参数、initramfs 内存地址传递给内核。

    • initramfs 是临时内存文件系统,包含启动所需的硬件驱动、初始化脚本等,内核通过它完成硬件初始化。

    • 配置说明:通过 /etc/dracut.conf.d/ 目录、dracut 命令生成 initramfs,lsinitrd 命令可查看 initramfs 内容。

  5. initramfs 执行 /sbin/init(CentOS 7 中该文件为 systemd 的软链接),作为系统首个进程(PID 1)。

    • **配置说明:**可通过内核参数 init=command 指定自定义初始化程序。
  6. systemd 加载内核命令行指定的 target,或系统默认的 default.target(通常为文本/图形登录界面)。

    • **配置说明:**通过 systemctl 命令设置默认 target(如 systemctl set-default multi-user.target)。
  7. default.target 依赖 sysinit.target,该 target 完成系统基础初始化:读取 /etc/fstab 挂载文件系统、激活日志服务(systemd-journald)等。

    • **配置说明:**通过 /etc/fstab 配置文件设置文件系统开机自动挂载规则。
  8. default.target 激活所有配置为开机自启的 systemd 单元(如服务、定时器等)。

    • **配置说明:**通过 systemctl enable <服务名> 设置服务开机自启。
  9. 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 继续启动。

相关推荐
且从容.26 分钟前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道1 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
且从容.4 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落5 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨5 小时前
WSL2的安装与使用
linux·wsl
微小的鱼5 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng6 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮7 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
Linux-lucky18 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
禁默18 小时前
启元 Q1 二次开发实践:Ubuntu 部署与仿真验证,从 PrimeConsole 到 ROS 2 Humble + RViz
linux·运维·ubuntu