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 整体配置流程一览
说了这么多,咱们用一张图来总结整个配置流程:
3.7 保存与验证
配置完成后,按 Save 保存为 .config 文件。然后我建议你做一件事:
make savedefconfig
这个命令会生成一个精简的 defconfig 文件,只包含你修改过的选项。下次换版本或者给同事用,直接 make defconfig 就能恢复配置,不用再从头点一遍菜单。
defconfig 提交到 Git 仓库。这样万一搞砸了,随时可以回退。你想想看,要是没有版本管理,改错了只能重来,多浪费时间。
好了,配置阶段就到这里。记住一句话:配置越细致,后面联调越顺利。别嫌麻烦,这一步省下的时间,后面十倍百倍地还给你。