第2章:环境准备:在Ubuntu 22.04上安装Buildroot依赖包,下载源码,了解目录结构
好,咱们正式开始动手了。这一章说白了就是搭台子——把Buildroot跑起来需要的基础环境准备好。我见过不少新手一上来就急着编译,结果卡在依赖缺失上,折腾半天。咱们先把地基打牢,后面就顺了。
2.1 为什么选Ubuntu 22.04 LTS?
你可能要问:为什么非得是Ubuntu 22.04?我用别的发行版行不行?
当然可以。Buildroot对宿主机的依赖其实不算苛刻,主流Linux发行版都能跑。但我个人习惯用Ubuntu LTS版本,原因很简单:
- 包管理成熟:apt仓库里的软件包版本够新,依赖关系清晰
- 社区支持好:遇到问题,网上搜到的解决方案十有八九都是Ubuntu的
- 长期稳定:LTS版本有5年支持,你今年学的,三年后还能用
我建议你直接用Ubuntu 22.04,省心。如果你用的是其他版本,比如20.04或者Debian,也没关系,依赖包的名字可能略有不同,但思路完全一样。
2.2 安装Buildroot依赖包
Buildroot本身是个编译框架,它需要调用你宿主机上的各种工具。比如gcc、make、flex、bison等等。这些工具缺一个,编译就会报错。
嗯,这里要注意:不要试图用apt一个一个装,那样太慢了。Buildroot官方文档里其实列了一个依赖清单,我帮你整理好了,直接复制下面这条命令就行:
sudo apt update
sudo apt install -y \
build-essential \
bc \
cmake \
cpio \
file \
flex \
bison \
g++ \
gcc \
git \
libncurses-dev \
libssl-dev \
make \
ninja-build \
python3 \
python3-pip \
rsync \
unzip \
wget \
xz-utils \
zip
sudo apt update 更新一下软件源。我遇到过好几次因为源没更新,装了个旧版本导致编译报错的情况。
装完之后,你可以验证一下关键工具是否就位:
gcc --version
make --version
git --version
python3 --version
如果都能正常输出版本号,那依赖环境就OK了。
2.3 下载Buildroot源码
依赖装好了,接下来就是拿源码。Buildroot的源码托管在GitHub上,你可以用git clone,也可以直接下载压缩包。
我个人习惯用git clone,因为后面如果你想切分支、看历史、或者自己打补丁,git操作起来方便。命令如下:
cd ~
git clone https://github.com/buildroot/buildroot.git
cd buildroot
克隆完成后,你会看到当前目录下多了一个 buildroot 文件夹。咱们进去看看:
cd ~/buildroot
ls -la
如果你不想用git,也可以去官网下载稳定版压缩包:
wget https://buildroot.org/downloads/buildroot-2024.02.tar.gz
tar -xzf buildroot-2024.02.tar.gz
cd buildroot-2024.02
两种方式都可以,看你的习惯。我个人推荐git方式,因为后续升级方便——git pull一下就完事了。
2.4 了解Buildroot的目录结构
源码下载好了,咱们来解剖一下它的目录结构。你想想看,一个嵌入式系统镜像的生成,涉及内核、根文件系统、bootloader、工具链等等。Buildroot把这些东西都组织得井井有条。
执行 ls -l,你会看到类似这样的输出:
drwxrwxr-x 2 user user 4096 2月 20 10:00 arch
drwxrwxr-x 2 user user 4096 2月 20 10:00 board
drwxrwxr-x 2 user user 4096 2月 20 10:00 boot
drwxrwxr-x 2 user user 4096 2月 20 10:00 configs
drwxrwxr-x 2 user user 4096 2月 20 10:00 docs
drwxrwxr-x 2 user user 4096 2月 20 10:00 fs
drwxrwxr-x 2 user user 4096 2月 20 10:00 linux
drwxrwxr-x 2 user user 4096 2月 20 10:00 package
drwxrwxr-x 2 user user 4096 2月 20 10:00 support
drwxrwxr-x 2 user user 4096 2月 20 10:00 system
drwxrwxr-x 2 user user 4096 2月 20 10:00 toolchain
-rw-rw-r-- 1 user user 12345 2月 20 10:00 Makefile
-rw-rw-r-- 1 user user 67890 2月 20 10:00 Config.in
每个目录都有它的职责。我挑几个核心的给你讲讲:
| 目录/文件 | 作用 | 我的经验 |
|---|---|---|
arch/ |
存放CPU架构相关的配置,比如ARM、x86、RISC-V | 选错架构,编译出来的镜像根本跑不起来。我踩过这个坑 |
board/ |
板级支持包,包含特定开发板的配置、补丁、脚本 | 如果你用的是常见板子(比如树莓派),这里已经有现成的 |
boot/ |
bootloader相关,比如U-Boot、GRUB | 大部分嵌入式板子用U-Boot,这里就是它的家 |
configs/ |
预置的默认配置文件,比如 raspberrypi4_defconfig |
新手从这里开始最稳妥,省去手动配置的麻烦 |
package/ |
所有软件包的构建规则,每个包一个子目录 | 你想加什么软件,就在这里加。比如加个nginx |
linux/ |
Linux内核的构建配置 | 内核版本、补丁、配置项都在这里控制 |
toolchain/ |
交叉编译工具链的配置 | 你可以用Buildroot自己编译工具链,也可以使用外部工具链 |
fs/ |
根文件系统的构建逻辑,比如ext4、squashfs、initramfs | 文件系统格式选错了,板子可能无法挂载根分区 |
system/ |
根文件系统的骨架,比如 /etc/inittab、/etc/fstab |
你可以在这里定制系统启动时的默认行为 |
support/ |
辅助脚本和工具,比如下载器、依赖检查 | 一般不用动,但出了问题可以来这里查日志 |
Makefile |
顶层Makefile,整个构建的入口 | 你执行 make 时,就是它调度一切 |
Config.in |
Kconfig风格的配置菜单入口 | 执行 make menuconfig 时,就是读这个文件 |
你看,这个结构其实很清晰:arch 管硬件架构,board 管具体板子,package 管软件包,linux 管内核,toolchain 管工具链。各司其职,互不干扰。
- 想改内核配置?去
linux/ 或执行 make linux-menuconfig- 想加个软件?去
package/ 下新建目录- 想换文件系统格式?去
fs/ 里选- 想用现成配置?去
configs/ 里找
2.5 用SVG画一张结构图
光说可能不够直观,我画了一张图,把Buildroot的核心目录和它们之间的关系展示出来。你看一眼就明白了:
从这张图你可以看到,Buildroot的目录分成了三大块:左侧是硬件相关的(架构、板级、配置),中间是构建核心(软件包、内核、工具链),右侧是系统生成(文件系统、骨架、辅助工具)。你每次编译,其实就是从左侧选一个配置,中间选一些软件,右侧生成最终的镜像。
2.6 避坑指南:我踩过的几个坑
环境准备这一步看似简单,但有几个地方容易出问题。我把自己踩过的坑列出来,你注意一下:
- 依赖包版本太旧:Ubuntu 20.04的某些包版本偏低,可能导致Buildroot编译报错。我建议用22.04,或者手动升级cmake、gcc等关键工具。
- 磁盘空间不足:Buildroot编译过程中会下载大量源码包,生成中间文件。一个完整的编译可能占用10-20GB空间。我建议至少预留30GB。
- 网络问题:Buildroot需要从GitHub、kernel.org等站点下载源码。如果你在墙内,可能需要配置代理。我曾经因为网络超时,编译到一半卡住,白白浪费了半小时。
- 权限问题:不要在root下操作,也不要把源码放在
/root或/opt等需要sudo的目录。放在~/buildroot最安全。
2.7 本章小结
好,咱们把环境准备这一步走完了。总结一下你做了哪些事:
- 安装了Buildroot所需的依赖包(gcc、make、flex、bison等)
- 用git clone或wget下载了Buildroot源码
- 了解了Buildroot的目录结构,知道每个目录是干什么的
- 通过SVG图理清了核心目录之间的关系
嗯,到这里,你的开发环境就搭好了。下一章咱们会真正开始配置Buildroot,生成第一个系统镜像。到时候你会发现,前面这些准备工作有多重要。
公众号:蓝海资料掘金营,微信deep3321