4、首次构建实战:下载Buildroot源码,配置最小系统(qemu_x86_defconfig),执行make并分析构建日志
好,到了真正动手的时候了。
前面几章我们聊了理论,聊了流水线的设计思路。但说一千道一万,不如亲手跑一遍。这一章,我们就来一次完整的首次构建。目标很明确:下载Buildroot源码,用qemu_x86_defconfig配置一个最小系统,然后执行make,最后一起看看构建日志里到底藏了哪些门道。
4.1 下载Buildroot源码
我个人习惯把源码放在 ~/workspace/buildroot 下。你可以根据自己的喜好来,但路径里最好不要有中文或空格,免得后面编译时出些莫名其妙的错。
下载方式有两种:
- 官方发布版:去 https://buildroot.org/downloads/ 下载最新的稳定版 tarball。
- Git 克隆:如果你想紧跟最新特性,可以用 git 拉取。
我建议初学者先用稳定版。为什么?因为 git 上的 master 分支可能正在开发中,说不定哪天就引入了一个临时 bug。我在项目中就吃过这个亏——有一次为了一个新功能拉了最新代码,结果编译到一半报错,排查了半天才发现是某个提交还没合完。嗯,从那以后,生产环境我坚决用 tag 版本。
下载命令很简单:
# 方法一:下载稳定版
wget https://buildroot.org/downloads/buildroot-2024.02.tar.gz
tar -xzf buildroot-2024.02.tar.gz
cd buildroot-2024.02/
# 方法二:Git 克隆(可选)
git clone git://git.buildroot.net/buildroot
cd buildroot
git checkout 2024.02 # 切到稳定版 tag
解压完成后,看看目录结构。你会发现有 board/、configs/、package/ 这些文件夹。别急着深入,先有个印象就行。
4.2 配置最小系统:qemu_x86_defconfig
Buildroot 自带了很多现成的配置,放在 configs/ 目录下。我们要用的就是 qemu_x86_defconfig。这个配置会生成一个能在 QEMU 上跑的最小 x86 系统。
配置命令:
make qemu_x86_defconfig
执行完后,你会看到终端输出类似:
#
# configuration written to /home/user/workspace/buildroot/.config
#
这就说明配置已经写入了 .config 文件。你可以用 make menuconfig 看看具体选了哪些东西。不过第一次构建,我建议先别改,直接用默认配置跑一遍。先让它成功,再谈定制。
make show-targets。它会列出所有将要编译的软件包。我第一次看到那个列表时,心里想的是:“原来一个最小系统也要编译这么多东西啊!”
4.3 执行 make:第一次构建
好了,重头戏来了。执行:
make
就这么简单?对,就这么简单。但你要有心理准备——第一次构建会非常慢。因为要下载所有源码包,然后交叉编译工具链、内核、根文件系统……全套下来,在我的老笔记本上大概要 40 分钟到 1 小时。
你可以加个 -jN 参数来加速,N 是你的 CPU 核心数加 1。比如 4 核 CPU 可以用:
make -j5
构建过程中,你会看到屏幕上不断滚动的日志。别慌,这是正常的。我们来分析一下这些日志到底在说什么。
4.4 分析构建日志
构建日志看起来密密麻麻,但其实有规律可循。我把它分成几个阶段:
| 阶段 | 日志特征 | 说明 |
|---|---|---|
| 下载阶段 | >>> host-libtool ... Downloading |
Buildroot 会自动下载所有需要的源码包。如果网络不好,这里可能会卡住。 |
| 工具链编译 | >>> host-gcc-initial ... Building |
先编译宿主机的工具链,再编译交叉编译工具链。这是最耗时的阶段。 |
| 目标包编译 | >>> busybox ... Building |
编译目标系统上的软件包,比如 busybox、dropbear 等。 |
| 内核编译 | >>> linux ... Building |
编译 Linux 内核。如果你改了内核配置,这里会重新编译。 |
| 根文件系统生成 | >>> rootfs-* ... |
生成最终的根文件系统镜像,比如 ext2、squashfs 等。 |
每个阶段开始前,Buildroot 都会打印一行 >>> package-name ...。你可以根据这个来定位当前编译到哪里了。
如果编译过程中出现错误,日志里会有 *** 开头的行,后面跟着错误信息。比如:
make[3]: *** [package/busybox/busybox.mk:123] Error 1
这时候不要慌。先看错误信息的前几行,通常能看出是缺少依赖、网络问题还是代码编译错误。我遇到过最坑的一次是某个包的下载链接失效了,Buildroot 报了个 404 Not Found。解决办法是手动下载放到 dl/ 目录下。
4.5 构建成功后的产物
如果一切顺利,最后你会看到:
>>> Generating root filesystem image
>>> Generating images
>>> Done
构建产物都在 output/images/ 目录下。对于 qemu_x86_defconfig,你会看到:
bzImage:Linux 内核镜像rootfs.ext2:根文件系统镜像start-qemu.sh:启动 QEMU 的脚本
你可以直接运行 ./output/images/start-qemu.sh 来启动这个最小系统。登录用户名是 root,没有密码。
重要提醒: 第一次构建成功后,建议把 output/ 目录备份一下。因为后续如果你改了配置,重新 make 时会覆盖掉之前的产物。我习惯在每次成功构建后,把 output/images/ 打包成 build-YYYYMMDD.tar.gz 存起来。这样万一后面改坏了,还能回滚到已知的好版本。
4.6 常见问题与避坑
第一次构建,你可能会遇到这些问题:
- 下载超时:某些源码包托管在国外的服务器上,下载很慢甚至失败。解决办法是配置国内镜像源,或者用代理。
- 磁盘空间不足:Buildroot 编译过程中会占用大量磁盘空间,尤其是
output/目录。建议至少预留 10GB 空间。 - 缺少依赖:宿主机的编译工具链可能不完整。比如缺少
flex、bison等。根据错误提示安装即可。
我曾经有一次在编译到 80% 的时候,突然断电了。重启后重新 make,Buildroot 会从断点继续,但有些临时文件可能已经损坏。这时候最好执行 make clean 然后重新编译。嗯,从那以后我养成了在编译前保存工作的习惯。
4.7 本章小结
这一章我们亲手完成了第一次构建。从下载源码、配置最小系统、执行 make,到分析构建日志,每一步都走了一遍。你可能会觉得第一次构建很慢、很枯燥,但相信我,当你看到那个最小系统在 QEMU 里启动起来时,那种成就感是值得的。
下一章,我们会深入 Buildroot 的配置菜单,看看如何定制自己的系统。到时候,你就可以往系统里添加你想要的软件包了。
公众号:蓝海资料掘金营,微信deep3321