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界面死活出不来,卡了我半小时。后来发现就是缺这个库。所以,别偷懒,全装上。
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版本。
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的核心逻辑:下载 → 工具链 → 内核 → 根文件系统。每一步都是自动化的,你只需要敲一次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/目录 |
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确认三遍。
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