Linux 的救援模式和系统恢复、SysVinit、systemd、运行级别

文章目录
- [一、Linux 服务是什么](#一、Linux 服务是什么)
- [1.1 服务的主要特征](#1.1 服务的主要特征)
- [1.2 常见服务类型](#1.2 常见服务类型)
- [二、CentOS 6:SysVinit 服务管理](#二、CentOS 6:SysVinit 服务管理)
- [2.1 service 命令](#2.1 service 命令)
- [2.2 SysVinit 的启动思路](#2.2 SysVinit 的启动思路)
- [三、CentOS 7/8/9:systemd 服务管理](#三、CentOS 7/8/9:systemd 服务管理)
- [3.1 systemctl 常用命令](#3.1 systemctl 常用命令)
- [3.2 firewalld 服务操作示例](#3.2 firewalld 服务操作示例)
- [3.3 start 和 enable 的区别](#3.3 start 和 enable 的区别)
- [3.4 enabled、disabled 和 static](#3.4 enabled、disabled 和 static)
- [3.5 查看服务清单](#3.5 查看服务清单)
- [四、运行级别与 systemd target](#四、运行级别与 systemd target)
- [4.1 CentOS 6 传统运行级别](#4.1 CentOS 6 传统运行级别)
- [4.2 systemd target 对应关系](#4.2 systemd target 对应关系)
- [4.3 查看和修改默认 target](#4.3 查看和修改默认 target)
- [4.4 临时切换 target](#4.4 临时切换 target)
- [五、Linux 启动流程](#五、Linux 启动流程)
- [5.1 从固件到 systemd](#5.1 从固件到 systemd)
- [5.2 启动问题排查命令](#5.2 启动问题排查命令)
- 六、救援模式与系统恢复
- [6.1 哪些情况需要救援模式](#6.1 哪些情况需要救援模式)
- [6.2 普通单用户模式](#6.2 普通单用户模式)
- [6.3 使用 rd.break 进入救援环境](#6.3 使用 rd.break 进入救援环境)
- [6.4 使用安装介质救援](#6.4 使用安装介质救援)
- [6.5 密码恢复与 SELinux 注意事项](#6.5 密码恢复与 SELinux 注意事项)
- 七、服务故障排查顺序
- 八、复习检查点
- 总结
- 九、注意事项
一、Linux 服务是什么
服务(Service)通常是一个在后台持续运行的程序或进程。它可能在系统启动时自动加载,也可能按管理员操作或其他单元依赖被启动。
可以把服务理解成系统里的"后台工作组":用户不需要一直在终端前控制它,但它会持续监听请求、处理任务和维护系统功能。
1.1 服务的主要特征
- 后台运行:一般不直接占用交互终端。
- 持续存在:通常会长期运行,而不是完成一次操作就退出。
- 提供功能:通过端口、Socket、定时器、设备事件或进程间通信响应请求。
- 可被管理:可以启动、停止、重启、重新加载、查看状态和配置开机启动。
- 通常有日志:便于审计启动过程、请求处理和故障原因。
服务与普通后台进程的区别不在于"有没有界面",而在于是否被服务管理框架纳入统一生命周期管理。systemd 管理的服务通常有 Unit 文件、依赖关系、重启策略和日志入口。
1.2 常见服务类型
| 类型 | 常见服务 | 作用 |
|---|---|---|
| 网络与远程访问 | sshd、NetworkManager |
SSH 登录、网络连接管理 |
| Web 服务 | nginx、httpd |
Web 服务器、反向代理 |
| 数据库 | mysqld、postgresql |
数据存储和查询 |
| 日志 | rsyslog、systemd-journald |
收集和保存系统日志 |
| 计划任务 | crond、atd |
周期任务和一次性任务 |
| 容器 | docker、containerd |
容器运行环境 |
| 设备与通信 | udev、dbus |
设备管理、进程间通信 |
二、CentOS 6:SysVinit 服务管理
CentOS 6 及更早版本主要使用 SysVinit。服务通常通过 /etc/init.d/ 下的 Shell 脚本管理,再使用 service 命令调用对应脚本。
2.1 service 命令
基本格式:
bash
service <服务名> <操作>
常见操作:
| 命令 | 作用 |
|---|---|
service httpd start |
启动 httpd |
service httpd stop |
停止 httpd |
service httpd restart |
重启 httpd |
service httpd reload |
重新加载配置,是否支持取决于服务脚本 |
service httpd status |
查看 httpd 状态 |
管理其他服务时替换服务名:
bash
service mysqld stop
service network restart
service ntpd reload
service iptables status
2.2 SysVinit 的启动思路
SysVinit 依赖运行级别和启动脚本链接,通常按编号顺序启动或停止服务。
常见目录包括:
text
/etc/init.d/
/etc/rc.d/rc0.d/
/etc/rc.d/rc3.d/
/etc/rc.d/rc5.d/
以 S 开头的链接通常表示进入某个运行级别时启动,以 K 开头的链接通常表示停止。编号决定执行顺序。
这种方式直观,但服务依赖和并行启动能力有限,因此较新的发行版普遍使用 systemd。
三、CentOS 7/8/9:systemd 服务管理
systemd 使用 Unit 统一表示服务、Socket、挂载点、定时器、target 等资源。服务 Unit 常见后缀是 .service。
命令中省略 .service 时,systemd 通常会自动补全:
bash
systemctl status firewalld
systemctl status firewalld.service
这两种写法通常等价。
3.1 systemctl 常用命令
| 命令 | 作用 |
|---|---|
systemctl start nginx |
立即启动服务 |
systemctl stop nginx |
立即停止服务 |
systemctl restart nginx |
停止后重新启动 |
systemctl reload nginx |
让服务重新加载配置,要求服务支持 reload |
systemctl status nginx |
查看当前状态、主进程和最近日志 |
systemctl enable nginx |
设置开机自启 |
systemctl disable nginx |
取消开机自启 |
systemctl is-active nginx |
判断当前是否处于 active 状态 |
systemctl is-enabled nginx |
判断是否配置开机启动 |
systemctl enable --now nginx |
设置开机自启并立即启动 |
systemctl disable --now nginx |
取消开机自启并立即停止 |
restart 和 reload 不能混为一谈:
restart会重新启动进程,通常会产生短暂中断。reload尝试让原进程重新读取配置,是否支持取决于服务实现。
3.2 firewalld 服务操作示例
查看防火墙服务:
bash
systemctl status firewalld.service
停止服务:
bash
systemctl stop firewalld.service
启动服务:
bash
systemctl start firewalld.service
重启服务:
bash
systemctl restart firewalld.service
取消开机自启:
bash
systemctl disable firewalld.service
设置开机自启:
bash
systemctl enable firewalld.service
操作完成后分别检查"当前状态"和"开机状态":
bash
systemctl is-active firewalld
systemctl is-enabled firewalld
3.3 start 和 enable 的区别
这是服务管理中最常见的易错点。
| 命令 | 影响当前运行 | 影响下次开机 |
|---|---|---|
systemctl start service |
是,立即启动 | 否 |
systemctl stop service |
是,立即停止 | 否 |
systemctl enable service |
通常不立即启动 | 是,建立开机启动关系 |
systemctl disable service |
通常不立即停止 | 是,移除开机启动关系 |
systemctl enable --now service |
是 | 是 |
一句话记忆:start 管当前,enable 管下次开机。
3.4 enabled、disabled 和 static
使用下面的命令可以查看 Unit 文件状态:
bash
systemctl list-unit-files --type=service
常见状态:
| 状态 | 含义 |
|---|---|
enabled |
已建立开机启动关系,会被目标 Unit 拉起 |
disabled |
没有建立开机启动关系,但仍可以手动启动 |
static |
Unit 通常没有 [Install] 安装规则,不能直接 enable,但可以被依赖、Socket、DBus 或其他 Unit 拉起 |
masked |
被链接到 /dev/null,禁止启动,包括依赖触发 |
如果一个 Unit 是 static,不代表它"已经开机自启",也不代表它"完全不能运行"。它通常由其他 Unit 按依赖关系启动。
3.5 查看服务清单
查看当前已经加载的服务 Unit:
bash
systemctl list-units --type=service
查看全部服务 Unit 文件及启用状态:
bash
systemctl list-unit-files --type=service
查看运行失败的 Unit:
bash
systemctl --failed
查看某个服务的依赖关系:
bash
systemctl list-dependencies nginx
查看 Unit 文件内容及覆盖配置:
bash
systemctl cat nginx
四、运行级别与 systemd target

4.1 CentOS 6 传统运行级别
| 运行级别 | 含义 | 常见场景 |
|---|---|---|
0 |
关机 | 系统停止 |
1 |
单用户模式 | 系统维护、密码恢复 |
2 |
多用户模式,传统定义中不含网络 | 实际很少使用 |
3 |
完整多用户文本模式 | 服务器常见运行状态 |
4 |
保留或自定义 | 很少使用 |
5 |
图形界面模式 | 桌面系统 |
6 |
重启 | 系统重新启动 |
运行级别表示系统希望进入的整体状态,而不是某一个单独服务。
4.2 systemd target 对应关系
| 传统运行级别 | systemd Target | 含义 |
|---|---|---|
0 |
poweroff.target |
关机 |
1、s、single |
rescue.target |
单用户救援模式 |
2、3、4 |
multi-user.target |
多用户文本模式 |
5 |
graphical.target |
图形界面模式 |
6 |
reboot.target |
重启 |
emergency |
emergency.target |
最简紧急模式 |
systemd 中传统运行级别 2/3/4 通常都映射到 multi-user.target,没有 SysVinit 时代那种实质区别。
查看兼容链接:
bash
ls -l /usr/lib/systemd/system/runlevel*.target
典型关系:
text
runlevel0.target -> poweroff.target
runlevel1.target -> rescue.target
runlevel2.target -> multi-user.target
runlevel3.target -> multi-user.target
runlevel4.target -> multi-user.target
runlevel5.target -> graphical.target
runlevel6.target -> reboot.target
4.3 查看和修改默认 target
查看默认启动目标:
bash
systemctl get-default
服务器常见输出:
text
multi-user.target
设置图形界面为默认目标:
bash
systemctl set-default graphical.target
设置文本多用户模式:
bash
systemctl set-default multi-user.target
这会影响后续启动。生产环境修改前要确认图形组件是否安装、远程连接是否可靠,以及是否有控制台或回滚方式。
4.4 临时切换 target
临时切换到多用户文本目标:
bash
systemctl isolate multi-user.target
临时切换到图形目标:
bash
systemctl isolate graphical.target
isolate 会停止当前目标不需要的 Unit,并启动新目标需要的 Unit,可能中断网络、图形会话或业务服务。远程服务器上执行前必须确认影响。
查看某个 target 依赖哪些 Unit:
bash
systemctl list-dependencies multi-user.target
五、Linux 启动流程
5.1 从固件到 systemd
现代 Linux 的典型启动流程可以概括为:
text
BIOS / UEFI
-> 引导设备和启动项
-> GRUB2
-> 加载 Linux Kernel 和 initramfs
-> 内核初始化硬件并挂载临时根文件系统
-> 启动 systemd(PID 1)
-> systemd 进入默认 target
-> 按依赖关系启动服务
-> 提供登录终端或图形界面
各阶段作用:
- BIOS/UEFI 完成硬件初始化并选择启动设备。
- GRUB2 展示内核菜单并加载指定内核与 initramfs。
- Kernel 初始化 CPU、内存、驱动和设备。
- initramfs 提供真正根文件系统挂载前所需的临时环境和驱动。
- 根文件系统挂载后启动 systemd,systemd 成为 PID 1。
- systemd 读取默认 target,按依赖关系启动服务和登录环境。
理解启动流程后,故障位置更容易判断:
- 看不到 GRUB:检查固件、磁盘和引导记录。
- 内核启动报错:检查内核、initramfs、驱动和内核参数。
- 进入 emergency/rescue:检查文件系统、挂载、
fstab和关键配置。 - 系统能登录但服务没起来:检查 systemd Unit、依赖和服务日志。
5.2 启动问题排查命令
查看本次启动的错误日志:
bash
journalctl -b -p err
查看上一次启动日志:
bash
journalctl -b -1
查看启动耗时:
bash
systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain
查看失败 Unit:
bash
systemctl --failed
查看内核消息:
bash
dmesg -T | less
六、救援模式与系统恢复

6.1 哪些情况需要救援模式
救援模式用于系统无法正常启动或无法正常登录时的维护,例如:
- 忘记管理员密码。
/etc/fstab配置错误导致启动失败。- 文件系统损坏,需要离线检查或修复。
- 关键配置文件修改错误。
- GRUB、内核或 initramfs 出现问题。
- 普通 target 无法进入,需要最小维护环境。
救援模式权限很高,只能用于本人或已经明确授权的系统。操作前应确认磁盘、根分区、挂载路径和备份情况。
6.2 普通单用户模式
资料中的 CentOS 7 实验使用 GRUB 编辑内核参数进入无密码 Root Shell。
操作步骤
- 重启系统,在 GRUB 内核菜单中选择要启动的内核,不要直接回车。
- 按
e编辑启动项。 - 找到以
linux16、linuxefi或linux开头的内核参数行。 - 将根文件系统参数中的
ro修改为rw。 - 在该行末尾添加:
text
init=/bin/bash
- 按
Ctrl+X启动,进入 Root Shell。 - 修复配置或使用
passwd重置密码。 - 处理 SELinux 标签后重启并验证。
不同发行版和内核版本的 GRUB 参数名称可能不同,操作前应先拍照或记录原参数,避免误删其他启动参数。
6.3 使用 rd.break 进入救援环境
在许多使用 dracut 的 RHEL/CentOS 系统中,rd.break 是更常见的恢复方式。
- 在 GRUB 菜单按
e。 - 找到内核参数行,在末尾追加:
text
rd.break
- 按
Ctrl+X启动,进入 initramfs 的维护 Shell。 - 把原系统根目录重新挂载为可写:
bash
mount -o remount,rw /sysroot
- 切换到原系统根目录:
bash
chroot /sysroot
- 重置密码:
bash
passwd root
- 如果 SELinux 处于 Enforcing,创建重新标记文件:
bash
touch /.autorelabel
- 退出 chroot 和救援 Shell:
bash
exit
exit
系统随后会重启或继续启动。重新标记文件可能需要较长时间,不要中途强制断电。
6.4 使用安装介质救援
资料中的流程使用 CentOS 安装光盘或 ISO:
- 确认虚拟机或物理服务器可以从安装介质启动。
- 进入 Boot Menu,选择 CD-ROM、ISO 或 USB 启动。
- 选择
Troubleshooting。 - 选择
Rescue a CentOS system。 - 按提示让救援环境查找并挂载原系统。
CentOS 7 常见挂载点:
text
/mnt/sysimage
切换到原系统:
bash
chroot /mnt/sysimage
某些较新系统或其他救援环境可能使用 /mnt/sysroot,不要机械照抄路径,应先执行:
bash
lsblk -f
mount
ls /mnt
确认原系统挂载位置后,再执行修复操作。
常见维护动作:
bash
passwd root
vi /etc/fstab
grub2-mkconfig -o /boot/grub2/grub.cfg
如果 /boot 或 EFI 分区是独立分区,要先确认它们已经正确挂载。重建 GRUB 的命令和输出路径也会随 BIOS/UEFI、发行版版本变化,不能只凭一条命令覆盖所有环境。
6.5 密码恢复与 SELinux 注意事项
资料中提到删除 /etc/passwd 中 root 用户密码字段的 x。这种做法可能形成空密码或破坏 Shadow 密码机制,安全风险很高,不建议作为常规密码恢复方案。
更推荐:
bash
passwd root
/etc/passwd 中的 x 表示实际密码哈希保存在 /etc/shadow,不是"密码内容本身"。不要为了重置密码随意删除它。
SELinux 也不需要为了重置密码而永久关闭。更稳妥的处理方式是:
bash
touch /.autorelabel
让系统下次启动时重新标记文件安全上下文。不同版本的恢复流程可能还需要根据发行版文档使用 restorecon 或其他方式。
七、服务故障排查顺序
服务启动失败时,可以按下面的顺序排查:
1. 查看当前状态
bash
systemctl status nginx --no-pager -l
重点关注:
Loaded:Unit 文件是否加载,是否 enabled。Active:当前是 active、inactive 还是 failed。Main PID:主进程 PID。- 最近几行日志和退出码。
2. 查看服务日志
bash
journalctl -u nginx -b
journalctl -u nginx -n 100 --no-pager
3. 检查配置语法
不同服务使用自己的检查命令,例如:
bash
nginx -t
sshd -t
配置语法没通过时,不要反复重启服务。
4. 检查端口和进程
bash
ss -lntup
ps -ef | grep '[n]ginx'
确认是否存在端口冲突、旧进程残留或进程启动后立即退出。
5. 检查依赖和资源
bash
systemctl list-dependencies nginx
df -h
df -i
free -h
磁盘空间、inode、内存、挂载和依赖服务都可能导致启动失败。
6. 再决定 restart、reload 或修复配置
- 仅配置变化且服务支持:优先
reload。 - 进程状态异常或必须重新初始化:使用
restart。 - Unit 或依赖错误:先修复配置,再启动。
总结
CentOS 服务管理经历了从 SysVinit 到 systemd 的演进。SysVinit 主要通过 service 服务名 操作 调用启动脚本;systemd 使用 systemctl 统一管理服务及其依赖、开机启动和运行状态。
服务管理中必须分清两组概念:start/stop 影响当前运行,enable/disable 影响开机启动;运行级别描述系统整体状态,systemd 使用 target 表达这些目标状态。
当系统无法正常启动时,应先判断故障发生在引导、内核、文件系统、systemd 还是具体服务阶段。救援模式的核心思路不是"绕过密码",而是进入一个可维护环境,正确挂载原系统,再对配置、文件系统、引导或账号进行受控修复。
九、注意事项
-
systemctl start不等于开机自启,systemctl enable也不等于服务已经立即运行;需要两者同时生效时使用enable --now。 -
restart会重新启动进程,可能造成业务中断;服务支持平滑加载时,配置变更优先评估reload。 -
staticUnit 通常不能直接 enable,但可能被其他 Unit 依赖并正常启动;不要简单理解为"无效服务"。 -
masked会阻止 Unit 被手动或依赖启动,排查"服务怎么都启动不了"时要检查是否被 mask。 -
生产环境不要随意执行
systemctl isolate或修改默认 target,远程连接、图形会话和业务服务可能被停止。 -
修改服务配置后先运行对应的语法检查命令,再执行 reload 或 restart,避免把可用服务直接重启失败。
-
救援模式拥有最高系统权限,只能操作本人或已经明确授权的设备,并提前确认根分区、挂载路径和备份情况。
-
不建议通过删除
/etc/passwd中的x来恢复 root 密码。应使用passwd,并正确处理/etc/shadow与 SELinux 标签。 -
CentOS 7、8、9 以及其他发行版的 GRUB 参数、根目录挂载点和救援菜单可能不同,操作前先确认当前版本。
-
修复完成后要重启并验证:默认 target、关键服务、网络、挂载、账号登录和 SELinux 状态,不能只确认密码可以使用。