Linux救援模式和系统恢复

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 常见服务类型

类型 常见服务 作用
网络与远程访问 sshdNetworkManager SSH 登录、网络连接管理
Web 服务 nginxhttpd Web 服务器、反向代理
数据库 mysqldpostgresql 数据存储和查询
日志 rsyslogsystemd-journald 收集和保存系统日志
计划任务 crondatd 周期任务和一次性任务
容器 dockercontainerd 容器运行环境
设备与通信 udevdbus 设备管理、进程间通信

二、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 取消开机自启并立即停止

restartreload 不能混为一谈:

  • 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 关机
1ssingle rescue.target 单用户救援模式
234 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
-> 按依赖关系启动服务
-> 提供登录终端或图形界面

各阶段作用:

  1. BIOS/UEFI 完成硬件初始化并选择启动设备。
  2. GRUB2 展示内核菜单并加载指定内核与 initramfs。
  3. Kernel 初始化 CPU、内存、驱动和设备。
  4. initramfs 提供真正根文件系统挂载前所需的临时环境和驱动。
  5. 根文件系统挂载后启动 systemd,systemd 成为 PID 1。
  6. 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。

操作步骤
  1. 重启系统,在 GRUB 内核菜单中选择要启动的内核,不要直接回车。
  2. e 编辑启动项。
  3. 找到以 linux16linuxefilinux 开头的内核参数行。
  4. 将根文件系统参数中的 ro 修改为 rw
  5. 在该行末尾添加:
text 复制代码
init=/bin/bash
  1. Ctrl+X 启动,进入 Root Shell。
  2. 修复配置或使用 passwd 重置密码。
  3. 处理 SELinux 标签后重启并验证。

不同发行版和内核版本的 GRUB 参数名称可能不同,操作前应先拍照或记录原参数,避免误删其他启动参数。

6.3 使用 rd.break 进入救援环境

在许多使用 dracut 的 RHEL/CentOS 系统中,rd.break 是更常见的恢复方式。

  1. 在 GRUB 菜单按 e
  2. 找到内核参数行,在末尾追加:
text 复制代码
rd.break
  1. Ctrl+X 启动,进入 initramfs 的维护 Shell。
  2. 把原系统根目录重新挂载为可写:
bash 复制代码
mount -o remount,rw /sysroot
  1. 切换到原系统根目录:
bash 复制代码
chroot /sysroot
  1. 重置密码:
bash 复制代码
passwd root
  1. 如果 SELinux 处于 Enforcing,创建重新标记文件:
bash 复制代码
touch /.autorelabel
  1. 退出 chroot 和救援 Shell:
bash 复制代码
exit
exit

系统随后会重启或继续启动。重新标记文件可能需要较长时间,不要中途强制断电。

6.4 使用安装介质救援

资料中的流程使用 CentOS 安装光盘或 ISO:

  1. 确认虚拟机或物理服务器可以从安装介质启动。
  2. 进入 Boot Menu,选择 CD-ROM、ISO 或 USB 启动。
  3. 选择 Troubleshooting
  4. 选择 Rescue a CentOS system
  5. 按提示让救援环境查找并挂载原系统。

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 还是具体服务阶段。救援模式的核心思路不是"绕过密码",而是进入一个可维护环境,正确挂载原系统,再对配置、文件系统、引导或账号进行受控修复。

九、注意事项

  1. systemctl start 不等于开机自启,systemctl enable 也不等于服务已经立即运行;需要两者同时生效时使用 enable --now

  2. restart 会重新启动进程,可能造成业务中断;服务支持平滑加载时,配置变更优先评估 reload

  3. static Unit 通常不能直接 enable,但可能被其他 Unit 依赖并正常启动;不要简单理解为"无效服务"。

  4. masked 会阻止 Unit 被手动或依赖启动,排查"服务怎么都启动不了"时要检查是否被 mask。

  5. 生产环境不要随意执行 systemctl isolate 或修改默认 target,远程连接、图形会话和业务服务可能被停止。

  6. 修改服务配置后先运行对应的语法检查命令,再执行 reload 或 restart,避免把可用服务直接重启失败。

  7. 救援模式拥有最高系统权限,只能操作本人或已经明确授权的设备,并提前确认根分区、挂载路径和备份情况。

  8. 不建议通过删除 /etc/passwd 中的 x 来恢复 root 密码。应使用 passwd,并正确处理 /etc/shadow 与 SELinux 标签。

  9. CentOS 7、8、9 以及其他发行版的 GRUB 参数、根目录挂载点和救援菜单可能不同,操作前先确认当前版本。

  10. 修复完成后要重启并验证:默认 target、关键服务、网络、挂载、账号登录和 SELinux 状态,不能只确认密码可以使用。

相关推荐
RisunJan1 小时前
Linux命令-semanage(SELinux 策略管理)
linux·运维·服务器
流浪0011 小时前
Linux系统篇 21:文件(五)——动静态库、ELF 底层原理全解
linux·运维·服务器
snow@li1 小时前
Spring Boot:项目服务器完整部署教程(零基础可直接实操)
服务器·spring boot·后端
李昊哲小课2 小时前
咖啡工坊 · FastAPI 22 章教程合集
服务器·人工智能·python·fastapi
十八岁牛爷爷2 小时前
Linux 进程与进程状态・三层级深度解析
linux·运维·服务器
AOwhisky2 小时前
Python 学习笔记(第五期)——组合数据类型:列表、元组、集合与字典精讲——核心知识点自测与详解
开发语言·笔记·python·学习·云计算
不会就选b2 小时前
linux之进程管理(二)--替换
linux·运维·服务器
倔强的石头1062 小时前
【Linux指南】动静态库系列(二):从源码复用到目标文件复用:为什么需要把 .o 打包成库
linux·运维·服务器