3、Buildroot初体验:下载源码、配置与首次编译

说实话,第一次接触Buildroot的时候,我也有点懵。

一堆配置项,一堆选项,不知道从哪下手。但后来我发现,这东西其实没那么玄乎。说白了,它就是一套帮你自动构建嵌入式Linux系统的工具集。你给它一个目标板子的信息,它帮你把交叉编译工具链、bootloader、内核、根文件系统全部搞定。

嗯,今天我们就来走一遍完整的流程。从下载源码开始,到配置,再到编译,最后看看它到底生成了些什么东西。

3.1 下载Buildroot源码

我个人习惯用Git来管理。这样方便切换版本,也方便看更新日志。

# 克隆最新稳定版
git clone https://git.buildroot.net/buildroot
cd buildroot

# 或者下载特定版本的压缩包
wget https://buildroot.org/downloads/buildroot-2023.02.tar.gz
tar -xzf buildroot-2023.02.tar.gz
cd buildroot-2023.02

这里有个小建议:不要用最新的开发版做产品。我踩过这个坑。有一次为了尝鲜,用了master分支,结果某个包编译不过,查了半天发现是依赖版本不匹配。后来老老实实切回LTS版本,一切顺利。

我的习惯:git tag 查看所有版本,选最新的LTS版本。比如 2023.02.x 系列就很稳。

3.2 配置Buildroot(make menuconfig)

配置Buildroot,核心命令就一个:

make menuconfig

你会看到一个类似Linux内核配置的界面。别慌,结构很清晰。

主要配置项分为这几大类:

配置项 说明 我的建议
Target options 目标架构、CPU型号、浮点单元等 先确认你的板子是什么架构,ARM还是RISC-V?
Build options 编译线程数、下载镜像源、调试选项 建议把 Number of jobs 设成CPU核心数+1
Toolchain 选择内置工具链还是外部工具链 新手先用内置的,省心
System configuration 主机名、密码、启动脚本等 记得改默认密码!
Kernel Linux内核版本和配置 可以用默认配置先跑起来
Target packages 你要装哪些软件包 别贪多,够用就行
Filesystem images 根文件系统格式(ext4、squashfs等) 开发阶段用ext4,产品用squashfs

我第一次配置的时候,选了一堆包,结果编译了整整两个小时。后来学乖了,先配一个最小系统,跑通了再加东西。

核心思路: 先最小化,再增量添加。别想着一步到位。

3.3 首次编译

配置保存后,直接运行:

make

或者指定并行编译:

make -j$(nproc)

第一次编译会下载很多源码包。网速慢的话,建议提前配好国内镜像源。

注意: 编译过程中如果报错,先看日志。大部分问题都是网络超时或者依赖缺失。不要一上来就怀疑Buildroot有问题。

我曾经在编译Qt5的时候卡了整整一天。后来发现是某个依赖库的版本不对。嗯,从那以后我学会了先看 Config.in 里的依赖说明。

3.4 输出产物分析

编译完成后,所有输出都在 output/ 目录下。结构如下:

output/
├── images/          # 最终镜像文件
│   ├── zImage       # 内核镜像
│   ├── rootfs.ext4  # 根文件系统
│   ├── u-boot.bin   # bootloader
│   └── sdcard.img   # 完整SD卡镜像
├── build/           # 每个包的编译目录
├── host/            # 主机工具链
├── staging/         # 头文件和库
└── target/          # 目标根文件系统

你真正需要关注的是 images/ 目录。这里面就是你要烧录到板子上的东西。

举个例子:

  • zImage:压缩后的内核镜像
  • rootfs.ext4:根文件系统,ext4格式
  • sdcard.img:整张SD卡的镜像,包含分区表

我个人最常用的是 sdcard.img。直接用 dd 命令烧到SD卡里,插到板子上就能启动。

小技巧:make graph-size 可以查看每个包占了多少空间。这对做产品很有用,能帮你控制根文件系统的大小。

3.5 知识体系图

下面这张图,是我自己总结的Buildroot工作流程。你看一眼就明白了:

Buildroot 工作流程 1. 下载源码 2. make menuconfig 3. make 编译 输出 输出产物(output/images/) zImage(内核) rootfs.ext4(根文件系统) u-boot.bin(引导程序) sdcard.img(完整SD卡镜像)

你看,整个流程其实就四步:下载、配置、编译、拿产物。是不是很简单?

3.6 避坑指南

最后,分享几个我踩过的坑:

  • 网络问题: 第一次编译会下载大量源码包。建议用 BR2_PRIMARY_SITE 配置国内镜像源,不然你会等到怀疑人生。
  • 磁盘空间: 编译过程中,output/ 目录会膨胀到几个GB。确保你的磁盘有至少10GB空闲空间。
  • 不要用root编译: 我见过有人用root用户编译,结果权限混乱,后面怎么搞都搞不定。用普通用户就好。
  • 保存配置: 配置完成后,记得 make savedefconfig。这样下次可以直接用 make defconfig 恢复配置。
一句话总结: Buildroot没那么可怕。先跑通最小系统,再慢慢加功能。每一步都确认没问题了,再往前走。

公众号:蓝海资料掘金营,微信deep3321