第2章:环境准备:Linux主机环境要求、安装必要依赖包、下载Buildroot源码、目录结构初探

好,咱们正式开始动手了。这一章,说白了就是搭台子。台子搭不好,后面唱戏全得摔跟头。我见过太多新手,一上来就急着编译,结果缺这个少那个,折腾半天连个菜单都出不来。别急,咱们一步步来。

2.1 Linux主机环境要求

先说说主机。Buildroot这东西,说白了就是个自动化编译工具。它会在你的电脑上交叉编译出一整套嵌入式系统。所以,你的主机得够用。

硬件方面:

  • CPU:双核以上,四核更佳。编译是个吃CPU的活儿,核心越多越快。我自己的笔记本是8核的,编译一个完整系统大概十几分钟。
  • 内存:至少4GB,推荐8GB以上。你想想看,编译过程中要同时处理成千上万个文件,内存小了直接卡死。
  • 硬盘:至少20GB空闲空间。Buildroot源码本身不大,但下载的软件包和编译产物会占不少地方。我个人习惯留出50GB,省心。
  • 网络:必须能上网。Buildroot会从网上拉取各种软件包的源码,没网寸步难行。

软件方面:

  • 操作系统:推荐Ubuntu 20.04 LTS或22.04 LTS。Debian、Fedora、CentOS也行,但Ubuntu的社区支持最好,遇到问题好搜答案。
  • 文件系统:建议使用ext4。NTFS或FAT32可能会有权限问题,我在项目中遇到过因为文件系统不兼容导致的编译失败,排查了半天才发现是挂载参数不对。
⚠️ 注意:不要用Windows的WSL1,WSL2勉强能用,但性能不如原生Linux。如果你只有Windows,建议装个虚拟机,分配4核8G内存,跑起来很顺畅。

2.2 安装必要依赖包

Buildroot依赖一堆工具链。少了任何一个,编译到一半就会报错。嗯,这里要注意,不同发行版的包名可能不一样,我以Ubuntu为例。

打开终端,执行以下命令:

sudo apt update
sudo apt install -y \
    build-essential \
    git \
    wget \
    cpio \
    unzip \
    rsync \
    bc \
    file \
    python3 \
    python3-distutils \
    libncurses-dev \
    libssl-dev \
    flex \
    bison \
    gcc-multilib \
    libc6-dev-i386 \
    lib32z1 \
    lib32stdc++6

这些包是干什么的?我简单说说:

  • build-essential:编译必备,包含gcc、g++、make等。
  • libncurses-dev:提供菜单配置界面,就是那个蓝底白字的配置菜单。
  • flexbison:词法分析和语法分析工具,很多软件包需要它们生成代码。
  • gcc-multilib:如果你要在64位主机上编译32位系统,这个必须装。
💡 小技巧:我曾经因为漏装了libssl-dev,导致编译Linux内核时SSL模块报错。后来我养成了一个习惯:每次装完依赖后,先跑一下make defconfig,如果没报错,说明环境基本OK了。

2.3 下载Buildroot源码

依赖装好了,接下来就是拿源码。Buildroot的源码托管在GitHub上,我们用git克隆下来。

cd ~
git clone https://github.com/buildroot/buildroot.git
cd buildroot

克隆完成后,你会得到一个buildroot目录。我个人习惯用git tag查看版本,然后切换到稳定版:

git tag -l '2024.*'
git checkout 2024.02

为什么要切到稳定版?因为master分支可能处于开发状态,有些功能不稳定。我在项目中吃过这个亏,用master分支编译到一半发现某个包版本冲突,折腾了两天才搞定。从那以后,我只用稳定版。

如果你不想用git,也可以直接下载压缩包:

wget https://buildroot.org/downloads/buildroot-2024.02.tar.gz
tar -xzf buildroot-2024.02.tar.gz
cd buildroot-2024.02

两种方式都可以,看个人习惯。我推荐用git,因为后续更新方便,一个git pull就搞定了。

2.4 目录结构初探

源码下载好了,咱们进去看看。用ls -l命令,你会看到一堆目录和文件。别慌,我带你捋一遍核心结构。

先上一张图,让你有个整体印象:

buildroot/ arch/ board/ configs/ package/ support/ toolchain/ dl/ output/ fs/ 架构相关配置 板级支持包 默认配置 软件包定义 辅助脚本 工具链配置 下载缓存 编译输出 文件系统 核心目录速记口诀 arch board configs → 配置层 package support toolchain → 构建层

好了,图看完了,咱们一个个说:

目录/文件 作用 我的经验
arch/ 存放CPU架构相关的配置,比如ARM、x86、MIPS等 一般不用动,除非你要加一个Buildroot不支持的架构
board/ 板级支持包,包含特定开发板的配置文件、补丁、脚本 如果你用的是树莓派、BeagleBone等常见板子,这里能找到现成的
configs/ 默认配置,运行make defconfig时从这里读取 我经常用make raspberrypi4_defconfig快速开始
package/ 所有软件包的定义,每个包一个子目录 这是最核心的目录,后面我们会频繁进出
support/ 辅助脚本和工具,比如下载器、依赖检查 出问题时,这里的脚本能帮你定位
toolchain/ 工具链相关的配置和补丁 如果你用外部工具链,这里需要改
dl/ 下载的软件包源码缓存 编译一次后,下次就不用重新下载了
output/ 编译产物,包括镜像、根文件系统、编译日志 这个目录可以删掉,重新编译会重建
fs/ 文件系统相关的配置,比如squashfs、ext2、cpio 决定你的根文件系统用什么格式
Config.in 顶层配置菜单,类似Kconfig文件 想加全局配置选项,就在这里加
Makefile 顶层Makefile,整个构建的入口 别乱改,除非你知道自己在做什么

🔑 核心要点:你只需要关注configs/package/board/output/这四个目录。其他目录,说实话,90%的情况下你根本不用碰。

嗯,到这里,环境就准备好了。依赖装了,源码下了,目录结构也心里有数了。下一章,咱们就开始第一次编译,看看Buildroot到底是怎么工作的。


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