2. 环境搭建:Ubuntu环境准备、安装依赖包、下载Buildroot源码、首次配置与编译
好,咱们正式开始动手。这一章说白了就是搭台子,台子搭稳了,后面唱戏才不慌。我见过不少新手,一上来就急着配内核、改驱动,结果编译环境没弄好,卡在莫名其妙的报错上,一查就是缺个包或者版本不对。嗯,咱们别走那个弯路。
2.1 为什么选 Ubuntu?
Buildroot 官方推荐的就是 Ubuntu/Debian 系。我个人习惯用 Ubuntu 22.04 LTS,原因很简单:包源新、社区活跃、遇到问题随便一搜就有答案。你非要用 CentOS 或者 Arch 也不是不行,但依赖包的名字和版本会让你多花不少时间。我建议你直接装一个 Ubuntu 22.04 的虚拟机或者 WSL2,干净利落。
2.2 安装依赖包
Buildroot 的编译依赖说多不多,说少不少。少了哪个,编译到一半就停,很烦。我整理了一个清单,你直接复制粘贴跑一遍就行。
sudo apt update
sudo apt install -y \
git \
wget \
curl \
build-essential \
libncurses-dev \
flex \
bison \
gperf \
python3 \
python3-pip \
python3-venv \
rsync \
unzip \
file \
cpio \
bc \
libssl-dev \
libelf-dev \
u-boot-tools \
device-tree-compiler \
kmod \
swig \
libtool \
autoconf \
automake \
pkg-config \
cmake \
ninja-build \
ccache
这里面有几个我特别想提一下:
- libncurses-dev:没有它,
make menuconfig那个图形界面就出不来。 - flex、bison:编译内核和 U-Boot 的时候要用,缺了会报语法错误。
- ccache:这个我强烈建议装上。我做过一个项目,每次全量编译要 40 分钟,开了 ccache 之后,第二次编译直接缩到 10 分钟。你想想看,省下来的时间够喝几杯咖啡了。
2.3 下载 Buildroot 源码
依赖装完了,接下来拿源码。我个人习惯用 长期支持版(LTS),稳定、坑少。你可以去 Buildroot 官网 看最新 LTS 版本。写这个课程的时候,最新的 LTS 是 2024.02.x。
下载方式有两种:
- 直接下载压缩包:简单,但不好管理版本。
- 用 Git 克隆:我推荐这个。方便切分支、打补丁、回退。
# 方法一:下载压缩包
wget https://buildroot.org/downloads/buildroot-2024.02.tar.gz
tar -xzf buildroot-2024.02.tar.gz
cd buildroot-2024.02
# 方法二:Git 克隆(推荐)
git clone https://git.buildroot.net/buildroot
cd buildroot
git checkout 2024.02
我个人习惯用 Git 方式。为什么?因为我在项目中经常需要同时维护几个不同版本的 Buildroot,用 Git 分支管理起来特别方便。你想想看,一个分支是产品稳定版,一个分支是实验新功能,切来切去,比解压好几个文件夹清爽多了。
2.4 首次配置与编译
源码拿到了,别急着直接 make。Buildroot 的配置逻辑是这样的:
- 它内置了很多 默认配置(defconfig),针对不同的开发板。
- 你选一个接近你板子的配置,然后微调。
- 最后保存成你自己的配置。
先看看有哪些现成的配置:
ls configs/ | grep -i "raspberry\|stm32\|imx\|qemu"
比如你手头是树莓派 4,那就用 raspberrypi4_defconfig。如果是 QEMU 模拟器,用 qemu_x86_64_defconfig。我刚开始学的时候,就是拿 QEMU 练手的,不用硬件也能跑,特别适合调试。
# 以 QEMU x86_64 为例
make qemu_x86_64_defconfig
这一步会生成一个 .config 文件。你可以用 make menuconfig 进去看看,调整一些选项,比如:
- Target options → Target Architecture Variant(选你的 CPU 型号)
- Toolchain → Enable C++ support(如果你要跑 C++ 程序)
- System configuration → Root password(设个密码,别用默认空密码)
配置好了,开始编译:
make -j$(nproc)
-j$(nproc) 的意思是让 CPU 全部核心一起干活。我第一次编译 QEMU x86_64 的默认配置,大概用了 15 分钟。如果是树莓派这种带内核和 U-Boot 的,可能要 30-40 分钟。这时候你可以去泡杯茶,或者看看文档。
编译完成后,在 output/images/ 目录下会生成:
| 文件 | 说明 |
|---|---|
rootfs.cpio |
根文件系统(initramfs 格式) |
rootfs.ext2 |
根文件系统(ext2 格式,适合 QEMU) |
bzImage |
Linux 内核镜像 |
start-qemu.sh |
自动生成的 QEMU 启动脚本 |
直接运行 ./output/images/start-qemu.sh,就能看到系统启动了。登录进去,用户名 root,密码是你之前设的(如果没改,默认空密码)。
output/ 目录备份一下。后面你改配置、加包,万一搞坏了,直接恢复备份,不用从头再编。我吃过这个亏,改了一个选项导致编译失败,又不想回退,最后只能删了 output 重来。备份一下,省心。
2.5 本章知识体系
下面这张图帮你理清这一章的核心流程:
这张图把整个流程串起来了:从 Ubuntu 环境开始,装依赖、下源码、选配置、编译,最后拿到镜像文件。每一步都有对应的输出,环环相扣。你照着这个顺序走,基本不会出大问题。
2.6 常见问题与解决
编译过程中可能会遇到一些报错,我挑几个常见的说一下:
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
/bin/sh: 1: bison: not found |
缺少 bison | sudo apt install bison |
fatal error: curses.h: No such file or directory |
缺少 ncurses 开发库 | sudo apt install libncurses-dev |
Your display is too small to run Menuconfig! |
终端窗口太小 | 把终端窗口拉大,或者用 make nconfig 替代 |
Can't find libssl.pc |
缺少 OpenSSL 开发库 | sudo apt install libssl-dev |
/tmp 目录可能很小(只有 1GB 左右),编译大项目时会报磁盘空间不足。解决办法:把 BR2_HOST_DIR 和 BR2_DL_DIR 指向一个有足够空间的分区,或者在 WSL2 配置里把 /tmp 挂载到 Windows 的临时目录。
好了,环境搭好了,第一次编译也跑通了。你现在手里应该有一个能启动的 Buildroot 系统。后面的事情就好办了——加包、改配置、集成驱动,都是在这个基础上做文章。记住这个流程,后面每一章都会用到它。