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」标签的版本号就行。
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,说白了就是回答三个问题:
- 你的CPU是什么架构?(ARM、x86、MIPS……)
- 你的板子用什么外设?(串口、网卡、USB……)
- 你的系统要装哪些软件?(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:板子的主机名,比如myboardRoot password:root用户的密码。我建议你设一个,别留空。曾经有客户的产品因为root密码为空,被扫到SSH弱口令,直接被人登录进去挖矿了。Enable root login with password:允许root远程登录。如果你要调试,记得打开。
4.4.5 Target packages —— 装软件
这里就是你的「软件商店」。想装什么,进去勾上就行。比如:
Networking applications->dropbear:轻量级SSH服务器Shell and utilities->bash:如果你不习惯Busybox的ashDevelopment tools->gdb:调试用,但注意会增大rootfs体积
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时,说实话,挺有成就感的。希望你也能体验到这种感觉。
configs/(入口)、package/(规则)、output/images/(成果)就够了。别想太多,先跑起来再说。
好了,这一章的内容就到这。你拿到源码、看懂目录、配好菜单、跑完编译,Buildroot的入门关就算过了。下一章,咱们会深入聊聊如何定制自己的rootfs,包括加软件包、改启动脚本、调文件系统大小。但那是后话了——先把这一章的内容消化掉,动手跑一遍再说。