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)
第一次编译会下载很多源码包。网速慢的话,建议提前配好国内镜像源。
我曾经在编译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工作流程。你看一眼就明白了:
你看,整个流程其实就四步:下载、配置、编译、拿产物。是不是很简单?
3.6 避坑指南
最后,分享几个我踩过的坑:
- 网络问题: 第一次编译会下载大量源码包。建议用
BR2_PRIMARY_SITE配置国内镜像源,不然你会等到怀疑人生。 - 磁盘空间: 编译过程中,
output/目录会膨胀到几个GB。确保你的磁盘有至少10GB空闲空间。 - 不要用root编译: 我见过有人用root用户编译,结果权限混乱,后面怎么搞都搞不定。用普通用户就好。
- 保存配置: 配置完成后,记得
make savedefconfig。这样下次可以直接用make defconfig恢复配置。
公众号:蓝海资料掘金营,微信deep3321