启动故障
系统无法正常启动是最令人紧张的故障之一。本文覆盖 GRUB 引导修复、救援模式使用、fstab 错误排查、dracut 问题等常见启动故障的排查与修复方法。
启动过程概述
Section titled “启动过程概述”EL 系统的启动流程:
- 固件(BIOS/UEFI) — 硬件自检,加载引导程序
- GRUB2 — 读取配置,加载内核和 initramfs
- 内核 — 初始化硬件,挂载 initramfs
- dracut/initramfs — 加载驱动,挂载根文件系统
- systemd — 启动目标(target)和服务
在不同阶段出现的故障,表现和解决方法各不相同。
GRUB Rescue 模式
Section titled “GRUB Rescue 模式”当 GRUB 无法找到配置文件或模块时,会进入 grub rescue> 提示符。
屏幕显示:
error: no such partition.Entering rescue mode...grub rescue>grub rescue> ls这会显示类似 (hd0) (hd0,msdos1) (hd0,msdos2) 的输出。
grub rescue> ls (hd0,msdos1)/boot/grub2/grub rescue> ls (hd0,msdos2)/boot/grub2/找到包含 GRUB 文件的分区后:
grub rescue> set prefix=(hd0,msdos1)/boot/grub2grub rescue> set root=(hd0,msdos1)grub rescue> insmod normalgrub rescue> normal系统启动后,立即修复 GRUB 配置:
$ sudo grub2-install /dev/sda$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg$ sudo dnf reinstall grub2-efi-x64 shim-x64$ sudo grub2-mkconfig -o /boot/efi/EFI/$(. /etc/os-release && echo $ID)/grub.cfg紧急模式(Emergency Mode)
Section titled “紧急模式(Emergency Mode)”紧急模式在 systemd 无法完成基本初始化时触发,例如 /etc/fstab 中有无法挂载的文件系统。
屏幕显示:
Welcome to emergency mode! After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" to try againto boot into default mode.Give root password for maintenance(or press Control-D to continue):输入 root 密码登录后:
$ journalctl -xb --priority=err$ cat /etc/fstab$ mount -a 2>&1如果是某个分区导致的问题:
$ lsblk -f$ blkid修复问题后:
$ systemctl reboot救援模式(Rescue Mode)
Section titled “救援模式(Rescue Mode)”救援模式从安装介质启动,用于修复无法启动的系统。
进入救援模式
Section titled “进入救援模式”- 从 AlmaLinux / Rocky Linux 安装 ISO 启动
- 在启动菜单选择 Troubleshooting
- 选择 Rescue a system
系统会检测已安装的系统并挂载到 /mnt/sysimage。
$ chroot /mnt/sysimage现在你可以像在正常系统中一样执行修复命令。
手动挂载(如果自动检测失败)
Section titled “手动挂载(如果自动检测失败)”$ lsblk -f$ mount /dev/sda2 /mnt/sysimage$ mount /dev/sda1 /mnt/sysimage/boot$ mount --bind /dev /mnt/sysimage/dev$ mount --bind /proc /mnt/sysimage/proc$ mount --bind /sys /mnt/sysimage/sys$ mount --bind /run /mnt/sysimage/run$ chroot /mnt/sysimage单用户模式(Single User Mode)
Section titled “单用户模式(Single User Mode)”单用户模式用于在最小环境下排查问题,例如重置 root 密码。
通过 GRUB 进入单用户模式
Section titled “通过 GRUB 进入单用户模式”- 在 GRUB 启动菜单按
e编辑引导条目 - 找到以
linux开头的行(包含vmlinuz) - 在该行末尾添加:
rd.break或init=/bin/bash - 按
Ctrl+X启动
使用 rd.break 重置 root 密码
Section titled “使用 rd.break 重置 root 密码”switch_root:/# mount -o remount,rw /sysrootswitch_root:/# chroot /sysrootsh-4.4# passwd rootsh-4.4# touch /.autorelabelsh-4.4# exitswitch_root:/# exit注意:
touch /.autorelabel会在下次启动时重新标记整个文件系统的 SELinux 标签,这个过程可能需要几分钟到几十分钟,取决于文件数量。不要在此过程中强制关机。
查看启动日志
Section titled “查看启动日志”使用 journalctl
Section titled “使用 journalctl”$ journalctl -b$ journalctl -b -1$ journalctl -b -p err$ journalctl --list-boots使用 dmesg
Section titled “使用 dmesg”$ dmesg | less$ dmesg --level=err,warn$ dmesg | grep -i -E '(sd[a-z]|nvme|ata|scsi)'启用持久化日志
Section titled “启用持久化日志”默认情况下,EL 系统的 journald 日志可能不会持久保存。启用持久化后可以查看之前的启动日志:
$ sudo mkdir -p /var/log/journal$ sudo systemd-tmpfiles --create --prefix /var/log/journal$ sudo systemctl restart systemd-journald修复 fstab 错误
Section titled “修复 fstab 错误”/etc/fstab 中的错误是导致启动失败的常见原因。
常见 fstab 问题
Section titled “常见 fstab 问题”- UUID 与实际分区不匹配(更换磁盘后)
- 引用了不存在的分区
- 挂载选项错误
- NFS/CIFS 远程挂载在网络就绪前执行
$ blkid$ cat /etc/fstab$ sudo findmnt --verify --tab-file /etc/fstab如果某个分区的 UUID 已变更:
$ sudo blkid /dev/sda2输出例如:/dev/sda2: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
$ sudo vi /etc/fstab防止 NFS 挂载导致启动卡死
Section titled “防止 NFS 挂载导致启动卡死”对于网络文件系统挂载,添加 _netdev 和 nofail 选项:
server:/export /mnt/nfs nfs defaults,_netdev,nofail 0 0nofail 确保即使挂载失败系统也能正常启动。_netdev 确保等待网络就绪后再尝试挂载。
重新安装 GRUB
Section titled “重新安装 GRUB”BIOS 系统
Section titled “BIOS 系统”$ sudo grub2-install /dev/sda$ sudo grub2-mkconfig -o /boot/grub2/grub.cfgEFI 系统
Section titled “EFI 系统”$ sudo dnf reinstall grub2-efi-x64 shim-x64$ sudo grub2-mkconfig -o /boot/efi/EFI/$(. /etc/os-release && echo $ID)/grub.cfg$ efibootmgr -v从救援模式重新安装 GRUB
Section titled “从救援模式重新安装 GRUB”如果系统完全无法启动,从安装介质进入救援模式后:
$ chroot /mnt/sysimage$ dnf reinstall kernel-core$ grub2-install /dev/sda$ grub2-mkconfig -o /boot/grub2/grub.cfg$ dnf reinstall kernel-core grub2-efi-x64 shim-x64$ grub2-mkconfig -o /boot/efi/EFI/$(. /etc/os-release && echo $ID)/grub.cfgDracut / Initramfs 问题
Section titled “Dracut / Initramfs 问题”dracut 负责生成 initramfs(初始内存文件系统),其中包含启动阶段所需的驱动和工具。
- 启动时报
dracut-initqueue超时 - 提示找不到根文件系统
- 进入 dracut emergency shell
dracut-initqueue[xxx]: Warning: dracut-initqueue timeoutdracut-initqueue[xxx]: Warning: Could not boot.dracut:/# ls /dev/sd* /dev/nvme*dracut:/# journalctl重新生成 initramfs
Section titled “重新生成 initramfs”$ sudo dracut --force$ sudo dracut --force /boot/initramfs-$(uname -r).img $(uname -r)$ sudo dracut --force --add-drivers "megaraid_sas mpt3sas" /boot/initramfs-$(uname -r).img $(uname -r)常见 dracut 问题
Section titled “常见 dracut 问题”缺少存储驱动: 如果更换了存储控制器或迁移了虚拟机平台:
$ lsinitrd /boot/initramfs-$(uname -r).img | grep -i driver$ sudo dracut --force --add-drivers "virtio_blk virtio_scsi virtio_net virtio_pci"initramfs 文件损坏:
$ ls -lh /boot/initramfs-*.img如果文件大小异常(如只有几 KB),说明文件已损坏,需要重新生成。
内核升级后无法启动
Section titled “内核升级后无法启动”回退到旧内核
Section titled “回退到旧内核”- 在 GRUB 启动菜单选择旧内核版本启动
- 如果 GRUB 菜单不显示(倒计时太短),在启动时反复按
Esc或按住Shift
$ rpm -qa kernel-core | sort -V$ sudo grubby --set-default /boot/vmlinuz-<旧内核版本>$ sudo dnf remove kernel-core-<有问题的版本>