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 会先下载所有需要的源码包,然后根据你的配置进行裁剪和编译,最后打包成镜像。每一步都有日志输出,出错了也能定位到具体是哪个包编译失败。
注意: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 把这些脏活累活全包了,你只需要关注「要装什么软件包」和「要支持什么硬件」这两个问题。