3. Buildroot配置:目标架构、工具链、内核、Bootloader、文件系统

好,咱们进入正题。Buildroot 的配置,说白了就是回答五个问题:你的芯片是什么架构?用什么编译器?跑哪个内核版本?用什么引导程序?文件系统长什么样?

这五个问题,一个都不能含糊。我在项目里见过有人把 ARM 架构选成了 ARM64,结果折腾了一整天,最后发现是这里选错了。嗯,咱们一步步来。

3.1 配置目标架构

先打开终端,进入 Buildroot 目录,执行:

make menuconfig

你会看到一个蓝底黄字的配置界面。第一件事,就是告诉 Buildroot 你的目标芯片是谁。

进入 Target options:

  • Target Architecture:选 ARM (little endian) 或 ARM64,取决于你的芯片。
  • Target Architecture Variant:比如 cortex-a7、cortex-a53。我建议你查一下芯片手册,别猜。
  • Target ABI:ARM 平台一般选 EABIhf(硬浮点),性能更好。
  • Floating point strategy:选 VFPv4-D16 或 NEON,看芯片支持。
我的习惯: 每次改完架构选项,我都会先保存退出,再重新进入确认一遍。因为有时候菜单会联动修改其他选项,你不注意就踩坑了。

3.2 配置工具链

工具链就是你的编译器、链接器、库的集合。Buildroot 支持两种方式:

方式 优点 缺点
Buildroot 内部构建 完全可控,版本匹配 编译时间长(第一次要半小时以上)
外部工具链 省时间,直接用现成的 版本可能不匹配,出问题难排查

我个人习惯用 Buildroot 内部构建。为什么?因为我在一个项目里吃过外部工具链的亏——GCC 版本和内核头文件版本不匹配,编译出来的 busybox 跑起来就段错误。排查了两天,最后换成内部工具链,一次过。

进入 Toolchain:

  • Toolchain type:选 Buildroot toolchain。
  • Kernel Headers:选和你内核版本匹配的头文件。比如你用 5.10 内核,就选 5.10.x。
  • C library:一般选 glibc(功能全)或 uclibc-ng(体积小)。嵌入式设备我常用 uclibc-ng,能省几百 KB。
  • GCC compiler version:选最新的稳定版就行,不用追新。
注意: 如果你改了工具链版本,一定要 make clean 再重新编译。我曾经偷懒没 clean,结果链接器报了一堆 undefined reference,浪费了半小时。

3.3 配置内核

内核配置是重头戏。进入 Kernel:

  • Linux Kernel:勾上。
  • Kernel version:选 Custom version,然后填你需要的版本号,比如 5.10.120。
  • Defconfig name:填你的芯片厂商提供的 defconfig 名称,比如 imx_v7_defconfig。
  • Kernel binary format:一般选 zImage。
  • Device tree source file paths:填你的设备树文件路径,比如 arch/arm/boot/dts/imx6ull-14x14-evk.dts。

这里有个小技巧:不要直接在 Buildroot 里改内核配置。我习惯先单独编译内核,确认配置没问题了,再把 .config 拷过来。你想想看,如果内核起不来,你都不知道是配置问题还是 Buildroot 的问题。

核心原则: 内核配置越精简越好。只勾选你硬件需要的驱动,多余的统统关掉。这样编译快,镜像小,启动也快。

3.4 配置 Bootloader

Bootloader 我选 U-Boot,没别的原因,生态好,资料多。进入 Bootloaders:

  • U-Boot:勾上。
  • U-Boot board name:填你的板子名称,比如 mx6ull_14x14_evk。
  • U-Boot version:选 Custom version,填版本号。
  • U-Boot binary format:一般选 u-boot.imx(i.MX 平台)或 u-boot.bin。

配置 U-Boot 时,有个关键点:环境变量。我建议你在 Buildroot 里直接指定默认环境变量,省得每次启动都要手动设置。比如:

CONFIG_BOOTCOMMAND="load mmc 0:1 0x82000000 zImage; load mmc 0:1 0x83000000 imx6ull.dtb; bootz 0x82000000 - 0x83000000"
CONFIG_BOOTARGS="console=ttymxc0,115200 root=/dev/mmcblk0p2 rootwait"

这样 U-Boot 启动后自动加载内核和设备树,省心。

3.5 配置文件系统

文件系统决定了你的根目录长什么样。进入 Filesystem images:

  • ext2/3/4:如果你用 SD 卡或 eMMC,选 ext4。
  • squashfs:只读文件系统,适合生产环境,防篡改。
  • initramfs:把文件系统打包进内核,适合调试阶段。
  • tar.gz:导出一个压缩包,方便手动制作镜像。

我调试阶段喜欢用 initramfs,因为不需要分区,一个 zImage 搞定所有。但生产环境一定要换成 ext4 或 squashfs,不然内核太大,启动也慢。

然后进入 System configuration,设置一些基本参数:

  • System hostname:填你的设备名,比如 myboard。
  • Root password:一定要设!我见过有人不设密码,产品上线后被别人 SSH 登录了,尴尬。
  • Init system:选 BusyBox 或 systemd。小内存设备用 BusyBox,功能多就用 systemd。

3.6 整体配置流程一览

说了这么多,咱们用一张图来总结整个配置流程:

Buildroot 配置流程 Buildroot 配置流程 make menuconfig 目标架构 工具链 内核 Bootloader 文件系统 配置顺序建议 1. 先定架构 2. 再选工具链 3. 然后内核/Bootloader 4. 最后文件系统 常见错误 • 架构选错 → 编译失败 • 工具链不匹配 → 运行崩溃

3.7 保存与验证

配置完成后,按 Save 保存为 .config 文件。然后我建议你做一件事:

make savedefconfig

这个命令会生成一个精简的 defconfig 文件,只包含你修改过的选项。下次换版本或者给同事用,直接 make defconfig 就能恢复配置,不用再从头点一遍菜单。

我的习惯: 每次配置完,我都会把 defconfig 提交到 Git 仓库。这样万一搞砸了,随时可以回退。你想想看,要是没有版本管理,改错了只能重来,多浪费时间。

好了,配置阶段就到这里。记住一句话:配置越细致,后面联调越顺利。别嫌麻烦,这一步省下的时间,后面十倍百倍地还给你。