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分钟还没下载完……场面一度很尴尬。

编译过程大致分为几个阶段:

  1. 下载源码 — 从官方镜像站拉取所有依赖包
  2. 构建交叉编译工具链 — 生成aarch64-linux-gnu-gcc等工具
  3. 编译内核 — 构建Linux内核镜像
  4. 编译u-boot — 构建引导加载程序
  5. 构建根文件系统 — 生成最小化的rootfs
  6. 打包镜像 — 生成可烧录的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 本章知识结构

我把整个流程画成了一张图,方便你理解各组件的关系:

Buildroot最小系统构建流程 选择defconfig make raspberrypi4_64_defconfig 下载源码包 构建工具链 编译内核 + u-boot 构建根文件系统 生成sdcard.img 烧录到SD卡 上电启动 关键产出物说明 • sdcard.img:完整SD卡镜像,包含FAT32启动分区 + ext4根文件系统 • Image:64位内核镜像,支持树莓派4B的BCM2711处理器 • bcm2711-rpi-4-b.dtb:设备树文件,描述硬件拓扑 • rootfs.tar:根文件系统打包,可用于chroot或定制

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相关的功能,都会在这个基础上叠加。