CentOS Stream 9开机卡在GRUB界面或启动时停留在“Started Hold until boot process finishes”提示,无法进入系统,是常见启动故障。可能原因包括:文件系统损坏、内核更新失败、SELinux策略冲突或initramfs镜像缺失。该问题常伴随I/O错误或systemd超时日志。可通过Live CD/USB进入救援模式,检查磁盘状态(fsck)、重建initramfs镜像、恢复默认SELinux上下文或回滚至旧内核版本解决。同时建议检查/boot分区空间及grub2配置完整性。
1条回答 默认 最新
Qianwei Cheng 2025-12-16 03:30关注1. 问题现象与初步诊断
当 CentOS Stream 9 在启动过程中卡在 GRUB 界面,或停留在
Started Hold until boot process finishes提示时,系统无法完成初始化流程。该现象属于典型的引导失败场景,常见于生产环境中的服务器更新后重启、磁盘异常或配置错误。此时用户通常无法通过常规方式登录系统,只能依赖外部介质如 Live CD/USB 进入救援模式进行排查。初步判断可通过观察以下信息辅助定位:
- GRUB 菜单是否正常显示可选内核项
- 是否有 I/O 错误日志输出(如
end_request: I/O error) - systemd 是否报告超时服务(例如
dev-sda1.device timed out) - 是否存在 SELinux 拒绝记录(avc: denied)
2. 可能原因分析
故障类别 具体表现 触发条件 文件系统损坏 fsck 报错、挂载失败 非正常关机、磁盘故障 内核更新失败 新内核无法加载模块 yum/dnf 升级中断 initramfs 镜像缺失 dracut 报错、根设备找不到 未重建 initrd SELinux 策略冲突 avc denied 日志频繁出现 上下文被破坏或策略升级异常 /boot 分区空间不足 grub2-mkconfig 失败 长期未清理旧内核 GRUB2 配置损坏 menuentry 缺失或路径错误 手动编辑出错或脚本异常 3. 救援环境搭建与访问方法
使用 CentOS Stream 9 的官方 Live ISO 启动,选择 "Troubleshooting" → "Rescue a CentOS system" 进入救援 shell。系统将自动尝试挂载原系统的根分区,也可手动执行以下命令:
# 查看磁盘布局 lsblk # 手动挂载根分区(假设为 /dev/sda2) mount /dev/sda2 /mnt/sysroot # 挂载必要子系统 mount --bind /dev /mnt/sysroot/dev mount --bind /proc /mnt/sysroot/proc mount --bind /sys /mnt/sysroot/sys mount /dev/sda1 /mnt/sysroot/boot # 假设 /boot 独立分区4. 核心排查步骤与修复流程
- 检查磁盘健康状态:运行
smartctl -a /dev/sda判断硬件层面问题。 - 执行文件系统检查:使用
e2fsck -f /dev/sda2强制检测 ext4 文件系统完整性。 - 验证 /boot 空间:执行
df -h /boot,若使用率超过 90%,需清理旧内核。 - 重建 initramfs 镜像:进入 chroot 后运行:
dracut -f /boot/initramfs-$(uname -r).img $(uname -r) - 恢复 SELinux 上下文:执行
restorecon -R /etc /boot /usr或临时禁用 SELinux 测试启动。 - 回滚至旧内核:在 GRUB 中选择上一个稳定版本启动,避免新内核导致的问题。
- 重新生成 GRUB2 配置:
grub2-mkconfig -o /boot/grub2/grub.cfg - 重装 grub2 到 MBR:针对 BIOS 系统:
grub2-install /dev/sda
5. 自动化诊断流程图(Mermaid)
graph TD A[系统卡在GRUB或启动停滞] --> B{能否进入GRUB菜单?} B -->|是| C[选择旧内核启动] B -->|否| D[使用Live USB进入救援模式] C --> E{是否成功进入系统?} E -->|是| F[备份数据并修复新内核] E -->|否| D D --> G[挂载原系统分区] G --> H[检查I/O错误与fsck] H --> I[确认/boot空间充足] I --> J[重建initramfs] J --> K[修复SELinux上下文] K --> L[重新生成grub.cfg] L --> M[尝试重启] M --> N{是否解决?} N -->|否| O[考虑磁盘替换或RAID恢复] N -->|是| P[记录故障处理过程]6. 高级调试技巧与日志分析
在无法启动的情况下,可通过添加内核参数
systemd.log_level=debug和init=/bin/bash获取更详细的 systemd 初始化日志。重点关注:/var/log/messages中的 early boot 记录dmesg | grep -i 'error\|fail'输出的底层驱动问题- 通过
journalctl -b -1查看上一次启动的日志(需能访问磁盘) - 使用
sealert -a /var/log/audit/audit.log分析 SELinux 拒绝事件
对于远程服务器,建议配置串口控制台(serial console)以便捕获完整启动过程。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报