3. Buildroot 配置系统入门

说实话,很多初学者学Buildroot,第一步就被卡住了。

不是文档看不懂,而是不知道「跑起来」是什么感觉。我当年也是这样——看了半天理论,敲了一堆命令,最后连个终端都没见到。所以这一章,咱们直接动手。

目标很简单:用Buildroot的默认配置,编译一个能在QEMU上运行的ARM系统。从下载代码到看到登录提示符,全流程走一遍。你不需要买开发板,不需要连串口线,一台电脑就够了。

本章核心目标:在30分钟内,从零构建一个完整的ARM Linux系统,并在QEMU模拟器中启动它。

3.1 环境准备:你需要什么?

先看看你的电脑。我建议用Ubuntu 20.04或22.04,64位版本。其他Linux发行版也行,但包管理命令不一样,你得自己调整。

需要安装的依赖包,我列了个清单:

sudo apt update
sudo apt install -y \
    git \
    wget \
    unzip \
    make \
    gcc \
    g++ \
    libncurses5-dev \
    flex \
    bison \
    libssl-dev \
    bc \
    python3 \
    python3-pip \
    qemu-system-arm

这里面有个坑——qemu-system-arm。我记得第一次装的时候,只装了qemu,结果找不到qemu-system-arm命令。嗯,这两个包不一样,别搞混了。

小提示:如果你用的是Ubuntu 22.04,可能还需要装libelf-dev和cpio。少了它们,编译内核时会报错。

3.2 下载Buildroot源码

Buildroot的源码在GitHub上。我个人习惯用git clone,这样以后更新方便。

git clone https://github.com/buildroot/buildroot.git
cd buildroot

克隆完以后,看看分支:

git branch -a

我建议用最新的稳定版。比如写这篇文章时,2024.02.x是长期支持版。你可以切过去:

git checkout 2024.02.x

为什么用稳定版?因为master分支可能正在开发中,编译容易出问题。我在项目中吃过这个亏——用master编译到一半,发现某个包版本冲突,排查了半天。后来就学乖了,只用稳定版。

3.3 选择默认配置

Buildroot自带了很多现成的配置文件,放在configs/目录下。咱们要找的是QEMU ARM的配置。

ls configs/ | grep qemu_arm

你会看到类似这样的输出:

qemu_arm_versatile_defconfig
qemu_arm_vexpress_defconfig
qemu_arm_vexpress_tz_defconfig

选哪个?我个人推荐qemu_arm_vexpress_defconfig。为什么?因为vexpress板子模拟得比较完整,网络、存储都支持,而且社区维护得好。

应用配置:

make qemu_arm_vexpress_defconfig

这条命令会把默认配置写入.config文件。你可以用make menuconfig看看里面都有什么,但第一次先别改,直接编译。

注意:如果你改了配置,编译时间可能会变长。第一次跑通流程最重要,别贪心。

3.4 开始编译:耐心等待

编译命令很简单:

make

然后……你就等着吧。第一次编译时间比较长,取决于你的网络和CPU。我实测过,在4核8线程的机器上,大概需要15-20分钟。如果网速慢,下载源码包可能更久。

编译过程中,Buildroot会做这些事情:

  • 下载所有依赖包的源码(内核、BusyBox、glibc等)
  • 交叉编译工具链
  • 编译内核
  • 编译BusyBox和用户空间程序
  • 生成根文件系统
  • 打包成QEMU能启动的镜像

你想想看,这要是手动做,得折腾多久?Buildroot一条命令全搞定。

编译完成后,输出文件在output/images/目录下:

ls output/images/

你会看到:

文件 说明
zImage 压缩后的内核镜像
vexpress-v2p-ca9.dtb 设备树文件(硬件描述)
rootfs.ext2 根文件系统镜像(ext2格式)

3.5 启动QEMU:见证奇迹

编译完了,怎么跑?Buildroot很贴心,它生成了一个启动脚本:

cat output/images/start-qemu.sh

内容大概是这样的:

#!/bin/sh
qemu-system-arm \
    -M vexpress-a9 \
    -kernel zImage \
    -dtb vexpress-v2p-ca9.dtb \
    -drive file=rootfs.ext2,if=sd,format=raw \
    -append "console=ttyAMA0,115200 root=/dev/mmcblk0" \
    -nographic

直接运行它:

cd output/images/
./start-qemu.sh

几秒钟后,你会看到内核启动信息刷刷地滚过屏幕。最后出现:

Welcome to Buildroot
buildroot login:

看到这个,恭喜你——系统跑起来了!

默认用户名是root,没有密码。直接回车登录。

登录后试试:uname -a查看内核版本,free -m看内存,ls /看看根目录。这就是一个完整的Linux系统,虽然小,但五脏俱全。

3.6 核心流程拆解:到底发生了什么?

光跑通还不够,咱们得理解背后发生了什么。我画了一张图,帮你理清整个流程:

Buildroot + QEMU ARM 编译启动流程 步骤1:下载源码 git clone + checkout 步骤2:选择配置 make qemu_arm_vexpress_defconfig 步骤3:编译 make 编译产物 zImage (内核) vexpress-v2p-ca9.dtb (设备树) rootfs.ext2 (根文件系统) QEMU启动 qemu-system-arm 加载内核 + 设备树 + 根文件系统 启动成功 buildroot login: 提示符 关键点 无需开发板 全自动编译 30分钟跑通

这张图把整个流程分成了三个阶段:

  1. 准备阶段:下载Buildroot源码,选择目标配置
  2. 编译阶段:Buildroot自动下载、交叉编译、打包
  3. 运行阶段:QEMU加载内核、设备树、根文件系统,启动系统

你可能会问:为什么需要设备树(DTB)?

简单说,ARM架构不像x86那样有固定的硬件描述方式。设备树就是告诉内核:「我这块板子上有哪些外设,内存多大,中断怎么连」。没有它,内核不知道该怎么初始化硬件。

3.7 常见问题与避坑

跑流程的过程中,你可能会遇到一些问题。我把常见的列出来:

问题 原因 解决方法
编译报错:No rule to make target '...' 依赖包没装全 检查3.1节的依赖列表,重新安装
下载超时或失败 网络问题,或源码包地址变更 重试,或设置BR2_PRIMARY_SITE镜像
QEMU启动后黑屏 控制台参数不对 检查-append中的console=ttyAMA0
登录后没有网络 QEMU网络未配置 加-net nic -net user参数

我曾经遇到过:编译到一半,磁盘空间不够了。Buildroot的output/目录会占用好几GB,特别是第一次编译,所有源码包都缓存了。建议预留至少10GB空间。

3.8 小结:你已经掌握了什么?

这一章走下来,你亲手完成了:

  • 下载并配置Buildroot
  • 用默认配置编译了一个ARM系统
  • 在QEMU上成功启动
  • 理解了内核、设备树、根文件系统三者的关系

说白了,你已经掌握了嵌入式Linux开发最核心的工作流:配置 → 编译 → 运行。后面所有章节,都是在这个流程上做扩展和优化。

嗯,第一次跑通的感觉是不是很爽?接下来,咱们可以开始「玩」配置了。