/boot目录是内核加载起点,必须包含vmlinuz-xxx、initramfs-xxx、config-xxx、System.map-xxx及grub/子目录;GRUB通过grub.cfg中menuentry指定路径加载内核与initramfs,启动前需确保二者版本匹配且完整。

Linux系统初始化中,/boot目录是内核加载过程的起点和关键枢纽。它不参与运行时服务,但存放着启动所必需的静态核心文件,内核能否成功解压、挂载根文件系统,全依赖这里的内容是否完整、匹配、可读。
/boot里有哪些必须存在的内核相关文件
典型Linux发行版(如Ubuntu、CentOS)的/boot目录下至少包含以下几类文件:
- vmlinuz-xxx:压缩的Linux内核镜像(xxx为版本号,如5.4.0-152-generic),是GRUB实际加载并跳转执行的二进制文件;
- initrd.img-xxx 或 initramfs-xxx:初始内存盘镜像,含驱动模块和基础工具,在真实根文件系统挂载前提供临时运行环境;
- System.map-xxx:内核符号表,主要用于调试和内核日志解析,非启动必需但建议保留;
- config-xxx:该内核编译时的配置文件,记录了启用/禁用的模块与特性,排查兼容性问题时常需对照;
- grub/ 子目录:存放GRUB2配置(grub.cfg)、模块(*.mod)及字体等,决定哪些内核条目可被选中启动。
内核加载不是“复制粘贴”,而是分阶段解压执行
vmlinuz 并非直接可运行的代码,而是一个自解压内核存档。GRUB将其加载进内存后,CPU跳转到其入口地址(通常是 arch/x86/boot/header.S 生成的头部),由内建的解压逻辑(如 decompress_kernel())完成以下动作:
- 打印“Uncompressing Linux...”提示(若控制台可见);
- 调用 gunzip 或其它解压函数,将压缩段(piggy.gzip.o)展开至指定内存区域;
- 跳转到解压后的真正内核入口(如 start_kernel()),开始C语言级初始化。
这个过程发生在内核接管硬件之后、任何用户空间程序运行之前,完全在内核自身控制下完成,无需外部工具介入。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
/boot内容必须与当前运行内核严格对应
多内核共存很常见,但每次启动只用到一组配套文件。若手动更新内核却遗漏 initramfs 重建,或误删旧版 config,可能导致:
- 启动卡在“Loading initial ramdisk”;
- 根设备无法识别(如找不到 /dev/sda2),报错“Unable to mount root fs”;
- 驱动缺失导致网卡、RAID卡、NVMe硬盘不可见。
验证方法:运行 ls -l /boot/vmlinuz-$(uname -r) /boot/initrd.img-$(uname -r),确认两个文件存在且时间戳接近;再用 lsinitramfs /boot/initrd.img-$(uname -r) | head -n 10 检查镜像内容是否含必要模块。
GRUB如何从/boot中定位并加载指定内核
GRUB本身不硬编码路径,而是通过 /boot/grub/grub.cfg 中的 menuentry 定义来组织启动项。每个 entry 包含:
- 内核路径(如 linux /boot/vmlinuz-5.4.0-152-generic root=UUID=...);
- initrd路径(如 initrd /boot/initrd.img-5.4.0-152-generic);
- 启动参数(如 splash、quiet、rd.md=0 等)。
修改内核默认启动项,不能直接编辑 grub.cfg(会被 update-grub 覆盖),而应调整 /etc/default/grub 中的 GRUB_DEFAULT,再执行 sudo update-grub 重新生成配置。

















