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 单元启动阶段。先分清这三类,再动手。

RHEL 启动链路断点定位与修复入口 固件 BIOS / UEFI GRUB2 grub.cfg / 引导菜单 内核 + initramfs vmlinuz / initrd.img 根文件系统 挂载 / 检查 systemd default.target 断点①:GRUB2 阶段 现象:grub> 或 grub rescue> 原因:MBR/EFI 分区损坏、 grub.cfg 丢失、磁盘顺序变化 修复:grub2-install + grub2-mkconfig 或 chroot 后重建引导 断点②:initramfs 阶段 现象:dracut:/# 提示符 原因:根设备名变化、LVM/ 加密卷未激活、驱动缺失 修复:dracut -f 重建 initramfs 或修正 rd.lvm.lv 等内核参数 断点③:根文件系统/systemd 现象:emergency mode / rescue 原因:fsck 失败、fstab 错误、 根分区损坏、单元启动失败 修复:xfs_repair / e2fsck 修正 fstab、屏蔽故障单元 统一修复入口:救援模式(rescue)与紧急模式(emergency) rescue:挂载根文件系统,加载基础服务,适合修复配置与引导 emergency:仅挂载根为只读,不加载服务,适合修复文件系统与关键单元 进入方式:GRUB 菜单按 e 编辑内核行,末尾追加 rd.break 或 systemd.unit=rescue.target rd.break 停在 initramfs 的 switch_root 之前,可先修复根文件系统再继续启动

二、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。处理流程如下:

  1. 在 GRUB 菜单按 e,在 linux 行末尾追加 rd.break,按 Ctrl+X 启动。
  2. 进入 switch_root:/# 后,根仍为 initramfs,真实根在 /sysroot,且未挂载。
  3. 执行 xfs_repair -n /dev/mapper/rhel-root 先做只读检查,确认损坏范围。
  4. 确认后执行 xfs_repair /dev/mapper/rhel-root,等待修复完成。
  5. 输入 exit 继续启动,系统正常进入多用户目标。
  6. 登录后执行 dmesg | grep -i xfs 与 systemctl --failed 复核,确认无残留异常。

该流程的关键判断点是:rd.break 下根未挂载,修复工具可直接操作块设备;若已进入 emergency mode 且根为只读挂载,则需先 remount 为只读或从外部介质操作。修复完成后,建议检查 /etc/fstab 中是否使用了 UUID 而非设备名,避免磁盘顺序变化再次引发启动失败。

生产环境建议为关键服务器保留一份 /boot 与 grub.cfg 的备份,并记录根分区的 UUID 与 LVM 布局。启动故障的恢复速度,往往取决于这些信息是否随手可得。