环境搭建:Ubuntu系统准备、依赖包安装、获取Buildroot源码、目录结构解析
做嵌入式开发,环境搭建是绕不开的第一道坎。很多人觉得这步简单,随便装个Ubuntu就开始搞。但我见过太多人因为环境没配好,后面编译报错折腾一整天。说白了,这一步稳了,后面才能跑得快。
Ubuntu系统版本选择
我个人习惯用Ubuntu 20.04 LTS或22.04 LTS。为什么?因为Buildroot官方长期测试的就是这两个版本。你非要用最新的24.04也行,但有些依赖包的版本可能不兼容,到时候还得自己降级,何必呢?
系统装好后,第一件事就是换源。国内用户不换源,下载依赖包能等到你怀疑人生。我一般用清华源或阿里源,速度杠杠的。
# 备份原源
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时,就是靠这张图把整个框架理清楚的。
这张图里,我标了三种颜色:
- 绿色 — 存放配置和板级支持,你经常要改
- 红色 — 核心配置文件,选芯片平台就靠它
- 橙色/青色 — 编译产物和工具,一般不动
这里重点说几个目录:
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开发环境。下一步就是选平台、配内核、加软件包,然后编译出你的第一个嵌入式系统镜像。