Linux 的救援模式和系统恢复、SysVinit、systemd、运行级别
文章目录
- 一、Linux 服务是什么
- 1.1 服务的主要特征
- 1.2 常见服务类型
- 二、CentOS 6:SysVinit 服务管理
- 2.1 service 命令
- 2.2 SysVinit 的启动思路
- 三、CentOS 7/8/9:systemd 服务管理
- 3.1 systemctl 常用命令
- 3.2 firewalld 服务操作示例
- 3.3 start 和 enable 的区别
- 3.4 enabled、disabled 和 static
- 3.5 查看服务清单
- 四、运行级别与 systemd target
- 4.1 CentOS 6 传统运行级别
- 4.2 systemd target 对应关系
- 4.3 查看和修改默认 target
- 4.4 临时切换 target
- 五、Linux 启动流程
- 5.1 从固件到 systemd
- 5.2 启动问题排查命令
- 六、救援模式与系统恢复
- 6.1 哪些情况需要救援模式
- 6.2 普通单用户模式
- 6.3 使用 rd.break 进入救援环境
- 6.4 使用安装介质救援
- 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 命令
基本格式:
service<服务名><操作>常见操作:
| 命令 | 作用 |
|---|---|
service httpd start | 启动 httpd |
service httpd stop | 停止 httpd |
service httpd restart | 重启 httpd |
service httpd reload | 重新加载配置,是否支持取决于服务脚本 |
service httpd status | 查看 httpd 状态 |
管理其他服务时替换服务名:
servicemysqld stopservicenetwork restartservicentpd reloadserviceiptables status2.2 SysVinit 的启动思路
SysVinit 依赖运行级别和启动脚本链接,通常按编号顺序启动或停止服务。
常见目录包括:
/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 通常会自动补全:
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 服务操作示例
查看防火墙服务:
systemctl status firewalld.service停止服务:
systemctl stop firewalld.service启动服务:
systemctl start firewalld.service重启服务:
systemctl restart firewalld.service取消开机自启:
systemctl disable firewalld.service设置开机自启:
systemctlenablefirewalld.service操作完成后分别检查“当前状态”和“开机状态”:
systemctl is-active firewalld systemctl is-enabled firewalld3.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 文件状态:
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:
systemctl list-units--type=service查看全部服务 Unit 文件及启用状态:
systemctl list-unit-files--type=service查看运行失败的 Unit:
systemctl--failed查看某个服务的依赖关系:
systemctl list-dependencies nginx查看 Unit 文件内容及覆盖配置:
systemctlcatnginx四、运行级别与 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 时代那种实质区别。
查看兼容链接:
ls-l/usr/lib/systemd/system/runlevel*.target典型关系:
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.target4.3 查看和修改默认 target
查看默认启动目标:
systemctl get-default服务器常见输出:
multi-user.target设置图形界面为默认目标:
systemctl set-default graphical.target设置文本多用户模式:
systemctl set-default multi-user.target这会影响后续启动。生产环境修改前要确认图形组件是否安装、远程连接是否可靠,以及是否有控制台或回滚方式。
4.4 临时切换 target
临时切换到多用户文本目标:
systemctl isolate multi-user.target临时切换到图形目标:
systemctl isolate graphical.targetisolate会停止当前目标不需要的 Unit,并启动新目标需要的 Unit,可能中断网络、图形会话或业务服务。远程服务器上执行前必须确认影响。
查看某个 target 依赖哪些 Unit:
systemctl list-dependencies multi-user.target五、Linux 启动流程
5.1 从固件到 systemd
现代 Linux 的典型启动流程可以概括为:
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 启动问题排查命令
查看本次启动的错误日志:
journalctl-b-perr查看上一次启动日志:
journalctl-b-1查看启动耗时:
systemd-analyze systemd-analyze blame systemd-analyze critical-chain查看失败 Unit:
systemctl--failed查看内核消息:
dmesg-T|less六、救援模式与系统恢复
6.1 哪些情况需要救援模式
救援模式用于系统无法正常启动或无法正常登录时的维护,例如:
- 忘记管理员密码。
/etc/fstab配置错误导致启动失败。- 文件系统损坏,需要离线检查或修复。
- 关键配置文件修改错误。
- GRUB、内核或 initramfs 出现问题。
- 普通 target 无法进入,需要最小维护环境。
救援模式权限很高,只能用于本人或已经明确授权的系统。操作前应确认磁盘、根分区、挂载路径和备份情况。
6.2 普通单用户模式
资料中的 CentOS 7 实验使用 GRUB 编辑内核参数进入无密码 Root Shell。
操作步骤
- 重启系统,在 GRUB 内核菜单中选择要启动的内核,不要直接回车。
- 按
e编辑启动项。 - 找到以
linux16、linuxefi或linux开头的内核参数行。 - 将根文件系统参数中的
ro修改为rw。 - 在该行末尾添加:
init=/bin/bash- 按
Ctrl+X启动,进入 Root Shell。 - 修复配置或使用
passwd重置密码。 - 处理 SELinux 标签后重启并验证。
不同发行版和内核版本的 GRUB 参数名称可能不同,操作前应先拍照或记录原参数,避免误删其他启动参数。
6.3 使用 rd.break 进入救援环境
在许多使用 dracut 的 RHEL/CentOS 系统中,rd.break是更常见的恢复方式。
- 在 GRUB 菜单按
e。 - 找到内核参数行,在末尾追加:
rd.break- 按
Ctrl+X启动,进入 initramfs 的维护 Shell。 - 把原系统根目录重新挂载为可写:
mount-oremount,rw /sysroot- 切换到原系统根目录:
chroot/sysroot- 重置密码:
passwdroot- 如果 SELinux 处于 Enforcing,创建重新标记文件:
touch/.autorelabel- 退出 chroot 和救援 Shell:
exitexit系统随后会重启或继续启动。重新标记文件可能需要较长时间,不要中途强制断电。
6.4 使用安装介质救援
资料中的流程使用 CentOS 安装光盘或 ISO:
- 确认虚拟机或物理服务器可以从安装介质启动。
- 进入 Boot Menu,选择 CD-ROM、ISO 或 USB 启动。
- 选择
Troubleshooting。 - 选择
Rescue a CentOS system。 - 按提示让救援环境查找并挂载原系统。
CentOS 7 常见挂载点:
/mnt/sysimage切换到原系统:
chroot/mnt/sysimage某些较新系统或其他救援环境可能使用/mnt/sysroot,不要机械照抄路径,应先执行:
lsblk-fmountls/mnt确认原系统挂载位置后,再执行修复操作。
常见维护动作:
passwdrootvi/etc/fstab grub2-mkconfig-o/boot/grub2/grub.cfg如果/boot或 EFI 分区是独立分区,要先确认它们已经正确挂载。重建 GRUB 的命令和输出路径也会随 BIOS/UEFI、发行版版本变化,不能只凭一条命令覆盖所有环境。
6.5 密码恢复与 SELinux 注意事项
资料中提到删除/etc/passwd中 root 用户密码字段的x。这种做法可能形成空密码或破坏 Shadow 密码机制,安全风险很高,不建议作为常规密码恢复方案。
更推荐:
passwdroot/etc/passwd中的x表示实际密码哈希保存在/etc/shadow,不是“密码内容本身”。不要为了重置密码随意删除它。
SELinux 也不需要为了重置密码而永久关闭。更稳妥的处理方式是:
touch/.autorelabel让系统下次启动时重新标记文件安全上下文。不同版本的恢复流程可能还需要根据发行版文档使用restorecon或其他方式。
七、服务故障排查顺序
服务启动失败时,可以按下面的顺序排查:
1. 查看当前状态
systemctl status nginx --no-pager-l重点关注:
Loaded:Unit 文件是否加载,是否 enabled。Active:当前是 active、inactive 还是 failed。Main PID:主进程 PID。- 最近几行日志和退出码。
2. 查看服务日志
journalctl-unginx-bjournalctl-unginx-n100--no-pager3. 检查配置语法
不同服务使用自己的检查命令,例如:
nginx-tsshd-t配置语法没通过时,不要反复重启服务。
4. 检查端口和进程
ss-lntupps-ef|grep'[n]ginx'确认是否存在端口冲突、旧进程残留或进程启动后立即退出。
5. 检查依赖和资源
systemctl list-dependencies nginxdf-hdf-ifree-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 状态,不能只确认密码可以使用。