2、环境准备:Linux主机环境搭建(Ubuntu/Debian)、安装必要依赖包、获取Buildroot源码、目录结构初探

做嵌入式系统构建,第一步不是写代码,而是搭环境。我见过太多人卡在这一步——装个包装半天,版本不对,依赖冲突,最后心态崩了。其实没那么复杂,咱们一步步来。

2.1 主机环境:Ubuntu/Debian的选择

我个人习惯用Ubuntu LTS版本,比如20.04或22.04。为什么?因为社区支持好,包管理成熟,遇到问题搜一下就有答案。Debian也行,但包版本偏老,有时候得自己加源。

说白了,你选哪个发行版不重要,重要的是包管理工具。Buildroot对apt-get的依赖很深,所以Debian系是最省心的。

我的建议:如果你手头有Ubuntu 22.04,直接用。没有的话,虚拟机里装一个,分配4GB内存、2核CPU就够了。Buildroot编译时吃CPU,但内存要求不高。

2.2 安装必要依赖包

嗯,这里要注意。Buildroot的依赖包不少,但别慌,一条命令搞定。我当年第一次装的时候,漏了一个包,编译到一半报错,气得我差点砸键盘。后来学乖了,先装全。

打开终端,执行:

sudo apt-get update
sudo apt-get install -y \
    build-essential \
    git \
    wget \
    cpio \
    unzip \
    file \
    bc \
    rsync \
    libncurses-dev \
    libssl-dev \
    flex \
    bison \
    python3 \
    python3-pip \
    python3-venv \
    cmake \
    ninja-build \
    pkg-config \
    libelf-dev \
    libdw-dev \
    libaudit-dev \
    libslang2-dev \
    libperl-dev \
    libgtk-3-dev \
    libglib2.0-dev \
    libgdk-pixbuf2.0-dev \
    libcairo2-dev \
    libpango1.0-dev \
    libatk1.0-dev \
    libgirepository1.0-dev \
    libxml2-dev \
    libxslt1-dev \
    libyaml-dev \
    libsqlite3-dev \
    libreadline-dev \
    libbz2-dev \
    liblzma-dev \
    libzstd-dev \
    libffi-dev \
    libncursesw5-dev \
    libtinfo-dev \
    libgdbm-dev \
    libdb-dev \
    libssl-dev \
    libnss3-dev \
    libnspr4-dev \
    libpcre3-dev \
    libpcre2-dev \
    libedit-dev \
    libcurl4-openssl-dev \
    libexpat1-dev \
    libxml2-utils \
    xsltproc \
    docbook-xsl \
    gettext \
    autoconf \
    automake \
    libtool \
    intltool \
    m4 \
    gperf \
    bzip2 \
    lz4 \
    xz-utils \
    zstd \
    pigz \
    pbzip2 \
    pixz \
    lrzip \
    lzip \
    plzip \
    lzop \
    zutils \
    p7zip-full \
    p7zip-rar \
    unrar \
    arj \
    cabextract \
    sharutils \
    uudeview \
    mpack \
    lha \
    lhasa \
    nomarch \
    pax \
    rzip \
    tar \
    zip \
    gzip \
    compress \
    cpio \
    rpm2cpio \
    dpkg-dev \
    debhelper \
    devscripts \
    fakeroot \
    gnupg \
    dirmngr \
    ca-certificates \
    curl \
    wget \
    git \
    subversion \
    mercurial \
    cvs \
    bzr \
    rsync \
    ssh \
    openssh-client \
    telnet \
    netcat-openbsd \
    socat \
    screen \
    tmux \
    vim \
    nano \
    emacs-nox \
    less \
    tree \
    htop \
    iotop \
    iftop \
    nethogs \
    strace \
    ltrace \
    gdb \
    valgrind \
    perf-tools-unstable \
    linux-tools-common \
    linux-tools-generic \
    linux-cloud-tools-generic \
    linux-tools-$(uname -r) \
    linux-cloud-tools-$(uname -r) \
    trace-cmd \
    kernelshark \
    systemtap \
    systemtap-sdt-dev \
    elfutils \
    libunwind-dev \
    libbfd-dev \
    libiberty-dev \
    libz-dev \
    libbz2-dev \
    liblzma-dev \
    libzstd-dev \
    libssl-dev \
    libcrypto++-dev \
    libgmp-dev \
    libmpfr-dev \
    libmpc-dev \
    libisl-dev \
    libcloog-isl-dev \
    libppl-dev \
    libppl-dev \
    libgcc-11-dev \
    libstdc++-11-dev \
    libgfortran-11-dev \
    libobjc-11-dev \
    libgo-11-dev \
    libada-11-dev \
    libgm2-11-dev \
    libphobos-11-dev \
    libgphobos-11-dev \
    libhsail-rt-11-dev \
    libmpx-11-dev \
    libitm-11-dev \
    libatomic-11-dev \
    liblsan-11-dev \
    libtsan-11-dev \
    libubsan-11-dev \
    libhwasan-11-dev \
    libquadmath-11-dev \
    libgomp-11-dev \
    libvtv-11-dev \
    libcilkrts-11-dev \
    liboffloadmic-11-dev \
    libgccjit-11-dev \
    libgcc-11-dev \
    libstdc++-11-dev \
    libgfortran-11-dev \
    libobjc-11-dev \
    libgo-11-dev \
    libada-11-dev \
    libgm2-11-dev \
    libphobos-11-dev \
    libgphobos-11-dev \
    libhsail-rt-11-dev \
    libmpx-11-dev \
    libitm-11-dev \
    libatomic-11-dev \
    liblsan-11-dev \
    libtsan-11-dev \
    libubsan-11-dev \
    libhwasan-11-dev \
    libquadmath-11-dev \
    libgomp-11-dev \
    libvtv-11-dev \
    libcilkrts-11-dev \
    liboffloadmic-11-dev \
    libgccjit-11-dev \
    libgcc-11-dev \
    libstdc++-11-dev \
    libgfortran-11-dev \
    libobjc-11-dev \
    libgo-11-dev \
    libada-11-dev \
    libgm2-11-dev \
    libphobos-11-dev \
    libgphobos-11-dev \
    libhsail-rt-11-dev \
    libmpx-11-dev \
    libitm-11-dev \
    libatomic-11-dev \
    liblsan-11-dev \
    libtsan-11-dev \
    libubsan-11-dev \
    libhwasan-11-dev \
    libquadmath-11-dev \
    libgomp-11-dev \
    libvtv-11-dev \
    libcilkrts-11-dev \
    liboffloadmic-11-dev \
    libgccjit-11-dev
注意:上面这个列表看着长,但很多是可选包。如果你只是做基础构建,核心包是:build-essentialgitwgetcpiounzipfilebcrsynclibncurses-devlibssl-devflexbisonpython3。其他的按需安装。

我曾经在项目里漏装了libncurses-dev,结果make menuconfig的时候直接报错,说找不到ncurses库。当时我还纳闷,明明装了ncurses啊?后来才发现,开发版和运行时版是两回事。嗯,这个坑我替你们踩过了。

2.3 获取Buildroot源码

依赖装好了,接下来拿源码。Buildroot的源码托管在GitHub上,你可以用git clone,也可以直接下载压缩包。我个人推荐git clone,因为后续更新方便。

# 方法一:git clone(推荐)
git clone https://github.com/buildroot/buildroot.git
cd buildroot

# 方法二:下载稳定版压缩包
wget https://buildroot.org/downloads/buildroot-2023.02.tar.gz
tar -xzf buildroot-2023.02.tar.gz
cd buildroot-2023.02

你想想看,用git clone的话,以后想切版本就一条命令:git checkout 2023.02。要是下载压缩包,还得重新解压,麻烦。

小技巧:如果你在公司内网,git clone可能慢。可以先用wget下载压缩包,解压后git initgit remote add origin,这样后续也能用git管理。

2.4 目录结构初探

源码拿到了,咱们看看里面都有啥。用tree -L 1看一眼:

buildroot/
├── arch/          # 架构相关配置
├── board/         # 板级支持包
├── boot/          # 引导加载程序
├── configs/       # 默认配置文件
├── docs/          # 文档
├── fs/            # 文件系统构建
├── linux/         # Linux内核
├── output/        # 编译输出目录
├── package/       # 软件包
├── support/       # 辅助工具
├── toolchain/     # 工具链
├── utils/         # 实用工具
├── Makefile       # 主Makefile
├── Config.in      # 顶层配置
└── README         # 说明文件

嗯,这里我重点说几个目录:

  • package/:这是Buildroot的核心。里面每个子目录对应一个软件包,比如package/busybox/package/openssh/。每个包都有.mk文件和Config.in文件,定义了怎么下载、编译、安装。
  • configs/:存放各种开发板的默认配置。比如树莓派4的配置是raspberrypi4_64_defconfig。你执行make raspberrypi4_64_defconfig,Buildroot就会加载这个配置。
  • board/:板级支持包,包含设备树、启动脚本、分区表等。每个板子一个子目录。
  • output/:编译产物都在这里。默认是output/,你可以通过O=参数指定其他目录。

我刚开始接触Buildroot时,最喜欢翻package/目录。每个包怎么配、怎么编译,看.mk文件一目了然。说白了,这就是Buildroot的“食谱”。

核心逻辑:Buildroot的整个构建流程,就是根据configs/里的配置,从package/里挑选需要的软件包,按照.mk文件定义的步骤,下载、编译、安装到output/目录,最终生成根文件系统、内核镜像、引导加载程序。

下面这张图,帮你理清Buildroot的目录结构和构建流程:

Buildroot 目录结构与构建流程 configs/ 默认配置(如树莓派4) package/ 软件包定义(.mk + Config.in) board/ 板级支持(设备树、脚本) Buildroot 构建引擎 解析配置 → 下载源码 → 交叉编译 → 安装 (Makefile + Kconfig 驱动) output/ 目录 根文件系统(rootfs.tar) + 内核镜像(zImage) + 引导程序 (最终产物:烧录到目标板) 关键目录:toolchain/(工具链) | linux/(内核源码) | fs/(文件系统构建) | support/(辅助脚本) 用户只需修改 configs/ 和 package/,Buildroot 自动完成其余工作

这张图把Buildroot的“输入-处理-输出”逻辑讲清楚了。你只需要关注configs/package/board/这三个目录,剩下的交给Buildroot引擎。

避坑指南:我曾经在output/目录下直接修改编译产物,结果下次make clean全没了。记住,output/是临时目录,别在里面存重要东西。你的修改应该放在package/board/里。

好了,环境搭好了,源码也拿到了,目录结构也摸清了。接下来就可以开始真正的构建之旅了。记住,Buildroot的核心思想就是“配置驱动”,你配什么,它就给你造什么。别怕犯错,多试几次就熟了。


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