
Linux 的救援模式和系统恢复、SysVinit、systemd、运行级别文章目录一、Linux 服务是什么1.1 服务的主要特征1.2 常见服务类型二、CentOS 6SysVinit 服务管理2.1 service 命令2.2 SysVinit 的启动思路三、CentOS 7/8/9systemd 服务管理3.1 systemctl 常用命令3.2 firewalld 服务操作示例3.3 start 和 enable 的区别3.4 enabled、disabled 和 static3.5 查看服务清单四、运行级别与 systemd target4.1 CentOS 6 传统运行级别4.2 systemd target 对应关系4.3 查看和修改默认 target4.4 临时切换 target五、Linux 启动流程5.1 从固件到 systemd5.2 启动问题排查命令六、救援模式与系统恢复6.1 哪些情况需要救援模式6.2 普通单用户模式6.3 使用 rd.break 进入救援环境6.4 使用安装介质救援6.5 密码恢复与 SELinux 注意事项七、服务故障排查顺序八、复习检查点总结九、注意事项一、Linux 服务是什么服务Service通常是一个在后台持续运行的程序或进程。它可能在系统启动时自动加载也可能按管理员操作或其他单元依赖被启动。可以把服务理解成系统里的“后台工作组”用户不需要一直在终端前控制它但它会持续监听请求、处理任务和维护系统功能。1.1 服务的主要特征后台运行一般不直接占用交互终端。持续存在通常会长期运行而不是完成一次操作就退出。提供功能通过端口、Socket、定时器、设备事件或进程间通信响应请求。可被管理可以启动、停止、重启、重新加载、查看状态和配置开机启动。通常有日志便于审计启动过程、请求处理和故障原因。服务与普通后台进程的区别不在于“有没有界面”而在于是否被服务管理框架纳入统一生命周期管理。systemd 管理的服务通常有 Unit 文件、依赖关系、重启策略和日志入口。1.2 常见服务类型类型常见服务作用网络与远程访问sshd、NetworkManagerSSH 登录、网络连接管理Web 服务nginx、httpdWeb 服务器、反向代理数据库mysqld、postgresql数据存储和查询日志rsyslog、systemd-journald收集和保存系统日志计划任务crond、atd周期任务和一次性任务容器docker、containerd容器运行环境设备与通信udev、dbus设备管理、进程间通信二、CentOS 6SysVinit 服务管理CentOS 6 及更早版本主要使用 SysVinit。服务通常通过/etc/init.d/下的 Shell 脚本管理再使用service命令调用对应脚本。2.1 service 命令基本格式service服务名操作常见操作命令作用service httpd start启动 httpdservice httpd stop停止 httpdservice httpd restart重启 httpdservice 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/9systemd 服务管理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让服务重新加载配置要求服务支持 reloadsystemctl 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--typeservice常见状态状态含义enabled已建立开机启动关系会被目标 Unit 拉起disabled没有建立开机启动关系但仍可以手动启动staticUnit 通常没有[Install]安装规则不能直接 enable但可以被依赖、Socket、DBus 或其他 Unit 拉起masked被链接到/dev/null禁止启动包括依赖触发如果一个 Unit 是static不代表它“已经开机自启”也不代表它“完全不能运行”。它通常由其他 Unit 按依赖关系启动。3.5 查看服务清单查看当前已经加载的服务 Unitsystemctl list-units--typeservice查看全部服务 Unit 文件及启用状态systemctl list-unit-files--typeservice查看运行失败的 Unitsystemctl--failed查看某个服务的依赖关系systemctl list-dependencies nginx查看 Unit 文件内容及覆盖配置systemctlcatnginx四、运行级别与 systemd target4.1 CentOS 6 传统运行级别运行级别含义常见场景0关机系统停止1单用户模式系统维护、密码恢复2多用户模式传统定义中不含网络实际很少使用3完整多用户文本模式服务器常见运行状态4保留或自定义很少使用5图形界面模式桌面系统6重启系统重新启动运行级别表示系统希望进入的整体状态而不是某一个单独服务。4.2 systemd target 对应关系传统运行级别systemd Target含义0poweroff.target关机1、s、singlerescue.target单用户救援模式2、3、4multi-user.target多用户文本模式5graphical.target图形界面模式6reboot.target重启emergencyemergency.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 依赖哪些 Unitsystemctl list-dependencies multi-user.target五、Linux 启动流程5.1 从固件到 systemd现代 Linux 的典型启动流程可以概括为BIOS / UEFI - 引导设备和启动项 - GRUB2 - 加载 Linux Kernel 和 initramfs - 内核初始化硬件并挂载临时根文件系统 - 启动 systemdPID 1 - systemd 进入默认 target - 按依赖关系启动服务 - 提供登录终端或图形界面各阶段作用BIOS/UEFI 完成硬件初始化并选择启动设备。GRUB2 展示内核菜单并加载指定内核与 initramfs。Kernel 初始化 CPU、内存、驱动和设备。initramfs 提供真正根文件系统挂载前所需的临时环境和驱动。根文件系统挂载后启动 systemdsystemd 成为 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查看失败 Unitsystemctl--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按CtrlX启动进入 Root Shell。修复配置或使用passwd重置密码。处理 SELinux 标签后重启并验证。不同发行版和内核版本的 GRUB 参数名称可能不同操作前应先拍照或记录原参数避免误删其他启动参数。6.3 使用 rd.break 进入救援环境在许多使用 dracut 的 RHEL/CentOS 系统中rd.break是更常见的恢复方式。在 GRUB 菜单按e。找到内核参数行在末尾追加rd.break按CtrlX启动进入 initramfs 的维护 Shell。把原系统根目录重新挂载为可写mount-oremount,rw /sysroot切换到原系统根目录chroot/sysroot重置密码passwdroot如果 SELinux 处于 Enforcing创建重新标记文件touch/.autorelabel退出 chroot 和救援 Shellexitexit系统随后会重启或继续启动。重新标记文件可能需要较长时间不要中途强制断电。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重点关注LoadedUnit 文件是否加载是否 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 状态不能只确认密码可以使用。