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 复盘原因。