2、环境准备:在Ubuntu上安装Buildroot依赖包,下载Buildroot源码,了解目录结构

好,咱们正式开始动手了。这一章说白了就是“磨刀不误砍柴工”。你想想看,如果连Buildroot的环境都没搭好,后面再怎么折腾也是白搭。我个人习惯在开始一个新项目前,先把工具链和依赖包理得清清楚楚,这样后面编译的时候才不会突然冒出一堆莫名其妙的错误。

2.1 安装Buildroot依赖包

Buildroot本身是一个构建系统,它依赖很多宿主机的工具。Ubuntu系统下,我们得先把这些依赖装好。我建议你直接用apt一次性搞定,省得后面缺一个装一个,烦得很。

核心依赖包清单

sudo apt update
sudo apt install -y \
    git \
    wget \
    make \
    gcc \
    g++ \
    libncurses-dev \
    flex \
    bison \
    bc \
    cpio \
    rsync \
    unzip \
    file \
    python3 \
    python3-pip \
    perl \
    openssl \
    libssl-dev \
    libelf-dev \
    u-boot-tools \
    device-tree-compiler

嗯,这里要注意。有些同学可能会问:“我装这么多包,会不会把系统搞乱?”其实不用担心,这些包都是编译时用的工具,不会影响你日常使用。我在项目中遇到过最坑的一次,就是忘了装libncurses-dev,结果make menuconfig的时候直接报错,折腾了半天才发现是缺了这个。

小提示:如果你用的是Ubuntu 20.04或22.04,上面的包基本够用。如果是更老的版本,可能还需要额外装libtoolautoconf之类的。建议先跑一遍,缺什么再补什么。

2.2 下载Buildroot源码

依赖装好了,接下来就是拿源码。我个人习惯用git clone,这样以后想切版本、看历史都很方便。当然,你也可以直接去官网下载tar包,但git的方式更灵活。

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

下载完成后,你可以看看当前是什么版本:

git tag -l | tail -10

我建议你选一个稳定的LTS版本,比如2024.02.x系列。为什么?因为LTS版本维护周期长,bug修复也及时。我曾经在生产项目里用过开发版,结果编译到一半发现某个包不兼容,那叫一个头疼。所以,稳字当头。

git checkout 2024.02.1

注意:不要直接使用master分支。master分支是开发分支,随时可能引入不稳定的改动。除非你想当小白鼠,否则老老实实用tag版本。

2.3 了解Buildroot目录结构

源码下载好了,咱们来看看它长什么样。你执行ls -l,会看到一堆目录和文件。别慌,我带你捋一遍核心的。

Buildroot核心目录结构

buildroot/
├── arch/            # 架构相关的配置和工具
├── board/           # 板级支持包(BSP),存放特定板子的配置
├── boot/            # 引导加载程序(uboot、grub等)
├── configs/         # 默认配置文件(defconfig)
├── docs/            # 文档
├── fs/              # 文件系统构建脚本
├── linux/           # Linux内核相关的构建逻辑
├── package/         # 所有软件包的构建规则
├── support/         # 辅助工具和脚本
├── toolchain/       # 工具链相关
├── Makefile         # 主Makefile
└── Config.in        # 顶层配置菜单

我来挑几个重点说说:

  • configs/:这里面放着各种开发板的默认配置。比如树莓派、BeagleBone、QEMU等。你执行make list-defconfigs就能看到所有支持的板子。我个人习惯先从这里找一个接近我硬件的配置,然后在此基础上修改,省时省力。
  • package/:这是Buildroot的灵魂。每个软件包(比如busybox、dropbear、nginx)都在这里有一个子目录,里面放着下载地址、编译选项、安装规则等。你想加什么功能,基本就是在这里加。
  • board/:存放板级相关的文件,比如设备树、分区表、启动脚本。如果你要适配一块新板子,这里就是你的主战场。
  • fs/:文件系统构建脚本。Buildroot支持多种文件系统格式(ext4、squashfs、initramfs等),这里定义了如何打包。

为了让你更直观地理解这些目录之间的关系,我画了一张图:

Buildroot 核心目录结构及构建流程 buildroot/ configs/ (板级配置) package/ (软件包) board/ (板级支持) • raspberrypi_defconfig • qemu_aarch64_virt_defconfig • beaglebone_defconfig • busybox/ • dropbear/ • nginx/ • dts/ (设备树) • genimage.cfg • post-build.sh 输出:根文件系统 (rootfs) output/images/rootfs.tar / rootfs.ext4 / ... 图:Buildroot 核心模块与构建流程

从这张图你可以看到,Buildroot的工作流程其实很清晰:

  1. configs/选择一个板级配置
  2. 根据配置,从package/拉取并编译需要的软件包
  3. 结合board/里的板级文件(设备树、分区表等)
  4. 最终生成完整的根文件系统镜像

说白了,Buildroot就是一个“配置驱动”的构建系统。你不需要手动去下载每个包、配置每个编译选项,它全帮你干了。我刚开始用的时候也觉得有点懵,但跑通一次之后,你就会发现它真的很省心。

我的经验:刚开始接触Buildroot,建议你先从qemu_x86_64_defconfig或者raspberrypi3_defconfig入手。这两个配置非常成熟,编译成功率极高。等你跑通了,再慢慢改自己的配置。我曾经一上来就改配置,结果编译报错,排查了三天才发现是某个依赖没选上。所以,先跑通再优化,这是铁律。

2.4 验证环境是否就绪

最后一步,咱们验证一下环境是不是真的准备好了。执行:

make qemu_x86_64_defconfig
make

如果一切顺利,你会看到Buildroot开始下载源码包、编译工具链、构建根文件系统。这个过程第一次会比较慢,因为要下载很多包。但别急,喝杯咖啡,等它跑完就行。

常见问题:如果编译过程中报错“xxx command not found”,说明你漏装了某个依赖包。回头看看2.1节的列表,缺什么补什么。另外,确保你的磁盘空间足够,Buildroot编译一次大概需要5-10GB的空间。

好了,环境准备就到这里。下一章咱们会真正开始配置Buildroot,打造属于你自己的根文件系统。记住,环境搭好了,后面就顺了。


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