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 都跑不了。
- 先挂根分区,检查
/etc/fstab有没有写错 - 再挂
/boot,确认内核和 initramfs 还在 - 最后挂虚拟文件系统,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。按挂载的逆序来,最稳。
救援模式这东西,平时用不上,但真到用的时候,就是救命稻草。我建议你在测试环境里至少演练两遍——一遍用光盘,一遍用 GRUB 参数。真到生产环境出问题的时候,手不抖,心不慌。
救援模式下所有操作都是内存级的,重启后不会保留。所以修完之后,一定要记得
sync 一下,确保数据写回磁盘。我见过有人修完直接拔电源,结果白忙活一场。
可可精品资料库