3. 首次构建最小系统:树莓派4B默认配置实战
好,咱们正式开始动手。这一章的目标很明确——用Buildroot的默认配置,给树莓派4B编译出一个能启动的最小系统。你不需要改任何代码,也不需要理解内核细节。跟着走一遍,先把流程跑通。
我个人习惯,第一次接触一个新板子,一定先用默认配置编译一次。为什么?说白了,先确认工具链没问题、源码能下载、编译环境没坑。你想想看,如果默认配置都编不过,那后面加功能只会更痛苦。
3.1 选择正确的defconfig
Buildroot为树莓派4B提供了专门的默认配置。在源码根目录下,执行:
make list-defconfigs | grep raspberrypi
你会看到一堆以 raspberrypi 开头的配置。我刚开始接触时也懵过——这么多,选哪个?
| 配置名称 | 适用型号 | 说明 |
|---|---|---|
raspberrypi4_64_defconfig |
树莓派4B (64位) | 推荐,使用AArch64模式 |
raspberrypi4_defconfig |
树莓派4B (32位) | 兼容旧系统,性能受限 |
raspberrypi3_64_defconfig |
树莓派3B+ (64位) | 不适用于4B |
关键点: 树莓派4B的BCM2711处理器是64位的,所以务必选 raspberrypi4_64_defconfig。32位模式虽然也能跑,但浪费了硬件能力。
3.2 首次配置与编译
选好配置后,执行:
make raspberrypi4_64_defconfig
make
嗯,这里要注意。第一次编译会下载所有源码包——内核、u-boot、工具链、各种库。网速慢的话,这一步可能卡很久。我曾经在客户现场演示时,等了40分钟还没下载完……场面一度很尴尬。
编译过程大致分为几个阶段:
- 下载源码 — 从官方镜像站拉取所有依赖包
- 构建交叉编译工具链 — 生成aarch64-linux-gnu-gcc等工具
- 编译内核 — 构建Linux内核镜像
- 编译u-boot — 构建引导加载程序
- 构建根文件系统 — 生成最小化的rootfs
- 打包镜像 — 生成可烧录的sdcard.img
提速技巧: 使用 make -j$(nproc) 启用多核编译。树莓派4B的默认配置不算大,4核机器上大约15-20分钟能编完。
3.3 理解编译产物
编译完成后,在 output/images/ 目录下能看到这些文件:
output/images/
├── bcm2711-rpi-4-b.dtb # 设备树文件
├── boot.vfat # 启动分区镜像
├── Image # 内核镜像 (64位)
├── rootfs.ext2 # 根文件系统镜像
├── rootfs.tar # 根文件系统压缩包
├── sdcard.img # 完整SD卡镜像 ← 我们要用的
└── u-boot.bin # 引导加载程序
我个人最关注的是 sdcard.img。这个文件包含了完整的分区布局:一个FAT32启动分区,一个ext4根文件系统分区。Buildroot已经帮你算好了偏移量和大小。
为什么会这样?Buildroot内部用了一个叫 genimage 的工具,它根据配置文件自动生成分区表。你不需要手动计算扇区,也不需要写fdisk脚本。
3.4 烧录与启动验证
烧录命令很简单:
sudo dd if=output/images/sdcard.img of=/dev/sdX bs=4M status=progress
sync
注意 /dev/sdX 要换成你实际的SD卡设备。我建议先用 lsblk 确认一下,别把硬盘烧了。
警告: 烧录前务必确认设备名!/dev/sda 通常是系统盘,/dev/sdb 或 /dev/mmcblk0 才是SD卡。烧错的话,数据全丢。
烧录完成后,把SD卡插入树莓派4B,上电。连接串口(GPIO 14/15)或HDMI显示器,你会看到:
U-Boot 2023.01 (Jan 15 2024 - 10:30:00 +0800)
DRAM: 1.9 GiB
RPI 4 Model B (0xc03111)
MMC: mmc@7e300000: 0, emmc2@7e340000: 1
Loading: ########################## 25 MiB/s
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd083]
[ 0.000000] Linux version 6.1.31 (user@host) (gcc 12.3.0, GNU ld 2.40)
...
[ 2.345678] VFS: Mounted root (ext4 filesystem) on device 179:2.
[ 2.456789] Freeing unused kernel memory: 2048K
[ 2.567890] Run /sbin/init as init process
Welcome to Buildroot
buildroot login:
看到 buildroot login: 提示符,说明系统启动成功了。默认没有密码,直接回车就能登录。
3.5 验证关键功能
登录后,我习惯先检查几个关键点:
# 查看CPU信息
cat /proc/cpuinfo | grep "model name"
# 查看内存
free -h
# 查看网络接口
ip link show
# 查看根文件系统挂载
df -h
正常输出应该显示4核Cortex-A72、约1.8GB可用内存、一个eth0接口。根文件系统占用大约50MB——这就是最小系统的体量。
验证要点: 最小系统不包含任何网络服务、没有SSH、没有包管理器。它就是一个能跑Linux内核的裸机环境。这正是我们后续构建MQTT通信系统的基础。
3.6 本章知识结构
我把整个流程画成了一张图,方便你理解各组件的关系:
3.7 常见问题与避坑
第一次编译,我遇到过不少坑。挑几个典型的说说:
- 下载超时 — 某些源码包在境外服务器,容易被墙。解决方案:配置
BR2_PRIMARY_SITE指向国内镜像,或者提前手动下载放到dl/目录。 - 磁盘空间不足 — Buildroot编译过程中会占用大量临时空间。默认配置大约需要2-3GB。我建议至少留出10GB空闲。
- Python依赖缺失 — 某些版本的Buildroot需要
python3-venv或python3-dev。报错信息会提示,按提示安装即可。 - SD卡无法启动 — 树莓派4B的启动顺序是:SD卡 → USB → 网络。如果SD卡没插好或者烧录有误,它会尝试从USB启动。检查一下卡槽是否到位。
我的习惯: 每次编译前,先执行 make clean 清理旧产物,再重新编译。虽然慢一点,但能避免很多奇怪的链接错误。
好,到这里,你已经成功构建并启动了第一个Buildroot最小系统。这个系统虽然简陋,但五脏俱全——它有完整的内核、文件系统、引导程序。后续所有MQTT相关的功能,都会在这个基础上叠加。