4、Buildroot入门:源码获取、目录结构解析、基础配置(make menuconfig)

好,咱们正式开始动手了。

前面几章聊了不少概念,什么rootfs、交叉编译、构建系统……说实话,光听理论容易犯困。我当年刚接触嵌入式Linux时,也是被各种术语砸得晕头转向。直到我亲手把Buildroot跑起来,看到那块开发板真的打印出登录提示符,才觉得「哦,原来是这么回事」。

这一章,咱们就一起把Buildroot请进门。我会带着你走一遍:源码从哪拿、目录长啥样、怎么配、怎么编。你跟着敲一遍,比看十遍文档都管用。

4.1 源码获取:别从GitHub乱拉分支

Buildroot的官方源码托管在GitHub上,但我不建议你直接去点那个「Download ZIP」按钮。为什么呢?因为Buildroot是个滚动发布的项目,master分支可能今天还能编过,明天就挂了。我在项目里吃过这个亏——早上拉下来的代码,下午编译到一半报错,查了半天发现是某个内核补丁的commit被回退了。

我的建议是:用稳定版。

获取方式很简单,就两步:

# 第一步:克隆仓库(只拉最新一层,省时间)
git clone --depth 1 -b 2024.02.x https://github.com/buildroot/buildroot.git

# 第二步:进入目录
cd buildroot

这里我选了2024.02.x分支,这是2024年2月的长期支持版。你拿到手时,可以换成更新的LTS版本。怎么看?去https://buildroot.org/download.html(注意:此处不生成链接,仅示意)看那个带「LTS」标签的版本号就行。

小技巧: 如果你在公司内网开发,没法直连GitHub,可以先把源码包下载到本地,然后通过U盘或者内部GitLab导入。Buildroot的源码包也就几十MB,比Yocto轻量太多了。

4.2 目录结构解析:别被吓到,其实很清晰

第一次进Buildroot目录,你可能会觉得「怎么这么多文件夹?」。别慌,我带你捋一遍核心的。你记住一句话:Buildroot的目录结构,是按「功能模块」划分的,不是按「层级」划分的。

咱们直接看关键目录:

目录/文件 作用 我常用的场景
arch/ 架构相关的配置,比如ARM、x86、RISC-V 很少动,除非要加新CPU架构
board/ 板级支持包,放各开发板的配置文件、补丁、脚本 我经常在这里加自己的板子目录
configs/ 预置的defconfig文件,一键配置 这是入口,我习惯从这里开始
package/ 所有软件包的构建规则,每个包一个子目录 加新软件时,就在这里写.mk和Config.in
fs/ 文件系统生成逻辑,比如ext4、squashfs、cpio 调rootfs格式时进来改
dl/ 下载的源码包缓存目录(编译后自动生成) 离线编译时,我会提前把包扔这里
output/ 编译产物目录(编译后自动生成) 最常看的地方,images和build都在里面

嗯,这里有个重点:output/目录是编译后才会出现的。里面最关键的几个子目录:

  • output/images/ —— 最终生成的镜像文件,比如rootfs.ext4、zImage、u-boot.bin。你烧录到板子上的东西,全在这。
  • output/build/ —— 每个软件包的解压和编译目录。如果某个包编译报错,我一般直接进这里看log。
  • output/target/ —— 模拟的rootfs目录树。你可以进去看看,里面就是板子上最终的文件系统结构。
避坑指南: 我曾经有一次改了某个包的配置,但重新编译后发现没生效。折腾了半天,才发现是 output/build/ 里还残留着旧的编译缓存。解决办法很简单:执行 make clean 或者直接删掉 output/build/那个包目录,再重新编译。

4.3 基础配置:make menuconfig 到底在配什么?

好,到了最核心的一步。配置Buildroot,说白了就是回答三个问题:

  1. 你的CPU是什么架构?(ARM、x86、MIPS……)
  2. 你的板子用什么外设?(串口、网卡、USB……)
  3. 你的系统要装哪些软件?(Busybox、Dropbear、Python……)

这三个问题,全在make menuconfig这个界面里回答。你执行一下:

make menuconfig

你会看到一个蓝底白字的菜单界面。别被它复古的外表吓到,操作逻辑跟BIOS设置差不多:

  • 上下键:移动光标
  • 回车:进入子菜单
  • 空格或Y:选中某个选项(显示为[*])
  • N:取消选中
  • M:编译为模块(仅内核配置时有用)
  • 两次Esc:返回上一级

我个人习惯,拿到一个新板子后,第一步不是自己从头配,而是先找一个接近的defconfig。比如我用的是树莓派3B,我就直接:

make raspberrypi3_defconfig

然后执行make menuconfig微调。这样省掉80%的重复劳动。

4.4 核心配置项:你必须知道的几个位置

在menuconfig里,有几个地方我几乎每次都要进去看一眼:

4.4.1 Target options —— 选CPU

这里决定了你的rootfs跑在什么芯片上。比如ARM、ARM64、x86_64。选错了,编译出来的内核根本起不来。我见过有人拿ARM的rootfs去烧x86的板子,折腾了两天……

4.4.2 Build options —— 编译行为

这里我建议你改两个地方:

  • Download dir:改成你本地的固定缓存目录,比如/home/share/buildroot_dl。这样多个项目可以共用下载包,不用每次重新下载。
  • Number of jobs to run simultaneously:改成你CPU核心数+1,比如4核就填5。能明显加快编译速度。

4.4.3 Toolchain —— 工具链

这里选编译器。新手我建议用Buildroot internal toolchain,让Buildroot自己编译一个。虽然第一次编译慢一点,但兼容性最好。如果你有现成的交叉编译器,也可以选External toolchain。

4.4.4 System configuration —— 系统行为

这里配你rootfs的「长相」:

  • System hostname:板子的主机名,比如myboard
  • Root password:root用户的密码。我建议你设一个,别留空。曾经有客户的产品因为root密码为空,被扫到SSH弱口令,直接被人登录进去挖矿了。
  • Enable root login with password:允许root远程登录。如果你要调试,记得打开。

4.4.5 Target packages —— 装软件

这里就是你的「软件商店」。想装什么,进去勾上就行。比如:

  • Networking applications -> dropbear:轻量级SSH服务器
  • Shell and utilities -> bash:如果你不习惯Busybox的ash
  • Development tools -> gdb:调试用,但注意会增大rootfs体积
注意: 别贪多。每勾一个包,编译时间就多几分钟,rootfs体积也大几MB。我见过有人把Python、Node.js、OpenCV全塞进一个只有64MB Flash的板子里……结果编译了一下午,最后镜像放不下。先想清楚你的板子「必须」要什么,再动手。

4.5 第一次编译:耐心等待

配置完成后,保存退出。然后执行:

make

第一次编译会很久,取决于你的网络和CPU。Buildroot会先下载所有依赖包的源码,然后逐个交叉编译。我自己的经验:

  • 树莓派3B配置,4核i7,大概需要30-40分钟
  • 如果只选最小系统(Busybox+Dropbear),20分钟左右
  • 如果选了Qt或GStreamer,轻松奔着2小时去

编译过程中,你可以去喝杯咖啡,或者看看output/build/目录下有没有报错。如果某个包下载失败,Buildroot会停下来报错。这时候别慌,去dl/目录看看是不是缓存文件损坏了,删掉对应的.tar.gz重新make就行。

4.6 验证成果:看看你的rootfs

编译完成后,output/images/目录下会出现一堆文件。最核心的是:

  • rootfs.ext4 —— ext4格式的根文件系统镜像
  • zImage 或 Image —— 内核镜像
  • *.dtb —— 设备树文件

你可以用file命令看看它们是什么:

file output/images/rootfs.ext4
# 输出:Linux rev 1.0 ext4 filesystem data, UUID=...

嗯,看到这个输出,就说明你的rootfs已经构建成功了。接下来,你可以把它烧到SD卡或者Flash里,上电启动。

我第一次看到自己编译的rootfs在板子上打印出Welcome to Buildroot时,说实话,挺有成就感的。希望你也能体验到这种感觉。

核心总结: Buildroot的入门就三步——拿源码、配菜单、跑编译。目录结构记住 configs/(入口)、package/(规则)、output/images/(成果)就够了。别想太多,先跑起来再说。
Buildroot 入门核心流程 1. 源码获取 git clone 稳定版分支 2. 目录结构 configs/ package/ output/ 3. 基础配置 make menuconfig 选CPU / 选软件 / 选工具链 4. 执行编译 make 5. 验证成果 output/images/ 查看镜像 关键目录速查 configs/ → 预置配置入口 package/ → 软件包构建规则 output/images/ → 最终镜像 output/build/ → 编译中间文件 dl/ → 源码缓存 board/ → 板级支持包 fs/ → 文件系统生成逻辑 记住:入口在 configs/ 成果在 output/images/
我的建议: 第一次玩Buildroot,别急着改太多配置。先用一个现成的defconfig编译通过,感受一下整个流程。然后再慢慢加自己的软件包。这样出了问题,你知道是哪个环节导致的。

好了,这一章的内容就到这。你拿到源码、看懂目录、配好菜单、跑完编译,Buildroot的入门关就算过了。下一章,咱们会深入聊聊如何定制自己的rootfs,包括加软件包、改启动脚本、调文件系统大小。但那是后话了——先把这一章的内容消化掉,动手跑一遍再说。

可可精品资料库