1.5.5 应急模式与救援启动流程

应急模式与救援启动用于系统无法进入正常多用户模式时进行修复。常见场景:根分区损坏、/etc/fstab 配置错误、引导项异常、服务依赖死锁、密码遗失或 SELinux 拦截启动。遵循“最小变更、先备份后修复、可回滚”。

原理草图(启动分支与修复路径)

文章图片

进入应急/救援模式(Systemd)
- 在 GRUB 菜单按 e 编辑启动项,在 linux 行末尾追加:
- systemd.unit=emergency.target
- 或 systemd.unit=rescue.target

示例:

# GRUB 编辑示例(linux 行末尾追加)
linux /vmlinuz-5.x.x root=/dev/mapper/vg-root ro \
  systemd.unit=emergency.target

# 启动后(应急模式根分区常为只读)
mount -o remount,rw /

密码遗失的修复流程(rd.break)

# 1) GRUB 编辑 linux 行追加
linux ... rd.break

# 2) 进入 initramfs 后
mount -o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel   # 触发 SELinux 重标记
exit
reboot

预期效果:重启后可使用新密码登录,SELinux 自动重标记。

常用修复步骤与完整示例

1) 修复 /etc/fstab 导致启动失败

# 备份
cp -a /etc/fstab /etc/fstab.bak

# 编辑并注释错误挂载
vi /etc/fstab

# 验证(无输出为成功)
mount -a

# 查看失败挂载
systemctl list-units --failed

2) 修复 GRUB 配置

# BIOS 模式
grub2-mkconfig -o /boot/grub2/grub.cfg

# UEFI 模式(根据发行版替换目录)
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

3) 修复文件系统(在救援或 Live 环境)

# 先确认分区未挂载
lsblk
umount /dev/sda2

# 文件系统修复
fsck -y /dev/sda2

# 重新挂载验证
mount /dev/sda2 /mnt

4) 处理服务依赖死锁

# 禁用或屏蔽可疑服务
systemctl disable myapp.service
systemctl mask myapp.service

# 进入正常模式后排查
systemctl list-dependencies myapp.service
journalctl -u myapp.service -b

5) SELinux 导致启动失败

# 临时引导参数禁用 SELinux
linux ... selinux=0

# 启动后进行重标记
touch /.autorelabel
reboot

救援系统流程(安装介质/Live CD)

# 1) 进入 Rescue 模式后自动发现系统
# 2) 挂载原系统并进入 chroot
chroot /mnt/sysimage

# 3) 修复配置或重建引导
vi /etc/fstab
grub2-mkconfig -o /boot/grub2/grub.cfg

# 4) 退出并重启
exit
reboot

数据保护与回滚

# 配置备份
cp -a /etc/fstab /etc/fstab.bak.$(date +%F)

# LVM 快照回滚示例
lvcreate -s -n root_snap -L 2G /dev/vg/root
# 出现问题后回滚
lvconvert --merge /dev/vg/root_snap
reboot

排错检查清单(命令+解释)

# 查看本次启动失败日志
journalctl -xb

# 查看失败的单元
systemctl list-units --failed

# 检查关键挂载
mount -a

# 查看 SELinux 当前状态
getenforce

退出与恢复启动

# 切回默认目标或直接重启
systemctl default
# 或
reboot

练习
1) 模拟 /etc/fstab 错误挂载(使用不存在的 UUID),进入 rescue.target 修复并验证 mount -a 无报错。
2) 通过 rd.break 重置 root 密码并完成 SELinux 重标记。
3) 创建一个故障服务(ExecStart 退出码非 0),在应急模式禁用后正常启动,再用 journalctl -u 复盘原因。