Buildroot 在嵌入式 Linux 开发中的全流程应用指南
文章目录
1. 概述
1.1 什么是 Buildroot?
Buildroot 是一个简单、高效且易于使用的工具,用于通过交叉编译生成嵌入式 Linux 系统。它使用 Makefile 脚本和 Kconfig 配置系统,能够自动化地构建出包含 Toolchain(工具链)、Bootloader(引导加载程序)、Kernel(内核) 和 RootFS(根文件系统) 的完整镜像。
与 Yocto Project 相比,Buildroot 更轻量级,适合中小型嵌入式项目,学习曲线更平缓。

图1:Buildroot 自动化构建工作流程图
1.2 为什么选择 Buildroot?
| 维度 | 传统手动构建 | Buildroot 构建 | 效率提升 |
|---|---|---|---|
| 工具链配置 | 需手动编译 GCC/Binutils,耗时且易错 | 菜单一键选择或下载预编译链 | ⭐⭐⭐⭐⭐ |
| 依赖管理 | 需手动解决库依赖(Dependency Hell) | 自动处理包依赖关系 | ⭐⭐⭐⭐⭐ |
| 文件系统 | 手动裁剪 BusyBox,配置启动脚本 | 自动生成完整 RootFS 镜像 | ⭐⭐⭐⭐ |
| 复现性 | 依赖宿主机环境,难以完全复现 | 基于 Config 文件,100% 可复现 | ⭐⭐⭐⭐⭐ |
| 开发周期 | 约 3-5 天搭建基础环境 | 约 1-2 小时完成首次构建 | 🚀 20倍 |
1.3 版本选择
建议使用 LTS(长期支持)版本以确保稳定性。
- 当前稳定版:2023.02.x LTS / 2024.02.x LTS
- 特性支持:
- Linux Kernel 5.10+ / 6.1+
- Glibc 2.36+ / Musl
- Systemd / SysVinit / OpenRC
- Python 3.11, Qt 5.15/6.x, OpenCV 4.x
2. 实战配置详解
2.1 环境准备
以 Ubuntu 22.04 LTS 为例,安装必要的依赖包:
sudo apt update
sudo apt install -y sed make binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio unzip rsync file bc wget git
2.2 获取源码
# 克隆官方仓库
git clone https://git.buildroot.net/buildroot
# 切换到 2023.02 LTS 分支
cd buildroot
git checkout 2023.02.x
2.3 配置导航 (make menuconfig)
执行 make menuconfig 进入图形化配置界面。

图2:make menuconfig 关键配置项标注
关键配置步骤:
-
Target options(目标选项)
- Target Architecture: 选择
ARM (little endian) - Target Architecture Variant: 选择
cortex-A7(例如用于 STM32MP1 或 i.MX6UL) - Floating point strategy: 选择
NEON/VFPv4
- Target Architecture: 选择
-
Toolchain(工具链)
- Toolchain type: 推荐
External toolchain(下载速度快,节省编译时间) - Toolchain: 选择
Bootlin toolchains或Linaro ARM 202x.xx - C library: 资源受限选
uClibc-ng或musl,通用选glibc
- Toolchain type: 推荐
-
System configuration(系统配置)
- System hostname: 设置主机名(如
embed-linux) - Init system: 推荐
systemd(功能全)或BusyBox init(启动快) - Root password: 设置默认 root 密码
- System hostname: 设置主机名(如
-
Filesystem images(文件系统镜像)
- 勾选
ext4 root filesystem - 如果使用 NAND Flash,勾选
ubifs
- 勾选
3. 编译与输出
3.1 开始编译
# -jN 表示使用 N 个线程并行编译,推荐 N = CPU核心数 + 1
make -j$(nproc)
注意:第一次编译需要下载大量源码包,可能耗时 30-60 分钟。
3.2 输出目录结构解析
编译完成后,所有产物都在 output/ 目录下。

图3:Buildroot 编译输出目录结构解析
output/images/zImage: Linux 内核镜像output/images/rootfs.ext4: 根文件系统output/images/sdcard.img: 完整的可烧录 SD 卡镜像(如果配置了 genimage)
4. 高级应用场景
4.1 添加第三方软件包 (OpenCV 示例)
Buildroot 内置了 2000+ 软件包,只需在 menuconfig 中勾选即可。
- 执行
make menuconfig - 进入
Target packages->Libraries->Graphics - 勾选
opencv3或opencv4 - 保存并重新编译:
make
4.2 自定义软件包
如果需要添加私有代码或 Buildroot 未收录的库,可以编写自定义 .mk 文件。
目录结构:
package/my-app/
├── Config.in
└── my-app.mk
Config.in:
config BR2_PACKAGE_MY_APP
bool "my-app"
help
This is a demo application.
my-app.mk:
################################################################################
#
# my-app
#
################################################################################
MY_APP_VERSION = 1.0
MY_APP_SITE = $(TOPDIR)/../my-app-src
MY_APP_SITE_METHOD = local
MY_APP_INSTALL_TARGET = YES
define MY_APP_BUILD_CMDS
$(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D) all
endef
define MY_APP_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/my-app $(TARGET_DIR)/usr/bin/my-app
endef
$(eval $(generic-package))
4.3 持续集成 (CI) 与版本固化
为了确保团队开发环境一致,不建议直接修改 Buildroot 源码,而是使用 BR2_EXTERNAL 机制。
- 创建外部目录:
mkdir my-project touch my-project/Config.in my-project/external.mk - 构建脚本示例:
#!/bin/bash # build.sh export BR2_EXTERNAL=$(pwd)/my-project make qemu_arm_versatile_defconfig make menuconfig # 进行定制 make savedefconfig # 保存配置到 my-project/configs/ make
5. 验证与运行 (QEMU)
如果手头没有开发板,可以使用 QEMU 进行仿真验证。
# 使用内置的 QEMU ARM 配置
make qemu_arm_versatile_defconfig
make
# 启动 QEMU
qemu-system-arm -M versatilepb -kernel output/images/zImage \
-dtb output/images/versatile-pb.dtb \
-drive file=output/images/rootfs.ext2,if=scsi,format=raw \
-append "root=/dev/sda console=ttyAMA0,115200" -nographic

图4:QEMU 成功运行 Buildroot 构建的系统
6. 术语对照表
| 英文术语 | 中文释义 | 说明 |
|---|---|---|
| Toolchain | 工具链 | 包含编译器(GCC)、连接器、C库等 |
| RootFS | 根文件系统 | Linux 启动后挂载的第一个文件系统 |
| defconfig | 默认配置 | 保存了关键配置项的精简配置文件 |
| Cross-Compile | 交叉编译 | 在 x86 主机上编译 ARM/RISC-V 代码 |
| Target | 目标机 | 运行编译结果的嵌入式设备 |
| Host | 宿主机 | 执行编译任务的 PC 或服务器 |
1568

被折叠的 条评论
为什么被折叠?



