环境搭建:Ubuntu系统准备、依赖包安装、获取Buildroot源码、目录结构解析

做嵌入式开发,环境搭建是绕不开的第一道坎。很多人觉得这步简单,随便装个Ubuntu就开始搞。但我见过太多人因为环境没配好,后面编译报错折腾一整天。说白了,这一步稳了,后面才能跑得快。

Ubuntu系统版本选择

我个人习惯用Ubuntu 20.04 LTS或22.04 LTS。为什么?因为Buildroot官方长期测试的就是这两个版本。你非要用最新的24.04也行,但有些依赖包的版本可能不兼容,到时候还得自己降级,何必呢?

我的建议:如果你刚入门,直接用Ubuntu 20.04 LTS。这个版本最稳,网上遇到问题也最好搜到解决方案。

系统装好后,第一件事就是换源。国内用户不换源,下载依赖包能等到你怀疑人生。我一般用清华源或阿里源,速度杠杠的。

# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 替换为清华源(Ubuntu 20.04为例)
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list

# 更新
sudo apt update
sudo apt upgrade -y

依赖包安装:一个都不能少

Buildroot对宿主机的依赖说多不多,说少不少。少了某个包,编译到一半突然报错,那才叫崩溃。我曾经就因为少装了rsync,排查了半小时才发现问题。

下面这个列表是我反复验证过的,直接复制粘贴就行:

sudo apt install -y \
    build-essential \
    git \
    wget \
    cpio \
    unzip \
    rsync \
    bc \
    python3 \
    python3-distutils \
    file \
    libncurses5-dev \
    libssl-dev \
    flex \
    bison \
    sed \
    gawk \
    patchelf
包名 作用 不装的后果
build-essential 编译器、make等基础工具 无法编译任何代码
libncurses5-dev menuconfig图形界面依赖 打不开配置菜单
flex + bison 词法/语法分析器 内核配置阶段报错
rsync 文件同步工具 编译输出阶段卡死
patchelf 修改ELF文件 某些软件包链接失败
注意:不要用apt install buildroot!Ubuntu仓库里确实有Buildroot包,但版本通常落后一年以上。我们一定要从官方源码编译。

获取Buildroot源码

源码获取有两种方式:稳定版和开发版。做课程或产品,我强烈建议用稳定版。

先看看官方有哪些版本:

# 访问Buildroot官网
https://buildroot.org/downloads/

我写这章时,最新的LTS版本是2024.02.x系列。下载方式如下:

# 方式一:直接下载tar包(推荐)
wget https://buildroot.org/downloads/buildroot-2024.02.tar.gz
tar -xzf buildroot-2024.02.tar.gz
cd buildroot-2024.02

# 方式二:git克隆(适合想跟踪最新提交的)
git clone git://git.buildroot.net/buildroot
cd buildroot
git checkout 2024.02

我个人更推荐方式一。为什么?因为tar包是官方打过tag的稳定版本,而git clone默认拉的是master分支,可能包含未完全测试的代码。你想想看,做产品最怕什么?最怕编译到一半发现某个commit有bug。

版本命名规则:

  • 2024.02 → 2024年2月发布的LTS版本,维护期长
  • 2024.05 → 2024年5月发布的非LTS版本
  • 2024.02-rc1 → 候选发布版,可能有bug

做产品选LTS,做实验可以选最新版。

目录结构解析:Buildroot的骨架

源码下载完后,别急着编译。先花10分钟看看目录结构。我刚开始学Buildroot时,就是靠这张图把整个框架理清楚的。

Buildroot 核心目录结构 buildroot/ arch/ board/ configs/ package/ dl/ output/ fs/ support/ toolchain/ docs/ 各目录作用说明: • arch/ — CPU架构相关配置(ARM、x86、RISC-V等) • board/ — 板级支持包,存放设备树、启动脚本等 • configs/ — 预设的defconfig配置文件(核心!) • package/ — 所有软件包的构建规则(.mk + Config.in) • dl/ — 下载的源码包缓存目录,避免重复下载 • output/ — 编译产物(镜像、根文件系统、工具链) • support/ — 辅助脚本和工具(如kconfig、legal-info) • toolchain/ — 工具链相关配置(外部工具链或Buildroot自编译)

这张图里,我标了三种颜色:

  • 绿色 — 存放配置和板级支持,你经常要改
  • 红色 — 核心配置文件,选芯片平台就靠它
  • 橙色/青色 — 编译产物和工具,一般不动

这里重点说几个目录:

configs/ — 你的起点

每次做新项目,我第一件事就是去configs/目录看看有没有现成的defconfig。比如树莓派3B+,直接make raspberrypi3_defconfig就搞定。没有现成的?那就找一个最接近的板子,复制一份改改。

package/ — 软件包的中心

这个目录下每个子目录就是一个软件包。比如你想加个openssh,就去package/openssh/看看。里面通常有两个文件:

  • Config.in — 菜单配置项,决定这个包是否显示在menuconfig里
  • openssh.mk — 构建规则,告诉Buildroot怎么下载、编译、安装

output/ — 你的成果

编译完成后,所有产物都在这里。我最常用的几个子目录:

路径 内容
output/images/ 最终镜像文件(zImage、rootfs.ext4、dtb等)
output/build/ 每个软件包的编译目录,调试用
output/target/ 根文件系统的目录结构,可以chroot进去检查
output/host/ 宿主机工具(交叉编译器、mkimage等)
小技巧:如果你只想重新编译某个包,不用全部重来。执行make <package>-dirclean清除该包的编译目录,再make <package>单独编译它。我在调试内核模块时经常这么干,省时间。

dl/ — 网络不好的人的救星

这个目录会自动缓存所有下载的源码包。我第一次编译时网络断了,重新make后发现它不会重新下载,而是直接用缓存。嗯,这个设计很贴心。

环境搭到这里,你已经有了一个可以工作的Buildroot开发环境。下一步就是选平台、配内核、加软件包,然后编译出你的第一个嵌入式系统镜像。