配置 U-Boot 的 extlinux 启动文件
Linux 的三个产物已经生成,但 U-Boot 仍需要内核路径、设备树路径和启动参数。工程使用 extlinux.conf 保存这些信息。
这张图也给出了排错顺序:找不到 Image 或 DTB 时检查 FAT;内核已经运行却挂载不了 / 时,再检查 append 与 rootfs。
检查工程中的 extlinux 配置
文件位于:
buildroot-2026.05.1/
└── board/avaota/a1-mainline/rootfs-overlay/boot/extlinux/
└── extlinux.conf
当前工程内容是:
board/avaota/a1-mainline/rootfs-overlay/boot/extlinux/extlinux.conf
menu title Avaota A1 mainline boot
timeout 20
default mainline
label mainline
menu label Linux 7.2 / Buildroot 2026.05.1
linux /Image
fdt /sun55i-t527-avaota-a1.dtb
append console=ttyS0,115200 earlycon root=LABEL=rootfs rootwait rw fsck.repair=yes net.ifnames=0
extlinux.conf 各字段的作用
| 配置 | 消费者 | 解决的问题 | 典型失败位置 |
|---|---|---|---|
default mainline | U-Boot extlinux | 选择默认启动项 | 停留在启动菜单 |
linux /Image | U-Boot | 从 FAT 加载内核 | Image not found |
fdt /...dtb | U-Boot | 从 FAT 加载板级 DTB | FDT 读取或 booti 失败 |
console=ttyS0,115200 | Linux 串口驱动 | 保留正式控制台 | 内核日志中途消失 |
earlycon | Linux 早期串口 | 正式驱动注册前输出日志 | 最早一段日志不可见 |
root=LABEL=rootfs | Linux 根设备解析 | 找到 ext4 根分区 | VFS: Unable to mount root fs |
rootwait | Linux | 等待 eMMC 枚举完成 | MMC 尚未出现便尝试挂载 |
fsck.repair=yes | 用户空间工具 | 请求修复文件系统 | 文件系统异常后需要人工处理 |
net.ifnames=0 | Linux 用户空间 | 使用传统网卡名称 | 网卡名称与脚本不一致 |
root=LABEL=rootfs 能成立的前提不是“第二分区”,而是目标 ext4 文件系统确实带有 rootfs 卷标。这个关系在 Buildroot defconfig 中建立,并由镜像校验脚本再次确认。
BR2_TARGET_ROOTFS_EXT2_LABEL="rootfs"
│
▼
rootfs.ext2 的卷标
│
▼
root=LABEL=rootfs 找到根文件系统
将配置安装到启动分区
源码树中的文件不会自动出现在 FAT 中。工程的 post-build.sh 把它复制到 BINARIES_DIR,随后 genimage 把整个 extlinux/ 目录装入 boot.vfat。
因此,只修改源码文件而不重新执行构建,最终 FAT 不会自动更新。检查时应直接读取 U-Boot 真正会看到的副本:
cd buildroot-2026.05.1
mdir -i output/images/boot.vfat ::/
mdir -i output/images/boot.vfat ::/extlinux
mtype -i output/images/boot.vfat ::/extlinux/extlinux.conf
再把 FAT 中的三个对象取出,与本次构建输入逐字节比较:
check_dir=$(mktemp -d)
trap 'rm -rf "$check_dir"' EXIT
mcopy -i output/images/boot.vfat ::/Image "$check_dir/Image"
mcopy -i output/images/boot.vfat ::/sun55i-t527-avaota-a1.dtb "$check_dir/board.dtb"
mcopy -i output/images/boot.vfat ::/extlinux/extlinux.conf "$check_dir/extlinux.conf"
cmp output/images/Image "$check_dir/Image"
cmp output/images/sun55i-t527-avaota-a1.dtb "$check_dir/board.dtb"
cmp board/avaota/a1-mainline/rootfs-overlay/boot/extlinux/extlinux.conf \
"$check_dir/extlinux.conf"
三条 cmp 没有输出,表示 FAT 内的副本与当前输入一致。它仍然只是离线检查;还要在 U-Boot 串口中核对真正采用的 append: 行:
append: console=ttyS0,115200 earlycon root=LABEL=rootfs rootwait rw fsck.repair=yes net.ifnames=0
内核随后识别出 eMMC 分区,并将卷标为 rootfs 的 ext4 文件系统挂载为 /。这样即使设备从 mmcblk0 变为 mmcblk1,启动项也不需要跟着修改。