2、环境搭建:在Ubuntu上安装Buildroot依赖、下载源码、首次编译体验

好,咱们正式开始动手了。

这一章的目标很明确:在你的Ubuntu机器上,把Buildroot跑起来。说白了,就是装好依赖、拉下源码、敲一条命令,然后看着它编译出一个能用的根文件系统。

我第一次接触Buildroot时,以为这玩意儿配置起来会很复杂。结果发现,只要环境干净,三步就能走通。嗯,这里要注意——我说的「干净」,是指别缺依赖。否则编译到一半报错,那才叫崩溃。

2.1 安装Buildroot依赖

Buildroot本身是个Makefile集合,它依赖宿主机上的各种工具链。我个人习惯用apt一把梭,把常用的开发包全装上。

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

sudo apt update
sudo apt install -y \
    build-essential \
    git \
    wget \
    cpio \
    unzip \
    rsync \
    bc \
    python3 \
    python3-distutils \
    file \
    libncurses-dev \
    libssl-dev \
    flex \
    bison \
    gawk \
    gettext \
    texinfo \
    patch \
    diffstat \
    chrpath \
    socat \
    xz-utils \
    zstd

这里我列了二十多个包。你可能会问:「这么多都要装?」

是的。我曾经在项目里漏装了libncurses-dev,结果make menuconfig界面死活出不来,卡了我半小时。后来发现就是缺这个库。所以,别偷懒,全装上

小提示:如果你用的是Ubuntu 20.04或22.04,上面的包列表基本够用。如果是更老的版本(比如18.04),可能需要额外装python2。不过现在都2025年了,建议直接用22.04 LTS。

2.2 下载Buildroot源码

依赖装好,接下来拿源码。

Buildroot的官方仓库在GitHub上。我个人习惯用git clone,这样以后切换版本、查看历史都很方便。

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

如果你网络不好,也可以去官网下载tar包。但我建议用git,因为你可以随时切到某个稳定版本:

git tag -l '2024.*'   # 查看所有2024年的版本
git checkout 2024.02  # 切到2024.02版本

为什么要切版本?因为Buildroot的master分支可能不稳定。我在项目中吃过亏——用master编译出来的内核死活起不来,后来发现是某个patch还没合入。从那以后,我只用LTS版本

注意:不要用root用户执行git clone。Buildroot官方明确建议用普通用户编译。用root编译可能会产生权限问题,而且不安全。

2.3 首次编译体验

源码到手,咱们来一次「默认配置编译」。这是最快验证环境是否搭好的方式。

Buildroot为很多开发板提供了默认配置。比如树莓派3B+:

make raspberrypi3_defconfig

这条命令会生成一个.config文件。你可以用make menuconfig查看和修改配置。不过第一次编译,我建议先不动它,直接跑:

make

然后……去泡杯咖啡吧。

首次编译会下载所有源码包(内核、busybox、工具链等),然后交叉编译。时间取决于你的网速和CPU。我自己的机器(i7-12700,32GB内存)大概需要15-20分钟。如果是虚拟机,可能要40分钟以上。

编译过程中,你会看到类似这样的输出:

>>>   host-gcc-initial 12.3.0 Building
>>>   linux 6.1.31 Extracting
>>>   busybox 1.36.1 Configuring
...

看到这些,说明一切正常。如果中途报错,99%是依赖没装全。回头检查2.1节。

编译成功后的产物:

编译完成后,所有输出都在output/images/目录下。你会看到:

  • zImage — 内核镜像
  • rootfs.tar — 根文件系统tar包
  • sdcard.img — 完整的SD卡镜像(如果配置了)

2.4 核心逻辑:Buildroot的编译流程

为了让你更直观地理解Buildroot干了什么,我画了一张流程图:

Buildroot 编译流程 1. 下载源码包 (内核、busybox、工具链等) 2. 构建交叉工具链 (gcc、glibc/uclibc等) 3. 编译内核 (配置、编译、生成zImage) 4. 构建根文件系统 (busybox、库、应用) 输出: output/images/ 关键点 • 所有步骤自动完成 • 支持增量编译 • 可单独重新编译某组件 • 输出目录可配置

这张图展示了Buildroot的核心逻辑:下载 → 工具链 → 内核 → 根文件系统。每一步都是自动化的,你只需要敲一次make

2.5 常见问题与避坑

编译过程中,你可能会遇到一些问题。我把自己踩过的坑列出来:

问题 原因 解决方法
fatal error: curses.h: No such file or directory 缺少ncurses库 sudo apt install libncurses-dev
Can't find libssl 缺少OpenSSL开发包 sudo apt install libssl-dev
make: *** No rule to make target 'raspberrypi3_defconfig' 版本不对或拼写错误 make list-defconfigs查看所有可用配置
编译到一半卡住不动 网络问题,下载源码包超时 检查网络,或手动下载放到dl/目录
我曾经踩过的坑:有一次编译到90%突然报错,提示Kernel panic - not syncing: VFS: Unable to mount root fs。查了半天,发现是内核配置里忘了开启ext4文件系统支持。所以,第一次编译尽量用官方默认配置,别自己乱改。

2.6 验证编译结果

编译完成后,检查output/images/目录:

ls -lh output/images/

你应该能看到类似这样的文件:

-rw-r--r-- 1 user user 4.5M Jun 10 10:30 zImage
-rw-r--r-- 1 user user 2.1M Jun 10 10:30 rootfs.cpio
-rw-r--r-- 1 user user 1.2G Jun 10 10:30 sdcard.img

如果你用的是树莓派默认配置,sdcard.img可以直接用dd命令烧录到SD卡:

sudo dd if=output/images/sdcard.img of=/dev/sdX bs=4M status=progress

注意:/dev/sdX是你的SD卡设备,千万别写错了。我当年就把笔记本的硬盘给覆盖了……嗯,从那以后我每次烧录前都会用lsblk确认三遍。

小技巧:如果你不想烧录到真实硬件,可以用QEMU模拟运行。Buildroot默认配置生成的rootfs.cpio可以直接在QEMU里启动:
qemu-system-arm -M versatilepb -kernel output/images/zImage -initrd output/images/rootfs.cpio -append "console=ttyAMA0" -nographic

好了,环境搭建就到这里。你现在应该有一个能正常编译的Buildroot环境了。下一章,我们会深入make menuconfig,看看怎么定制自己的系统。


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