2. 系统启动流程基础

系统救援的第一原则是“先定位启动阶段,再选择恢复模式”。一台 Linux 主机从按下电源到出现登录提示符,并不是一个连续动作,而是由固件、引导加载程序、内核、initramfs、init 系统与用户空间服务逐级接力完成的链条。任何一级失败,表现出的症状都不同:有的黑屏无输出,有的停在 GRUB 提示符,有的报 Kernel panic,有的进入紧急模式。理解这条链,才能在救援时快速判断“该修哪一段”。

一、启动链的四个阶段与责任边界

传统 BIOS 与 UEFI 是两种固件接口。BIOS 通过 MBR 扇区中的引导代码跳转,依赖 512 字节限制,通常需要 GRUB 的 stage1/stage1.5/stage2 多级加载;UEFI 则直接读取 FAT 格式的 ESP 分区(EFI System Partition),执行 .efi 应用程序,支持 GPT 大容量磁盘与安全启动。固件阶段的核心任务是完成硬件自检(POST)、枚举设备,并把控制权交给引导加载程序。

引导加载程序(GRUB2、systemd-boot 等)负责读取 /boot 中的内核与 initramfs,向内核传递命令行参数,例如根文件系统位置、ro/rw、quiet、rd.break。内核初始化阶段会解压自身、探测硬件、挂载 initramfs 作为临时根,加载根文件系统所需驱动,然后切换(switch_root)到真实根。最后用户空间由 init 系统(systemd 或 SysVinit)接管,按 target 拉起服务,直到 multi-user.target 或 graphical.target。

启动链四阶段与典型故障点 ① 固件阶段 BIOS / UEFI POST、ESP、MBR ② 引导加载程序 GRUB2 / systemd-boot 读 /boot、传 cmdline ③ 内核初始化 内核 + initramfs 驱动、switch_root ④ 用户空间 systemd / init target、服务、登录 故障:无显示/找不到盘 Secure Boot 拦截 ESP 损坏、启动顺序错 故障:grub> 提示符 grub.cfg 丢失/写错 UUID 变更、内核被删 故障:Kernel panic 找不到根设备 initramfs 缺驱动 故障:emergency mode fstab 挂载失败 服务依赖循环 救援入口速查: GRUB 菜单按 e 编辑内核行 → 追加 rd.break / init=/bin/bash / systemd.unit=rescue.target UEFI 下可用 efibootmgr 修复启动项;BIOS 下用 grub-install 重装 MBR 引导代码 进入后先 mount -o remount,rw / 再 chroot /sysroot,最后 touch /.autorelabel(SELinux 场景)

二、方法流程:按阶段定位与恢复

救援时应遵循“由外向内、由早到晚”的顺序。第一步确认固件是否完成自检:若连厂商 Logo 都没有,问题在硬件或固件设置;若能进入固件设置但找不到启动项,检查 ESP 分区与启动顺序。第二步观察是否出现 GRUB 菜单:若直接落入 grub> 或 grub rescue>,说明引导配置或分区定位失败。第三步看内核是否输出日志:卡在 Loading initial ramdisk 或报 VFS: Unable to mount root fs,属于 initramfs 与根设备问题。第四步看 systemd 是否进入紧急模式,通常是 /etc/fstab 或服务单元错误。

常用救援命令清单

# 查看当前内核命令行
cat /proc/cmdline

# 临时以单用户/紧急模式启动(GRUB 编辑内核行)
systemd.unit=rescue.target
systemd.unit=emergency.target
init=/bin/bash
rd.break

# 重新生成 GRUB 配置
grub2-mkconfig -o /boot/grub2/grub.cfg     # RHEL/CentOS
update-grub                                 # Debian/Ubuntu

# 重装引导程序
grub2-install /dev/sda                      # BIOS
grub-install --target=x86_64-efi --efi-directory=/boot/efi

# 重建 initramfs
dracut -f /boot/initramfs-$(uname -r).img $(uname -r)
update-initramfs -u -k all

三、案例场景:一次“根分区 UUID 变更”导致的启动失败

某测试机克隆磁盘后重启,GRUB 菜单正常,但内核很快报 Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)。判断为内核命令行中的 root=UUID=... 仍指向旧磁盘 UUID。救援步骤:在 GRUB 菜单按 e 编辑内核行,把 root=UUID=旧值 改为新分区 UUID,按 Ctrl+X 启动;进入系统后执行 blkid 核对,再运行 grub2-mkconfig 与 dracut -f 固化配置。若无法进入系统,则用安装介质进入救援模式,挂载根分区后 chroot 修复。

四、误区与复盘

  • 误区一:所有启动失败都重装系统。 多数问题只需修复引导配置或 initramfs,重装会丢失数据且掩盖根因。
  • 误区二:只改 GRUB 菜单不更新配置。 临时编辑仅对本次生效,必须执行 grub2-mkconfig 或 update-grub 才能持久化。
  • 误区三:忽略 SELinux 与挂载上下文。 在 rd.break 中修改文件后未执行 touch /.autorelabel,重启可能因标签错误再次失败。
  • 误区四:不记录变更。 内核升级、磁盘克隆、分区调整、fstab 修改都是高发诱因,救援后应复盘变更记录并验证重启。
阶段关键对象典型症状首选恢复动作
固件BIOS/UEFI、ESP、MBR无显示、找不到启动设备检查启动顺序、修复 ESP/MBR
引导加载程序GRUB2、grub.cfggrub> 或 grub rescue>手动指定内核与根分区后重装 GRUB
内核初始化vmlinuz、initramfsKernel panic、找不到根设备修正 root= 参数、重建 initramfs
用户空间systemd、fstab、服务单元emergency mode、依赖失败修复 fstab、屏蔽故障服务、重载 daemon

救援时优先使用“最小改动”原则:先通过内核命令行临时进入系统,确认根因后再持久化修复。每次修改 /etc/fstab、GRUB 配置或 initramfs 后,务必执行一次重启验证,避免把隐患留到下一次故障。