3. 系统启动异常排查:BIOS/UEFI阶段、GRUB引导阶段、内核初始化阶段
系统启动失败,说白了就是机器从按下电源键到登录界面之间某个环节卡住了。我处理过上百起启动故障,大部分问题其实就卡在三个地方:固件阶段、引导加载器阶段、内核初始化阶段。咱们一个一个来拆。
核心思路:启动过程是串行的——前一个阶段没过,后一个阶段根本不会开始。所以排查时永远从最前面的阶段查起,别跳步。
3.1 BIOS/UEFI 阶段:机器通电后最先卡住的地方
按下电源键,CPU 第一条指令指向固件 ROM。这时候屏幕上通常能看到厂商 Logo 或者 POST 信息。如果连这个画面都没出现——嗯,先检查电源线和主板供电吧。
3.1.1 常见故障现象
- 完全黑屏,风扇转但无显示——大概率是内存条接触不良或显卡没插好。我遇到过一台服务器,折腾了两小时,最后发现是内存条金手指氧化了,橡皮擦一擦就好了。
- 蜂鸣报警——不同 BIOS 厂商的蜂鸣码含义不同。AMI 的连续短响一般是内存问题,Award 的一长两短通常是显卡问题。
- 提示 "No bootable device"——BIOS 找不到可启动的硬盘或 U 盘。去 Boot Order 里看看,是不是启动顺序被改了,或者硬盘 SATA 线松了。
我的习惯:进 BIOS/UEFI 设置界面后,先恢复默认配置(Load Optimized Defaults),再重新设置启动顺序。很多奇怪的问题其实是配置错乱导致的。
3.1.2 UEFI 与 Legacy 模式的区别
现在新机器基本都是 UEFI 了。但有些场景下,比如装老系统或者用 MBR 磁盘,还得切回 Legacy 模式。这里有个容易踩的坑:
| 对比项 | Legacy BIOS | UEFI |
|---|---|---|
| 磁盘分区表 | MBR(最大 2TB) | GPT(支持 2TB+) |
| 引导加载器位置 | MBR 扇区 | ESP 分区(FAT32) |
| 安全启动 | 不支持 | 支持 Secure Boot |
| 启动速度 | 较慢 | 较快 |
我曾经踩过的坑:有一台新服务器,装 CentOS 7 时选了 UEFI 模式,但磁盘分区忘了创建 ESP 分区(/boot/efi)。结果安装完成后重启,直接提示 "No bootable device"。重新分区创建 ESP 分区后才搞定。
3.2 GRUB 引导阶段:引导加载器出问题
BIOS/UEFI 阶段过了,屏幕上出现 GRUB 菜单或者直接跳到内核加载。如果卡在这里,最常见的就是 GRUB 配置文件损坏、内核文件丢失、或者引导分区挂了。
3.2.1 进入 GRUB 救援模式
如果 GRUB 找不到配置文件,会掉到 grub rescue> 提示符。这时候别慌,手动指定内核和 initramfs 路径就能启动。
# 查看当前分区情况
grub rescue> ls
(hd0) (hd0,msdos1) (hd0,msdos2)
# 找到 /boot/grub 所在分区
grub rescue> ls (hd0,msdos1)/
# 如果看到 grub/ 目录,说明找对了
# 手动加载内核和 initramfs
grub rescue> set root=(hd0,msdos1)
grub rescue> set prefix=(hd0,msdos1)/grub
grub rescue> insmod normal
grub rescue> normal
执行 normal 后应该能回到 GRUB 菜单。进去之后记得重新安装 GRUB 到 MBR 或 ESP 分区:
# 在系统内重新安装 GRUB(Legacy 模式)
grub2-install /dev/sda
# UEFI 模式
grub2-install --target=x86_64-efi --efi-directory=/boot/efi
grub2-mkconfig -o /boot/grub2/grub.cfg
3.2.2 GRUB 配置文件常见问题
- 内核参数错误——比如加了
quiet导致看不到启动日志,或者nomodeset没加导致显卡驱动崩溃。我建议排查时先去掉quiet和rhgb,看完整输出。 - 内核或 initramfs 文件缺失——升级内核后旧内核被删了,但 GRUB 配置还指向旧文件。手动编辑 GRUB 菜单项,按
e键修改linux和initrd行指向正确的文件。 - 文件系统损坏——/boot 分区文件系统出问题,GRUB 读不到文件。用 Live CD 启动后
fsck /dev/sda1修复。
避坑指南:修改 GRUB 配置前,先备份 /boot/grub2/grub.cfg。我曾经手滑写错了内核路径,重启后直接进救援模式,还好有备份才救回来。
3.3 内核初始化阶段:从引导到用户态
GRUB 把内核和 initramfs 加载进内存后,内核开始初始化硬件、加载驱动、挂载根文件系统,最后启动 init 进程。这个阶段出问题,屏幕上通常能看到 Kernel panic 或者卡在某个服务启动上。
3.3.1 Kernel panic 的常见原因
| 错误信息 | 可能原因 | 排查方向 |
|---|---|---|
| Kernel panic - not syncing: VFS: Unable to mount root fs | 根文件系统找不到或驱动缺失 | 检查 initramfs 是否包含磁盘驱动,检查 root= 参数是否正确 |
| Kernel panic - not syncing: Attempted to kill init! | init 进程崩溃或找不到 | 检查 /sbin/init 是否存在,或者尝试指定 init=/bin/bash |
| BUG: soft lockup - CPU#0 stuck for 22s! | CPU 软锁,某个中断处理卡住 | 检查硬件兼容性,尝试禁用 ACPI 或 APIC |
3.3.2 使用内核启动参数进行排查
在 GRUB 菜单按 e 编辑启动项,在 linux 行末尾添加以下参数:
# 查看完整启动日志(去掉 quiet 和 rhgb)
linux /vmlinuz-... root=/dev/mapper/... rd.debug loglevel=7
# 如果怀疑是驱动问题,可以禁用某些模块
linux /vmlinuz-... root=/dev/mapper/... modprobe.blacklist=nouveau
# 如果怀疑是 ACPI 问题
linux /vmlinuz-... root=/dev/mapper/... acpi=off noapic
# 直接进入单用户模式或紧急模式
linux /vmlinuz-... root=/dev/mapper/... single
# 或者
linux /vmlinuz-... root=/dev/mapper/... emergency
我个人习惯:遇到内核 panic 时,先用手机拍下屏幕上的错误信息。因为系统崩溃后可能自动重启,来不及抄。拍下来慢慢分析,比凭记忆猜靠谱得多。
3.3.3 initramfs 缺失或损坏
initramfs 是内核启动初期用的临时根文件系统,里面包含了磁盘驱动、LVM 工具、文件系统检查工具等。如果它坏了或者不完整,内核就挂不上真正的根文件系统。
# 重建 initramfs(在救援模式下或 Live CD 中)
# 先 chroot 到原系统
mount /dev/mapper/rootvg-root /mnt
mount /dev/sda1 /mnt/boot
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt
# 重建当前内核的 initramfs
dracut -f /boot/initramfs-$(uname -r).img $(uname -r)
# 或者指定内核版本
dracut -f /boot/initramfs-5.14.0-362.el9.x86_64.img 5.14.0-362.el9.x86_64
3.3.4 根文件系统挂载失败
这个我遇到过好几次。最常见的原因是 root= 参数写错了,或者用了 UUID 但文件系统的 UUID 变了。你想想看,克隆磁盘或者重新分区后,UUID 会变,但 GRUB 配置里还是老的 UUID,那肯定挂不上。
# 查看当前系统的 UUID
blkid /dev/sda2
# 在 GRUB 菜单按 e 编辑,把 root=UUID=... 改成 root=/dev/sda2 试试
# 如果能启动,进去后更新 grub.cfg 里的 UUID
我曾经遇到的情况:一台数据库服务器,重启后直接 Kernel panic。查了半天,发现是 /etc/fstab 里根文件系统用的是设备名 /dev/sda2,但内核升级后磁盘顺序变了,/dev/sda2 变成了别的分区。后来统一改成 UUID 挂载,再也没出过这个问题。
3.4 总结一下排查思路
系统启动异常排查,说白了就是「看现象、定阶段、找原因」。别一上来就重装系统,先判断是卡在 BIOS/UEFI、GRUB 还是内核初始化。每个阶段都有对应的排查工具和修复方法。
- BIOS/UEFI 阶段:看蜂鸣码、检查硬件连接、恢复默认配置。
- GRUB 阶段:进救援模式手动引导、检查配置文件、重新安装 GRUB。
- 内核初始化阶段:去掉 quiet 看完整日志、用启动参数禁用可疑驱动、重建 initramfs。
记住,启动过程是串行的,前一个阶段没过就别往后查。把这三个阶段的排查方法记熟了,90% 的启动故障都能自己搞定。