4. 救援模式(Rescue Mode):系统崩溃时的最后防线

说实话,很多运维同行容易把救援模式和单用户模式搞混。我刚开始带团队那会儿,就有小伙子半夜打电话说「进单用户修不了文件系统」。嗯,这里要讲清楚——这两个模式,本质上就不是干同一件事的。

4.1 救援模式 vs 单用户模式:到底差在哪?

单用户模式,说白了就是系统还能启动,只是不加载服务、不启动网络。你进去修修密码、改改配置,挺方便。但问题是——它依赖本机的系统文件。如果 /sbin/init 坏了,或者 /lib 里的库文件丢了,单用户模式照样起不来。

救援模式就不一样了。它用的是光盘、U盘或者 ISO 文件里的最小系统。你想想看,就算硬盘上的系统烂成一锅粥,只要硬件没坏,救援模式就能启动。我遇到过一台机器,根文件系统的超级块都坏了,单用户根本进不去,就是靠救援模式救回来的。

核心区别一句话总结:
单用户模式 = 用你硬盘上的系统,只启动最小进程
救援模式 = 用外部介质上的系统,把你硬盘当数据盘挂载
对比项 单用户模式 救援模式
依赖本地系统 是 否
网络支持 无 可配置
适用场景 密码重置、配置修复 内核损坏、文件系统崩溃、引导修复
启动介质 本地硬盘 光盘/U盘/ISO

4.2 通过 GRUB 进入救援模式

实际操作中,我习惯用 RHEL/CentOS 7 以上的系统举例。开机看到 GRUB 菜单时,按 e 键编辑启动项。找到以 linux16 或 linux 开头的那一行,在末尾加上:

rd.break enforcing=0

然后按 Ctrl+x 启动。系统会停在一个 shell 环境里,根文件系统是只读挂载在 /sysroot 下的。这时候:

# 重新挂载为可读写
mount -o remount,rw /sysroot

# 切换到真正的根环境
chroot /sysroot

嗯,这里要注意——rd.break 是 dracut 的一个参数,不是所有发行版都支持。如果是 Ubuntu 或者 Debian,我一般用 systemd.unit=rescue.target 或者直接选「Advanced options」里的救援模式。

我曾经踩过的坑:
有一次在 GRUB 里加了 rd.break,结果忘了加 enforcing=0。SELinux 在救援模式下还开着,chroot 进去改完密码,重启后 SELinux 上下文全乱了。后来我养成了习惯——救援模式下先关 SELinux,修完再开。

4.3 救援模式下的网络配置

很多人觉得救援模式就是单机操作,不需要网络。其实不对。我遇到过需要从远程 NFS 服务器拉取备份的情况,没网络寸步难行。

救援模式下,网络默认是关闭的。手动开启的方法很简单:

# 查看网卡名称
ip link show

# 激活网卡(假设是 eth0)
ip link set eth0 up

# 配置 IP 地址
ip addr add 192.168.1.100/24 dev eth0

# 添加默认网关
ip route add default via 192.168.1.1

如果你需要 DNS 解析,直接写 /etc/resolv.conf:

nameserver 8.8.8.8
nameserver 114.114.114.114

我个人习惯在救援模式下用静态 IP,因为 DHCP 有时候在最小环境里跑不起来。你想想看,万一 DHCP 没拿到地址,你还得回头查日志,多耽误事。

小技巧:
如果救援环境里有 nmtui 或者 nano,直接用它们配网络更省事。没有的话,用 echo 写配置文件也行,但别指望 NetworkManager 能正常工作——救援模式下它大概率没启动。

4.4 挂载根文件系统

这是救援模式的核心操作。说白了,就是把硬盘上的根分区挂载到一个临时目录,然后 chroot 进去修。

先看看硬盘分区情况:

lsblk
fdisk -l /dev/sda

假设根分区是 /dev/sda3,挂载步骤:

# 创建挂载点
mkdir -p /mnt/sysroot

# 挂载根分区
mount /dev/sda3 /mnt/sysroot

# 挂载必要的虚拟文件系统
mount --bind /dev /mnt/sysroot/dev
mount --bind /proc /mnt/sysroot/proc
mount --bind /sys /mnt/sysroot/sys

# 如果有单独的 /boot 分区,也要挂上
mount /dev/sda1 /mnt/sysroot/boot

# 切换到修复环境
chroot /mnt/sysroot /bin/bash

为什么要 bind 挂载 /dev、/proc、/sys?因为 chroot 之后,很多命令依赖这些虚拟文件系统。不挂的话,你连 lsblk 都跑不了。

我个人的修复流程:
  1. 先挂根分区,检查 /etc/fstab 有没有写错
  2. 再挂 /boot,确认内核和 initramfs 还在
  3. 最后挂虚拟文件系统,chroot 进去跑 grub2-install 和 grub2-mkconfig
这个顺序我用了十年,基本没翻过车。
注意:
如果根文件系统是 LVM 或者做了软 RAID,挂载前要先激活卷组:
vgchange -ay
我曾经在客户现场忘了这步,对着 /dev/mapper/ 目录找了半天,最后发现卷组根本没激活。嗯,挺尴尬的。

挂载完成后,你就可以像操作本地系统一样修复了。改密码、重装内核、修复引导——都行。修完之后,记得退出 chroot,卸载所有挂载点,然后重启:

# 退出 chroot
exit

# 卸载挂载点(顺序要反着来)
umount /mnt/sysroot/boot
umount /mnt/sysroot/sys
umount /mnt/sysroot/proc
umount /mnt/sysroot/dev
umount /mnt/sysroot

# 重启
reboot

为什么要反着卸载?因为内核会跟踪挂载依赖。你先把根分区卸了,/dev 可能还在用,就会报 target is busy。按挂载的逆序来,最稳。

救援模式核心操作流程 1. 进入救援模式 GRUB + rd.break 2. 配置网络 ip addr / route 3. 挂载根文件系统 mount /dev/sda3 chroot chroot 后常见修复操作: 🔧 重置密码:passwd root 🔧 修复引导:grub2-install /dev/sda → grub2-mkconfig -o /boot/grub2/grub.cfg 🔧 重建 initramfs:dracut -f /boot/initramfs-$(uname -r).img $(uname -r) 🔧 修复 fstab:vim /etc/fstab(检查挂载项是否正确) 修完后记得 exit → umount -a → reboot

救援模式这东西,平时用不上,但真到用的时候,就是救命稻草。我建议你在测试环境里至少演练两遍——一遍用光盘,一遍用 GRUB 参数。真到生产环境出问题的时候,手不抖,心不慌。

最后说一句:
救援模式下所有操作都是内存级的,重启后不会保留。所以修完之后,一定要记得 sync 一下,确保数据写回磁盘。我见过有人修完直接拔电源,结果白忙活一场。

可可精品资料库