4. 系统启动失败诊断与恢复
RHEL 的启动链路可以概括为:固件(BIOS/UEFI)→ 引导加载程序 GRUB2 → 内核与 initramfs → systemd → 默认目标。任何一环断裂,系统都会停在某个可观察的“断点”上。诊断的关键不是盲目重装,而是先判断断点位置,再选择对应的修复入口。下面按启动顺序展开,并给出可复现的实战方法。
一、先定位断点:从屏幕现象反推故障层
启动失败时,屏幕上的最后一行信息往往就是断点。若卡在 GRUB 提示符或 grub rescue>,说明 GRUB2 自身或其配置分区不可读;若出现 dracut:/# 或 Warning: /dev/mapper/rhel-root does not exist,说明内核已加载但 initramfs 找不到根设备;若进入 emergency mode 或 rescue mode,说明内核与 initramfs 正常,问题在根文件系统挂载或 systemd 单元启动阶段。先分清这三类,再动手。
二、GRUB2 故障:从 grub rescue 到正常引导
GRUB2 故障最常见于磁盘克隆、分区调整或 MBR 被覆盖。若开机直接进入 grub rescue>,说明 GRUB 找不到自己的模块目录。此时可用 ls 列出所有分区,逐个探测:
grub rescue> ls
(hd0) (hd0,msdos1) (hd0,msdos2)
grub rescue> ls (hd0,msdos1)/grub2
grub rescue> set root=(hd0,msdos1)
grub rescue> set prefix=(hd0,msdos1)/grub2
grub rescue> insmod normal
grub rescue> normal
能进入系统后,必须立即重建引导,否则重启后故障复现。BIOS 环境执行 grub2-install /dev/sda,UEFI 环境执行 grub2-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=rhel,然后运行 grub2-mkconfig -o /boot/grub2/grub.cfg(UEFI 路径为 /boot/efi/EFI/rhel/grub.cfg)。若系统已无法进入,则需用安装介质进入救援模式,挂载根分区后 chroot /mnt/sysroot 再执行上述命令。
三、initramfs 故障:dracut 提示符下的自救
当内核打印完 Loading initial ramdisk 后停在 dracut:/#,说明 initramfs 已运行但找不到根设备。典型原因是根分区从 /dev/sda3 变成了 /dev/sdb3,或 LVM 卷组未激活。在 dracut 提示符下可先排查:
dracut:/# ls /dev/sd*
dracut:/# lvm vgscan
dracut:/# lvm vgchange -ay
dracut:/# cat /proc/cmdline
若确认根设备存在但参数写错,可在 GRUB 编辑界面修正 rd.lvm.lv=rhel/root 或 root=UUID=...。永久修复需进入系统后重建 initramfs:dracut -f --regenerate-all。若因新增存储驱动导致,可执行 dracut -f --add-drivers "mpt3sas" 后重启验证。
四、根文件系统损坏:fsck 与 xfs_repair
根文件系统损坏通常表现为 emergency mode,并提示 Failed to mount /sysroot 或 fsck failed。此时根分区多以只读方式挂载,需先确认文件系统类型:blkid /dev/mapper/rhel-root。ext4 使用 e2fsck -f /dev/mapper/rhel-root,XFS 使用 xfs_repair /dev/mapper/rhel-root。注意 XFS 若日志损坏严重,需加 -L 强制清空日志,但会丢失未提交数据,生产环境应先评估。
mount -o remount,ro / 或从救援模式操作,否则可能造成二次损坏。五、救援模式与紧急模式的选择
两者都通过 GRUB 内核行追加参数进入。systemd.unit=rescue.target 会挂载根文件系统并启动基础服务,适合修复 fstab、GRUB 配置、网络等;systemd.unit=emergency.target 仅以只读方式挂载根,不启动任何服务,适合修复文件系统和关键 systemd 单元。若根分区根本无法挂载,则使用 rd.break 停在 initramfs 阶段,此时根尚未切换,可对真实根分区执行 fsck。
六、实战闭环:一次根分区损坏的完整恢复
假设某 RHEL 9 服务器异常断电后无法启动,屏幕停在 emergency mode,提示 XFS (dm-0): Corruption detected。处理流程如下:
- 在 GRUB 菜单按
e,在linux行末尾追加rd.break,按Ctrl+X启动。 - 进入
switch_root:/#后,根仍为 initramfs,真实根在/sysroot,且未挂载。 - 执行
xfs_repair -n /dev/mapper/rhel-root先做只读检查,确认损坏范围。 - 确认后执行
xfs_repair /dev/mapper/rhel-root,等待修复完成。 - 输入
exit继续启动,系统正常进入多用户目标。 - 登录后执行
dmesg | grep -i xfs与systemctl --failed复核,确认无残留异常。
该流程的关键判断点是:rd.break 下根未挂载,修复工具可直接操作块设备;若已进入 emergency mode 且根为只读挂载,则需先 remount 为只读或从外部介质操作。修复完成后,建议检查 /etc/fstab 中是否使用了 UUID 而非设备名,避免磁盘顺序变化再次引发启动失败。
/boot 与 grub.cfg 的备份,并记录根分区的 UUID 与 LVM 布局。启动故障的恢复速度,往往取决于这些信息是否随手可得。