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
注意: 不要贪心把 -j 设得太大。我曾经在一台 8 核机器上设了 -j16,结果内存爆了,编译到一半直接 OOM(Out Of Memory)被杀。Buildroot 编译时每个任务都会吃内存,尤其是编译大型软件包如 GCC 时。建议 -j 参数不超过 (CPU核心数 × 2)。

构建过程中,你会看到屏幕上不断滚动的日志。别慌,这是正常的。我们来分析一下这些日志到底在说什么。

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 空间。
  • 缺少依赖:宿主机的编译工具链可能不完整。比如缺少 flexbison 等。根据错误提示安装即可。

我曾经有一次在编译到 80% 的时候,突然断电了。重启后重新 make,Buildroot 会从断点继续,但有些临时文件可能已经损坏。这时候最好执行 make clean 然后重新编译。嗯,从那以后我养成了在编译前保存工作的习惯。

4.7 本章小结

这一章我们亲手完成了第一次构建。从下载源码、配置最小系统、执行 make,到分析构建日志,每一步都走了一遍。你可能会觉得第一次构建很慢、很枯燥,但相信我,当你看到那个最小系统在 QEMU 里启动起来时,那种成就感是值得的。

下一章,我们会深入 Buildroot 的配置菜单,看看如何定制自己的系统。到时候,你就可以往系统里添加你想要的软件包了。

公众号:蓝海资料掘金营,微信deep3321