3、快速上手:make menuconfig配置、选择目标架构(ARM64为例)、执行make编译
好,咱们直接进入正题。上一章我们把 Buildroot 源码拉下来了,也把依赖装好了。现在就该让它真正干活了。
说白了,Buildroot 的配置流程跟 Linux 内核的配置非常像——你运行 make menuconfig,然后在一个图形界面里勾勾选选,最后保存退出。我当年第一次用的时候,心里还嘀咕:这不就是内核配置那套东西吗?嗯,确实差不多,但细节上还是有不少坑的。
3.1 启动配置界面
在 Buildroot 源码根目录下,直接敲命令:
cd buildroot
make menuconfig
你会看到一个蓝底白字的菜单界面。如果报错说缺少 ncurses 库,那就回去装一下:
sudo apt install libncurses-dev # Ubuntu/Debian
sudo yum install ncurses-devel # CentOS/RHEL
我个人习惯在干净的终端里做这件事,窗口别太小,不然菜单会显示不全。你想想看,要是菜单被截断了,选错选项可就麻烦了。
export TERM=xterm-256color 可以改善。
3.2 选择目标架构——以 ARM64 为例
进入菜单后,第一件大事就是告诉 Buildroot:你要给谁做镜像?
按方向键找到 Target options,回车进去。这里你会看到:
| 配置项 | 说明 | 我常用的值 |
|---|---|---|
| Target Architecture | 目标 CPU 架构 | AArch64 (little endian) |
| Target Architecture Variant | CPU 变体 | cortex-a53 / cortex-a72 |
| Target ABI | 二进制接口 | EABIhf (硬浮点) |
| Floating point strategy | 浮点策略 | VFPv4 / NEON |
选 AArch64 (little endian) 就是 ARM64 了。为什么是 little endian?因为绝大多数 ARM64 芯片都用小端模式,包括树莓派、RK3399、鲲鹏这些。大端模式?我在项目中几乎没见过,除非你在搞一些很特殊的网络设备。
3.3 配置工具链和系统组件
选完架构,接下来是工具链。回到主菜单,进 Toolchain:
- Toolchain type:我建议选
Buildroot internal toolchain,让 Buildroot 自己编译交叉编译器。省心。 - Kernel headers:选一个跟你 Linux 内核版本匹配的系列。比如你打算用 5.10 内核,就选 5.10.x。
- C library:一般选
glibc,兼容性好。如果做嵌入式小系统,可以试试musl,体积更小。
然后进 System configuration,这里设置你镜像的基本信息:
- System hostname:比如
myboard - System banner:登录时显示的欢迎语,随便写
- Root password:建议设一个,别留空。我见过有人生产环境用空密码,结果被扫了
- Enable root login with password:选上
其他选项像 Target packages 里可以选你需要的软件包,比如 openssh、dropbear、vim、python 等等。不过第一次编译,我建议先别加太多东西,先跑通一个最小系统再说。
3.4 保存配置并退出
配置完成后,按 Tab 键切换到 Save,回车。它会问你要保存到哪个文件,默认是 .config,直接回车就行。然后按 Exit 退出。
这时候你会在 Buildroot 目录下看到一个 .config 文件。你可以把它备份一份:
cp .config configs/myboard_defconfig
以后想重新编译,直接 make myboard_defconfig 就能恢复配置。这个习惯我建议你养成,尤其是做多个项目的时候。
3.5 执行 make 编译
配置搞定,接下来就是最耗时的一步——编译。
make -j$(nproc)
-j$(nproc) 的意思是让 CPU 有多少核就用多少线程编译。比如你的电脑是 8 核,那就是 -j8。我第一次编译 ARM64 的 rootfs,大概花了 40 分钟,取决于你的网络和机器性能。
编译过程中,你会看到屏幕上刷刷地滚日志。如果一切顺利,最后会看到类似这样的输出:
>>> Generating root filesystem image rootfs.tar
>>> Generating root filesystem image rootfs.cpio
>>> Generating root filesystem image rootfs.ext2
>>> Generating root filesystem image rootfs.squashfs
这些就是生成的 rootfs 镜像文件,放在 output/images/ 目录下。
3.6 编译失败怎么办?
说实话,第一次编译很少能一次过。我遇到过的问题包括:
- 网络超时:下载源码包时断了。Buildroot 支持断点续传,重新运行
make就行。 - 磁盘空间不足:编译过程中会生成大量临时文件,至少留 10GB 空间。
- 依赖缺失:比如缺少
rsync、bc、flex等工具。看日志里的 error 信息,缺啥装啥。 - 配置冲突:比如选了 musl 又选了某些只支持 glibc 的包。这时候需要调整配置。
我曾经在编译一个带有 Qt 的 rootfs 时,卡在某个包上整整两天。最后发现是 host 机器的 gcc 版本太老。升级之后就好了。所以,如果你的编译环境比较旧,建议先升级一下基础工具链。
3.7 本章知识结构图
下面这张图帮你理清整个配置和编译的流程:
3.8 验证镜像是否生成
编译完成后,检查一下输出目录:
ls -lh output/images/
你应该能看到类似这样的文件:
rootfs.tar—— 打包格式,适合解压到分区rootfs.cpio—— 常用于 initramfsrootfs.ext2—— ext2 文件系统镜像,可直接 dd 到分区rootfs.squashfs—— 只读压缩文件系统,适合嵌入式
每个镜像的大小取决于你选了哪些包。一个最小系统大概 2~8MB,加了 Qt、Python 这些就会膨胀到几十甚至上百 MB。
output/images/ 目录打包存档,同时把 .config 和 output/build/packages-file-list.txt 也保存下来。这样以后想查某个包有没有被编译进去,直接翻文件列表就行,不用重新编译。
好了,到这里你已经成功用 Buildroot 编译出了一个 ARM64 的 rootfs 镜像。整个过程其实不复杂,就是第一次等得有点久。后面几章我们会讲怎么把这个镜像烧到板子上,以及怎么定制自己的软件包。