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

好,咱们正式开始动手了。这一章说白了就是搭台子——把Buildroot跑起来需要的基础环境准备好。我见过不少新手一上来就急着编译,结果卡在依赖缺失上,折腾半天。咱们先把地基打牢,后面就顺了。

2.1 为什么选Ubuntu 22.04 LTS?

你可能要问:为什么非得是Ubuntu 22.04?我用别的发行版行不行?

当然可以。Buildroot对宿主机的依赖其实不算苛刻,主流Linux发行版都能跑。但我个人习惯用Ubuntu LTS版本,原因很简单:

  • 包管理成熟:apt仓库里的软件包版本够新,依赖关系清晰
  • 社区支持好:遇到问题,网上搜到的解决方案十有八九都是Ubuntu的
  • 长期稳定:LTS版本有5年支持,你今年学的,三年后还能用

我建议你直接用Ubuntu 22.04,省心。如果你用的是其他版本,比如20.04或者Debian,也没关系,依赖包的名字可能略有不同,但思路完全一样。

2.2 安装Buildroot依赖包

Buildroot本身是个编译框架,它需要调用你宿主机上的各种工具。比如gcc、make、flex、bison等等。这些工具缺一个,编译就会报错。

嗯,这里要注意:不要试图用apt一个一个装,那样太慢了。Buildroot官方文档里其实列了一个依赖清单,我帮你整理好了,直接复制下面这条命令就行:

sudo apt update
sudo apt install -y \
    build-essential \
    bc \
    cmake \
    cpio \
    file \
    flex \
    bison \
    g++ \
    gcc \
    git \
    libncurses-dev \
    libssl-dev \
    make \
    ninja-build \
    python3 \
    python3-pip \
    rsync \
    unzip \
    wget \
    xz-utils \
    zip
小提示:如果你是在虚拟机或者Docker里跑,记得先执行 sudo apt update 更新一下软件源。我遇到过好几次因为源没更新,装了个旧版本导致编译报错的情况。

装完之后,你可以验证一下关键工具是否就位:

gcc --version
make --version
git --version
python3 --version

如果都能正常输出版本号,那依赖环境就OK了。

2.3 下载Buildroot源码

依赖装好了,接下来就是拿源码。Buildroot的源码托管在GitHub上,你可以用git clone,也可以直接下载压缩包。

我个人习惯用git clone,因为后面如果你想切分支、看历史、或者自己打补丁,git操作起来方便。命令如下:

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

克隆完成后,你会看到当前目录下多了一个 buildroot 文件夹。咱们进去看看:

cd ~/buildroot
ls -la
注意:不要用root用户直接操作Buildroot。我曾经见过有人用root编译,结果生成的镜像权限混乱,烧到板子上启动不了。建议用普通用户,必要时加sudo。

如果你不想用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 了解Buildroot的目录结构

源码下载好了,咱们来解剖一下它的目录结构。你想想看,一个嵌入式系统镜像的生成,涉及内核、根文件系统、bootloader、工具链等等。Buildroot把这些东西都组织得井井有条。

执行 ls -l,你会看到类似这样的输出:

drwxrwxr-x  2 user user  4096 2月  20 10:00 arch
drwxrwxr-x  2 user user  4096 2月  20 10:00 board
drwxrwxr-x  2 user user  4096 2月  20 10:00 boot
drwxrwxr-x  2 user user  4096 2月  20 10:00 configs
drwxrwxr-x  2 user user  4096 2月  20 10:00 docs
drwxrwxr-x  2 user user  4096 2月  20 10:00 fs
drwxrwxr-x  2 user user  4096 2月  20 10:00 linux
drwxrwxr-x  2 user user  4096 2月  20 10:00 package
drwxrwxr-x  2 user user  4096 2月  20 10:00 support
drwxrwxr-x  2 user user  4096 2月  20 10:00 system
drwxrwxr-x  2 user user  4096 2月  20 10:00 toolchain
-rw-rw-r--  1 user user  12345 2月  20 10:00 Makefile
-rw-rw-r--  1 user user  67890 2月  20 10:00 Config.in

每个目录都有它的职责。我挑几个核心的给你讲讲:

目录/文件 作用 我的经验
arch/ 存放CPU架构相关的配置,比如ARM、x86、RISC-V 选错架构,编译出来的镜像根本跑不起来。我踩过这个坑
board/ 板级支持包,包含特定开发板的配置、补丁、脚本 如果你用的是常见板子(比如树莓派),这里已经有现成的
boot/ bootloader相关,比如U-Boot、GRUB 大部分嵌入式板子用U-Boot,这里就是它的家
configs/ 预置的默认配置文件,比如 raspberrypi4_defconfig 新手从这里开始最稳妥,省去手动配置的麻烦
package/ 所有软件包的构建规则,每个包一个子目录 你想加什么软件,就在这里加。比如加个nginx
linux/ Linux内核的构建配置 内核版本、补丁、配置项都在这里控制
toolchain/ 交叉编译工具链的配置 你可以用Buildroot自己编译工具链,也可以使用外部工具链
fs/ 根文件系统的构建逻辑,比如ext4、squashfs、initramfs 文件系统格式选错了,板子可能无法挂载根分区
system/ 根文件系统的骨架,比如 /etc/inittab/etc/fstab 你可以在这里定制系统启动时的默认行为
support/ 辅助脚本和工具,比如下载器、依赖检查 一般不用动,但出了问题可以来这里查日志
Makefile 顶层Makefile,整个构建的入口 你执行 make 时,就是它调度一切
Config.in Kconfig风格的配置菜单入口 执行 make menuconfig 时,就是读这个文件

你看,这个结构其实很清晰:arch 管硬件架构,board 管具体板子,package 管软件包,linux 管内核,toolchain 管工具链。各司其职,互不干扰。

核心逻辑:Buildroot的目录设计遵循了「关注点分离」的原则。你不需要一次性搞懂所有目录,只需要知道:
- 想改内核配置?去 linux/ 或执行 make linux-menuconfig
- 想加个软件?去 package/ 下新建目录
- 想换文件系统格式?去 fs/ 里选
- 想用现成配置?去 configs/ 里找

2.5 用SVG画一张结构图

光说可能不够直观,我画了一张图,把Buildroot的核心目录和它们之间的关系展示出来。你看一眼就明白了:

Buildroot 核心目录结构 Makefile (入口) Config.in (配置菜单入口) arch/ (架构) board/ (板级支持) configs/ (预置配置) package/ (软件包) linux/ (内核) toolchain/ (工具链) fs/ (文件系统) system/ (系统骨架) support/ (辅助工具) 图:Buildroot 核心目录结构及关系 左侧:硬件相关 | 中间:构建核心 | 右侧:系统生成

从这张图你可以看到,Buildroot的目录分成了三大块:左侧是硬件相关的(架构、板级、配置),中间是构建核心(软件包、内核、工具链),右侧是系统生成(文件系统、骨架、辅助工具)。你每次编译,其实就是从左侧选一个配置,中间选一些软件,右侧生成最终的镜像。

2.6 避坑指南:我踩过的几个坑

环境准备这一步看似简单,但有几个地方容易出问题。我把自己踩过的坑列出来,你注意一下:

  • 依赖包版本太旧:Ubuntu 20.04的某些包版本偏低,可能导致Buildroot编译报错。我建议用22.04,或者手动升级cmake、gcc等关键工具。
  • 磁盘空间不足:Buildroot编译过程中会下载大量源码包,生成中间文件。一个完整的编译可能占用10-20GB空间。我建议至少预留30GB。
  • 网络问题:Buildroot需要从GitHub、kernel.org等站点下载源码。如果你在墙内,可能需要配置代理。我曾经因为网络超时,编译到一半卡住,白白浪费了半小时。
  • 权限问题:不要在root下操作,也不要把源码放在 /root/opt 等需要sudo的目录。放在 ~/buildroot 最安全。
重要提醒:如果你用的是Windows + WSL2,注意WSL2的磁盘性能比原生Linux差不少。我建议直接用虚拟机或者双系统,编译速度能快30%以上。

2.7 本章小结

好,咱们把环境准备这一步走完了。总结一下你做了哪些事:

  1. 安装了Buildroot所需的依赖包(gcc、make、flex、bison等)
  2. 用git clone或wget下载了Buildroot源码
  3. 了解了Buildroot的目录结构,知道每个目录是干什么的
  4. 通过SVG图理清了核心目录之间的关系

嗯,到这里,你的开发环境就搭好了。下一章咱们会真正开始配置Buildroot,生成第一个系统镜像。到时候你会发现,前面这些准备工作有多重要。

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