2. Buildroot 环境搭建:宿主机环境要求、安装依赖包、获取Buildroot源码、目录结构解析、首次配置与编译

搭建 Buildroot 环境,说白了就是给你的 Linux 开发机“配齐家伙”。

我见过不少新手,源码下载下来,一编译就报错,然后开始怀疑人生。其实大部分问题,都是宿主机环境没准备好。咱们先把这一步走稳,后面才顺。

2.1 宿主机环境要求

Buildroot 对宿主机的要求,其实不算高。但有几个硬指标,你得心里有数。

项目 最低要求 推荐配置 备注
操作系统 Ubuntu 18.04 / Debian 10 Ubuntu 22.04 LTS 其他发行版也行,但依赖包名可能不同
CPU 双核 4 核及以上 编译内核时,多核优势明显
内存 4 GB 8 GB 以上 编译大型文件系统时,内存不够会 swap
磁盘空间 20 GB 50 GB 以上 一次完整构建大约 10-15 GB
文件系统 ext4 ext4 / btrfs 不要用 NTFS 或 FAT,权限会出问题
注意: 我曾经在 NTFS 分区上尝试编译,结果符号链接全部失效,折腾了一下午才发现是文件系统的问题。所以,请务必使用原生 Linux 文件系统。

2.2 安装依赖包

这一步最容易被忽略。Buildroot 的依赖包,说多不多,说少不少。少了哪个,编译到一半就卡住。

我个人习惯,在 Ubuntu/Debian 上直接跑下面这条命令,一次性装齐:

sudo apt update
sudo apt install -y \
    git \
    wget \
    curl \
    build-essential \
    libncurses-dev \
    flex \
    bison \
    gperf \
    texinfo \
    help2man \
    unzip \
    file \
    libtool \
    libtool-bin \
    autoconf \
    automake \
    pkg-config \
    rsync \
    bc \
    python3 \
    python3-pip \
    cpio \
    lz4 \
    zstd \
    libssl-dev \
    libelf-dev

嗯,这里要注意。如果你用的是 CentOS 或 Fedora,包名会不一样。比如 libncurses-dev 在 CentOS 上叫 ncurses-devel。我建议你直接看 Buildroot 官方文档里的 System requirements 章节,那里有各发行版的对照表。

小技巧: 装完依赖后,可以跑一下 make check-dependencies(如果 Buildroot 版本支持),它会帮你检查还有哪些缺失。

2.3 获取 Buildroot 源码

源码获取,无非两种方式:

  1. 下载稳定版压缩包:去 buildroot.org 下载 .tar.gz 或 .tar.xz 文件。
  2. 克隆 Git 仓库:获取最新开发版或特定分支。

我建议你直接用 Git 克隆。为什么呢?因为方便切换版本,也方便查看提交历史。比如:

git clone https://git.buildroot.net/buildroot
cd buildroot

如果你想用某个稳定版本,比如 2024.02.x,可以这样:

git checkout 2024.02.x

我个人习惯,会在本地建一个 ~/workspace/buildroot 目录,专门放不同版本的 Buildroot。这样方便对比和回溯。

2.4 目录结构解析

拿到源码后,别急着编译。先看看它的骨架。Buildroot 的目录结构,其实很有章法。

下面这张图,是我自己整理的 Buildroot 核心目录关系:

Buildroot 核心目录结构 buildroot/ arch/ board/ configs/ package/ Config.in patches/ *.defconfig pkg1/ arch 架构配置 板级支持包 默认配置 软件包定义 关键目录说明 • arch/:存放 CPU 架构相关的配置和工具链定义 • board/:板级支持包,包含设备树、启动脚本、补丁等 • configs/:预置的 defconfig 文件,一键配置 • package/:所有软件包的 .mk 和 Config.in 定义

除了上面这些,还有几个目录你也要熟悉:

  • dl/:下载的源码包缓存目录。第一次编译时会自动创建,以后重编就不用再下载了。
  • output/:编译输出目录。所有构建产物都在这里,包括 images/(镜像文件)、build/(编译中间文件)、target/(目标文件系统)。
  • support/:Buildroot 自身的辅助脚本和工具。
  • toolchain/:工具链相关的配置和补丁。
核心理解: Buildroot 的目录设计,遵循“配置与代码分离”的原则。你改配置,不会污染源码;你改源码,也不会影响配置。这一点,在后续维护多个项目时,你会深有体会。

2.5 首次配置与编译

好了,环境搭好了,源码也拿到了。咱们来跑第一个例子。

我建议你从官方支持的开发板开始。比如 QEMU x86_64,这样你不需要真实硬件,就能验证整个流程。

步骤很简单:

  1. 选择默认配置
make qemu_x86_64_defconfig

这条命令会把 configs/qemu_x86_64_defconfig 的内容,复制到 .config 文件里。

  1. 自定义配置(可选)
make menuconfig

你会看到一个图形化界面。这里可以调整内核版本、文件系统类型、添加或删除软件包。第一次用,建议先不动,直接退出保存。

小技巧: 在 menuconfig 里,按 / 键可以搜索配置项。比如你想找 openssh,直接搜,它会告诉你路径。这个功能我几乎天天用。
  1. 开始编译
make -j$(nproc)

-j$(nproc) 的意思是,用你 CPU 的所有核心并行编译。我第一次编译时,用的是 4 核的老笔记本,大概等了 20 分钟。现在用 8 核的机器,10 分钟左右就能搞定。

注意: 第一次编译,Buildroot 会先下载所有依赖的源码包,然后编译交叉工具链、内核、根文件系统。这个过程,网络一定要稳定。我曾经在公司网络不好的时候编译,结果下载失败,整个流程卡住。建议你先用 make source 把所有源码包下载好,再开始编译。
  1. 验证结果

编译完成后,在 output/images/ 目录下,你会看到:

  • bzImage:内核镜像
  • rootfs.ext2:根文件系统
  • start-qemu.sh:启动 QEMU 的脚本

直接运行 ./output/images/start-qemu.sh,就能看到你的 Buildroot 系统跑起来了。

嗯,看到登录提示符的那一刻,你会觉得前面的所有折腾,都值了。