2. 硬件初始化与固件交互

系统引导的起点并非Linux内核,而是从CPU复位向量开始,经过固件(BIOS/UEFI)初始化硬件、选择启动设备、加载引导记录,最终由Bootloader(GRUB)将内核与initramfs载入内存。这一阶段的问题往往表现为“黑屏”、“无响应”或“重启循环”,排查时需区分固件阶段与Bootloader阶段。

2.1 固件阶段:BIOS与UEFI的初始化流程

CPU上电后,首先执行固件代码。BIOS(传统)与UEFI(现代)在启动方式、分区表支持、交互接口上存在显著差异。

特性BIOS (Legacy)UEFI
引导模式实模式(16位)保护模式/长模式(32/64位)
分区表MBR(主引导记录)GPT(GUID分区表)
引导记录位置磁盘第1扇区(LBA0)ESP分区(FAT32)中的.efi文件
硬件初始化POST → 中断向量表 → 加载MBRSEC → PEI → DXE → BDS → TSL
调试手段POST卡、蜂鸣码UEFI Shell、串口日志
排查要点:若系统在开机后立即黑屏且无蜂鸣,问题通常在CPU/内存/主板POST阶段;若出现“No bootable device”或光标闪烁,则固件已通过,问题在引导记录或Bootloader。

2.2 MBR与GPT:引导记录的布局与加载

固件完成初始化后,根据启动顺序扫描磁盘。BIOS读取MBR(第1扇区,512字节),UEFI则查找ESP分区中的EFI应用程序。

MBR结构(BIOS引导)

  • 引导代码(446字节):第一阶段Bootloader,负责加载后续扇区。
  • 分区表(64字节):4个主分区条目,每个16字节。
  • 魔数(2字节):0x55AA,校验标记。

GPT结构(UEFI引导)

  • 保护MBR(LBA0):防止BIOS误认磁盘为未分区。
  • GPT头(LBA1):分区表位置、大小、CRC校验。
  • 分区表项(LBA2~33):支持128个分区,每个128字节。
  • ESP分区:FAT32格式,存放bootx64.efi或grubx64.efi。
调试命令(UEFI Shell):
Shell> map -r                          # 列出所有可用设备
Shell> fs0:                            # 切换到第一个FAT分区
FS0:\> ls EFI\BOOT\                    # 查看引导文件
FS0:\> bcfg boot dump                  # 查看UEFI引导项

2.3 Bootloader(GRUB)的加载与执行

GRUB是Linux生态中最常用的Bootloader,分为多个阶段。理解其加载顺序对定位“GRUB提示符出现但无法启动内核”的问题至关重要。

GRUB加载流程

  1. boot.img:嵌入MBR或GPT保护MBR,仅446字节,负责加载core.img。
  2. core.img:位于MBR与第一个分区之间(BIOS)或磁盘末尾(GPT),包含文件系统驱动。
  3. grub.cfg:从/boot/grub/读取菜单配置,显示启动菜单。
  4. 加载内核与initramfs:根据菜单项将vmlinuz和initrd.img读入内存,传递启动参数。
  5. 启动内核:GRUB调用boot命令,将控制权交给内核入口点。
GRUB 加载与执行流程图 BIOS / UEFI 固件 boot.img (MBR / 保护MBR) core.img (文件系统驱动) grub.cfg (启动菜单) 加载 vmlinuz + initrd.img start_kernel() 常见故障点 • MBR损坏 → 黑屏光标闪烁 • core.img缺失 → GRUB rescue> • grub.cfg语法错误 → 菜单不显示

2.4 常见故障与排查思路

现象可能原因排查方向
开机黑屏,无任何输出POST失败、内存/CPU故障检查POST卡、蜂鸣码、最小硬件配置
光标闪烁,无法引导MBR损坏或引导设备错误使用Live CD修复MBR:grub-install /dev/sda
显示“GRUB rescue>”core.img或/boot分区不可访问手动指定前缀:set prefix=(hd0,msdos1)/boot/grub
GRUB菜单出现,选择后重启内核映像损坏或启动参数错误按e编辑菜单,检查linux行路径与root=参数
UEFI下直接进入BIOS设置ESP分区缺失或引导项丢失使用efibootmgr重建引导项
避坑提示:在UEFI+GPT环境下,不要使用dd if=/dev/zero of=/dev/sda bs=512 count=1清空MBR,这会破坏保护MBR,导致部分固件无法识别GPT磁盘。应使用sgdisk --zap-all /dev/sda安全清除。

2.5 GRUB命令行调试技巧

当GRUB菜单无法正常加载时,可进入GRUB命令行(按c键)进行手动引导,这是排查Bootloader阶段问题的核心手段。

# 查看所有磁盘与分区
grub> ls
(hd0) (hd0,msdos1) (hd0,msdos2)

# 查看分区文件系统与内容
grub> ls (hd0,msdos1)/
lost+found/ boot/ etc/ ...

# 手动设置内核与initramfs路径
grub> set root=(hd0,msdos1)
grub> linux /boot/vmlinuz-5.15.0-generic root=/dev/sda1 ro
grub> initrd /boot/initrd.img-5.15.0-generic
grub> boot
关键检查点:
  • ls命令能否列出分区?若不能,说明磁盘驱动或core.img损坏。
  • linux行指定的内核文件是否存在?路径错误会导致“file not found”。
  • root=参数是否与根分区设备匹配?不匹配会导致内核挂载根文件系统失败。

2.6 固件与Bootloader交互的调试日志

部分固件支持串口重定向或UEFI日志记录,可捕获早期引导信息。

固件类型日志获取方式典型输出
BIOS串口重定向(需主板支持)POST codes, memory test
UEFIUEFI Shell → dmem / pciDXE drivers loaded, device paths
GRUB按c进入命令行,set debug=all文件系统读取细节,内存映射

在GRUB中启用调试输出:

grub> set debug=all
grub> configfile /boot/grub/grub.cfg
# 此时会输出大量调试信息,包括文件读取偏移、扇区号等

通过上述方法,可将引导失败问题精确隔离到固件、MBR/GPT、GRUB阶段或内核加载阶段,为后续深入调试奠定基础。