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

我个人习惯在干净的终端里做这件事,窗口别太小,不然菜单会显示不全。你想想看,要是菜单被截断了,选错选项可就麻烦了。

小技巧: 如果你在远程 SSH 里操作,确保终端支持 256 色,否则界面可能很难看。用 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、鲲鹏这些。大端模式?我在项目中几乎没见过,除非你在搞一些很特殊的网络设备。

注意: 架构变体别选错了。比如你用的是树莓派 3B+,它的 CPU 是 Cortex-A53,那就选 cortex-a53。选高了可能编译出无法运行的指令,选低了又浪费硬件性能。我曾经帮一个同事排查问题,他给 A72 的板子选了 cortex-a53,结果跑起来性能差了一大截。

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 分钟,取决于你的网络和机器性能。

第一次编译会特别慢,因为 Buildroot 要下载并编译整个交叉工具链、内核头文件、C 库、busybox 等等。第二次以后就快多了,因为工具链会被缓存。

编译过程中,你会看到屏幕上刷刷地滚日志。如果一切顺利,最后会看到类似这样的输出:

>>>   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 本章知识结构图

下面这张图帮你理清整个配置和编译的流程:

Buildroot 配置与编译流程(ARM64 为例) 1. make menuconfig 2. Target options → AArch64 3. Toolchain → internal 4. System configuration 5. Save → Exit 6. make -j$(nproc) 输出文件位于 output/images/ 目录:rootfs.tar, rootfs.cpio, rootfs.ext2, rootfs.squashfs 备份配置:cp .config configs/myboard_defconfig

3.8 验证镜像是否生成

编译完成后,检查一下输出目录:

ls -lh output/images/

你应该能看到类似这样的文件:

  • rootfs.tar —— 打包格式,适合解压到分区
  • rootfs.cpio —— 常用于 initramfs
  • rootfs.ext2 —— ext2 文件系统镜像,可直接 dd 到分区
  • rootfs.squashfs —— 只读压缩文件系统,适合嵌入式

每个镜像的大小取决于你选了哪些包。一个最小系统大概 2~8MB,加了 Qt、Python 这些就会膨胀到几十甚至上百 MB。

我的习惯: 第一次编译成功后,我会把 output/images/ 目录打包存档,同时把 .config 和 output/build/packages-file-list.txt 也保存下来。这样以后想查某个包有没有被编译进去,直接翻文件列表就行,不用重新编译。

好了,到这里你已经成功用 Buildroot 编译出了一个 ARM64 的 rootfs 镜像。整个过程其实不复杂,就是第一次等得有点久。后面几章我们会讲怎么把这个镜像烧到板子上,以及怎么定制自己的软件包。