2. 硬件初始化与固件交互:BIOS/UEFI阶段,MBR/GPT引导记录,Bootloader(GRUB)的加载与执行
系统引导的起点并非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 → 中断向量表 → 加载MBR | SEC → 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加载流程
- boot.img:嵌入MBR或GPT保护MBR,仅446字节,负责加载core.img。
- core.img:位于MBR与第一个分区之间(BIOS)或磁盘末尾(GPT),包含文件系统驱动。
- grub.cfg:从
/boot/grub/读取菜单配置,显示启动菜单。 - 加载内核与initramfs:根据菜单项将vmlinuz和initrd.img读入内存,传递启动参数。
- 启动内核:GRUB调用
boot命令,将控制权交给内核入口点。
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 |
| UEFI | UEFI Shell → dmem / pci | DXE drivers loaded, device paths |
| GRUB | 按c进入命令行,set debug=all | 文件系统读取细节,内存映射 |
在GRUB中启用调试输出:
grub> set debug=all
grub> configfile /boot/grub/grub.cfg
# 此时会输出大量调试信息,包括文件读取偏移、扇区号等
通过上述方法,可将引导失败问题精确隔离到固件、MBR/GPT、GRUB阶段或内核加载阶段,为后续深入调试奠定基础。