Linux救援模式是每个系统管理员必须掌握的救命稻草。当你的服务器突然罢工,或者开发环境莫名其妙崩溃时,这个神奇的工具能让你在不重装系统的前提下恢复工作。我经历过无数次凌晨三点的救火现场,救援模式帮我挽救了至少十几个重要项目。
救援模式本质上是一个微型Linux系统,它独立于你硬盘上的主系统运行。这个微型系统通常包含:
它的工作原理可以类比为汽车维修:当你的主引擎(主系统)无法启动时,维修人员会使用一个外接的诊断电脑(救援模式)来检测和修复问题。
注意:不同发行版的救援模式可能略有差异。RHEL/CentOS的救援模式功能最完善,而Debian/Ubuntu的则相对精简。
很多新手容易混淆救援模式(rescue mode)和紧急模式(emergency mode),这里我用实际案例说明它们的区别:
去年我们有个客户的数据库服务器因为/etc/fstab配置错误无法启动。我首先尝试救援模式:
但当文件系统严重损坏时,救援模式可能也无法自动挂载。这时就需要紧急模式:
以CentOS 8为例,以下是详细操作步骤:
bash复制# 使用dd命令制作启动U盘
dd if=CentOS-8-x86_64-1905-dvd1.iso of=/dev/sdb bs=4M status=progress
code复制Troubleshooting -> Rescue a CentOS system
chroot是救援模式的核心操作,它就像是在维修汽车时把整个发动机拆下来放在工作台上检修:
bash复制# 查看已挂载的分区
lsblk
# 手动挂载示例(当自动挂载失败时)
mount /dev/sda2 /mnt/sysimage
mount --bind /dev /mnt/sysimage/dev
mount --bind /proc /mnt/sysimage/proc
mount --bind /sys /mnt/sysimage/sys
# 进入chroot环境
chroot /mnt/sysimage
经验之谈:在chroot前,一定要确保挂载了/dev、/proc和/sys,否则很多命令会报奇怪的错误。
上周我刚处理过一个典型的GRUB损坏案例:
bash复制# 查看磁盘分区情况
fdisk -l
# 安装GRUB到MBR(传统BIOS)
grub2-install /dev/sda
# 重新生成GRUB配置
grub2-mkconfig -o /boot/grub2/grub.cfg
对于UEFI系统,还需要额外的步骤:
bash复制# 确保EFI分区已挂载
mount /dev/sda1 /boot/efi
# 安装GRUB到EFI分区
grub2-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
当遇到文件系统损坏时,操作顺序很关键:
bash复制# 1. 先卸载分区
umount /dev/sda1
# 2. 强制检查并修复
fsck -y /dev/sda1
# 3. 如果有坏块,尝试更彻底的修复
e2fsck -f -c -y /dev/sda1
忘记密码是最常见的问题之一:
bash复制# 方法1:直接修改密码
passwd root
# 方法2:如果passwd不可用,直接编辑shadow文件
vi /etc/shadow
# 删除root密码字段的内容(第二个冒号之间的部分)
在救援模式中配置网络可以方便地下载修复工具:
bash复制# 查看网卡名称
ip link
# 配置临时IP
ip addr add 192.168.1.100/24 dev eth0
ip link set eth0 up
# 设置临时网关
ip route add default via 192.168.1.1
# 测试网络
ping -c 3 google.com
在修复前先备份重要数据是明智之举:
bash复制# 挂载外部存储
mkdir /mnt/backup
mount /dev/sdb1 /mnt/backup
# 打包备份关键数据
tar -zcvf /mnt/backup/etc_backup.tar.gz /etc
tar -zcvf /mnt/backup/var_backup.tar.gz /var
当关键系统文件损坏时,可以这样恢复:
bash复制# 重新安装核心软件包
rpm -ivh --force /mnt/cdrom/Packages/bash-4.2.46-34.el7.x86_64.rpm
# 或者从其他正常机器复制
scp root@goodhost:/bin/bash /bin/
Ubuntu的处理方式有所不同:
bash复制# 进入恢复模式后手动挂载
mount /dev/sda1 /mnt
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
# chroot后重新安装GRUB
apt-get install --reinstall grub2
grub-install /dev/sda
update-grub
Arch Linux通常使用Live CD:
bash复制# 查找根分区
lsblk -f
# 挂载分区
mount /dev/sda2 /mnt
arch-chroot /mnt
# 重建GRUB
pacman -S grub
grub-install --target=i386-pc /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg
chroot后命令找不到
原因:没有挂载/dev、/proc和/sys
解决:确保执行了mount --bind
GRUB安装失败
原因:EFI分区未挂载或空间不足
解决:检查/boot/efi挂载点
文件系统修复后仍无法启动
原因:可能有硬件故障
解决:运行smartctl检查磁盘健康状态
bash复制mount -t tmpfs -o size=512M tmpfs /mnt/tmp
bash复制for dev in /dev/sda1 /dev/sda2; do
fsck -y $dev &
done
wait
bash复制cp /etc/fstab /etc/fstab.bak
bash复制mount -o ro /dev/sda1 /mnt
bash复制lsblk
blkid
掌握Linux救援模式就像拥有了系统管理的万能钥匙。我建议每个管理员都应该定期练习这些操作,最好在虚拟机中模拟各种故障场景。记住,在真正的危机发生前做好准备,总比在服务器宕机时手忙脚乱要好得多。