1、Buildroot 初体验:什么是 Buildroot、为什么选择 Buildroot、快速搭建最小系统

1.1 什么是 Buildroot?

先问个问题:你做过嵌入式 Linux 系统吗?

如果你做过,一定经历过这种痛苦——交叉编译工具链、bootloader、内核、根文件系统,每个都得单独搞。而且它们之间还有依赖关系,版本对不上就翻车。我刚开始做嵌入式那会儿,光搭一个能用的开发环境就花了两天,最后还跑不起来。

Buildroot 就是来解决这个问题的。

它是一个自动化构建系统。你给它一个配置文件,它就能帮你把整个嵌入式 Linux 系统从头到尾编译出来。包括交叉编译工具链、bootloader、内核、各种应用库和根文件系统镜像。说白了,一条命令下去,它帮你搞定一切。

我个人习惯把 Buildroot 理解成一个「嵌入式 Linux 的 makefile 生成器」。你告诉它目标平台是什么、要装哪些软件包,它自动处理依赖、下载源码、打补丁、编译、打包,最后输出一个可以直接烧录到板子上的镜像文件。

核心要点:Buildroot 不是发行版,也不是包管理器。它是一个构建系统,专门为嵌入式场景设计,目标是生成一个最小化、可定制的 Linux 系统镜像。

1.2 为什么选择 Buildroot?

市面上做嵌入式 Linux 构建的工具不止 Buildroot 一个。还有 Yocto、OpenWrt、Debian 的 debootstrap 等等。那为什么我推荐你学 Buildroot?

说几个我实际项目中的感受:

  • 简单直接——Buildroot 的配置方式和 Linux 内核的 menuconfig 一模一样。你用过内核配置吗?那上手 Buildroot 基本零门槛。我在一个 IoT 网关项目里,从零开始到生成可启动镜像,只用了半天。
  • 构建速度快——Yocto 我也用过,功能确实强大,但第一次构建要编译十几个小时。Buildroot 轻量得多,一个最小系统从下载到出镜像,快的板子 20 分钟搞定。
  • 镜像体积小——这是 Buildroot 的看家本领。默认配置下,一个最小根文件系统只有 2-3MB。我做过一个传感器采集节点,Flash 只有 8MB,用 Buildroot 裁剪后系统只占了 4MB,还剩一半给应用数据。
  • 交叉编译友好——Buildroot 自动生成交叉编译工具链,你不需要手动配置环境变量、库路径这些麻烦事。我曾经踩过手动配置工具链的坑,换了 Buildroot 之后,再也没为工具链折腾过。
对比项 Buildroot Yocto OpenWrt
学习曲线 低 高 中
首次构建时间 20-40 分钟 6-12 小时 30-60 分钟
最小镜像体积 2-3 MB 50-100 MB 4-8 MB
包管理 无(静态编译) 有(RPM/IPK) 有(opkg)
适用场景 资源受限的嵌入式设备 复杂、大型嵌入式系统 路由器/网络设备

我的建议:如果你是新手,或者项目对镜像体积有严格要求,选 Buildroot 准没错。等你对嵌入式 Linux 足够熟悉了,再去看 Yocto 也不迟。

1.3 Buildroot 的核心工作流程

在动手之前,先搞清楚 Buildroot 是怎么工作的。理解了流程,后面遇到问题你才知道去哪查。

Buildroot 构建流程 下载源码包 配置(make menuconfig) 提取源码 + 打补丁 交叉编译 生成镜像文件 输入 .config 配置文件 软件包列表 目标架构信息 输出 rootfs.tar / rootfs.cpio zImage / uImage / dtb

你看,整个流程是线性的。Buildroot 会先下载所有需要的源码包,然后根据你的配置进行裁剪和编译,最后打包成镜像。每一步都有日志输出,出错了也能定位到具体是哪个包编译失败。

注意:Buildroot 默认会从网上下载源码包。如果你的开发环境不能联网,需要提前把源码包下载好放到 dl/ 目录下。我曾经在一个内网项目里忘了这茬,结果 make 到一半卡住了,折腾了半天才发现是网络问题。

1.4 快速搭建最小系统

理论说完了,咱们动手。下面我带你在 QEMU 上跑一个最小系统。不需要真实开发板,你的电脑就能跑。

1.4.1 环境准备

你需要一台 Linux 主机(Ubuntu 20.04/22.04 都行),装好以下工具:

sudo apt-get update
sudo apt-get install -y build-essential git wget cpio unzip rsync
sudo apt-get install -y libncurses5-dev libssl-dev bc
sudo apt-get install -y qemu-system-arm

嗯,这里要注意:libncurses5-dev 是 menuconfig 图形界面必需的,少了它你没法配置。我第一次装的时候就漏了这个,结果 make menuconfig 报错,查了半天才发现。

1.4.2 下载 Buildroot

我建议用最新的 LTS 版本。目前稳定版是 2024.02.x:

wget https://buildroot.org/downloads/buildroot-2024.02.tar.gz
tar -xzf buildroot-2024.02.tar.gz
cd buildroot-2024.02

1.4.3 配置目标平台

我们以 ARM 的 versatilepb 板子为例,这是 QEMU 支持最成熟的平台之一:

make qemu_arm_versatile_defconfig

这条命令会加载一个预置的配置文件。你可以用 make menuconfig 查看具体配置,但第一次先别改,直接用默认的。

1.4.4 开始构建

make -j$(nproc)

这里 -j$(nproc) 是并行编译,用你 CPU 的所有核心。我第一次构建大概用了 25 分钟,具体时间取决于你的网络速度和机器性能。

构建过程中你会看到很多输出,有下载进度、编译日志、打包信息。如果一切顺利,最后会看到:

>>   Generating root filesystem image rootfs.cpio
>>   Generating root filesystem image rootfs.tar
>>   Generating images

1.4.5 在 QEMU 中运行

构建完成后,镜像文件在 output/images/ 目录下。用下面的命令启动:

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" \
  -nographic

启动后你会看到 Linux 内核启动日志,最后出现登录提示符:

Welcome to Buildroot
buildroot login:

默认用户名 root,没有密码。直接回车就能登录。

小技巧:退出 QEMU 的方法是按 Ctrl+A 然后按 x。我第一次用 QEMU 的时候不知道这个,直接关终端窗口,后来发现进程没杀掉,占着端口。

1.5 验证你的最小系统

登录进去之后,你可以看看这个系统有多「小」:

# 查看根文件系统大小
df -h

# 查看内核版本
uname -a

# 看看有哪些命令
ls /bin/

你会发现根文件系统只有 2-3MB,/bin 目录下只有 busybox 提供的几十个基础命令。没有 systemd,没有网络服务,没有图形界面。这就是一个纯粹的嵌入式最小系统。

我当初第一次看到这个结果的时候,说实话挺震撼的。一个完整的 Linux 系统,居然可以这么小。而且从零到跑起来,只用了不到半小时。

1.6 本章小结

这一章我们做了三件事:

  • 搞清楚了 Buildroot 是什么——一个嵌入式 Linux 自动化构建系统
  • 明白了为什么选它——简单、快速、镜像小
  • 亲手搭建了一个最小系统——在 QEMU 上跑起来了

你想想看,如果用手动方式,光配置交叉编译工具链就得半天。Buildroot 把这些脏活累活全包了,你只需要关注「要装什么软件包」和「要支持什么硬件」这两个问题。