3、快速上手:使用默认配置编译一个最小系统,生成镜像并烧录到QEMU模拟器中运行

好,咱们直接动手。这一章的目标很简单——让你亲眼看到Buildroot跑起来。

我个人习惯,学一个新工具,先别管那么多理论。先跑通一个最小系统,看到终端里跳出登录提示符,那种成就感比看十页文档都管用。你想想看,是不是这个道理?

3.1 准备工作:你需要什么?

其实就三样东西:

  • 一台Linux主机(Ubuntu 20.04/22.04 或 Debian 都行,我建议用虚拟机也行)
  • Buildroot源码(我们直接用最新的稳定版)
  • QEMU模拟器(用来跑我们编译出来的镜像)

嗯,这里要注意:你的主机上需要装一些基础开发包。别慌,我列个清单:

sudo apt-get update
sudo apt-get install -y build-essential git wget cpio unzip rsync bc
sudo apt-get install -y libncurses5-dev libssl-dev
sudo apt-get install -y qemu-system-arm qemu-utils

我在项目中遇到过好几次,新手忘了装 libncurses5-dev,结果make menuconfig的时候报错。说白了,这就是个文本界面库,缺了它你连配置菜单都打不开。

3.2 下载Buildroot并选择默认配置

咱们用2023.02 LTS版本,这个版本我测试过,很稳。

wget https://buildroot.org/downloads/buildroot-2023.02.tar.gz
tar -xvf buildroot-2023.02.tar.gz
cd buildroot-2023.02

解压之后,你看到一堆目录。别被吓到,核心就几个:configs/package/board/。我们今天只关心configs/

Buildroot为各种开发板提供了默认配置。咱们选一个QEMU能跑的ARM架构配置:

make qemu_arm_versatile_defconfig

为什么会选这个?因为QEMU对ARM Versatile PB开发板的模拟最成熟。我曾经试过其他配置,折腾半天发现QEMU不支持,白费功夫。

3.3 调整配置:让系统更小一点

默认配置编译出来的镜像大概30MB。对于「最小系统」这个目标,我觉得还能再砍一砍。

make menuconfig

进入配置界面后,我建议你做这几步:

  1. Target options → Target Architecture Variant:选 arm926t(这是Versatile板子的CPU)
  2. Toolchain → Enable C++ support:去掉勾选(纯C系统就够了)
  3. System configuration → Root filesystem overlay directories:留空
  4. Target packages:全部取消勾选(我们只要一个能启动的shell)
⚠️ 注意:取消所有Target packages后,系统里只有BusyBox提供的基本命令。没有网络工具,没有编辑器。但这就是「最小系统」的精髓——够用就行。

保存配置,退出。Buildroot会自动生成一个.config文件。

3.4 开始编译:喝杯咖啡的功夫

编译命令很简单:

make -j$(nproc)

-j$(nproc) 表示用你CPU的所有核心并行编译。我第一次编译时用了单核,等了快20分钟。后来发现加了这个参数,速度能快3-4倍。

编译过程中你会看到一堆输出。别慌,这是Buildroot在下载源码包、交叉编译、打包镜像。如果一切顺利,最后你会看到:

>>   Generating root filesystem image rootfs.cpio
>>   Generating root filesystem image rootfs.tar
>>   Generating root filesystem image rootfs.ext2

✅ 编译成功! 生成的镜像在 output/images/ 目录下:

  • zImage — 内核镜像
  • vexpress-v2p-ca9.dtb — 设备树文件
  • rootfs.ext2 — 根文件系统镜像

3.5 在QEMU中运行:见证奇迹的时刻

好,现在我们来启动这个最小系统。QEMU的命令稍微有点长,我把它写成一个脚本:

#!/bin/bash
# 文件: run_qemu.sh

qemu-system-arm \
  -M versatilepb \
  -kernel output/images/zImage \
  -dtb output/images/versatile-pb.dtb \
  -drive file=output/images/rootfs.ext2,if=scsi,format=raw \
  -append "root=/dev/sda console=ttyAMA0" \
  -nographic

解释一下每个参数:

参数 含义
-M versatilepb 模拟ARM Versatile PB开发板
-kernel 指定内核镜像
-dtb 设备树文件,告诉内核硬件布局
-drive 挂载根文件系统镜像
-append 内核启动参数,指定根设备和控制台
-nographic 不使用图形界面,直接在终端输出

运行脚本:

chmod +x run_qemu.sh
./run_qemu.sh

你会看到内核启动日志刷刷地滚过。几秒钟后,出现登录提示:

Welcome to Buildroot
buildroot login: 

输入 root,密码为空(直接回车)。你就进入了这个最小系统的shell!

💡 小技巧: 退出QEMU的方法是 Ctrl+A 然后按 X。我第一次用的时候不知道,直接关终端窗口,后来发现这样会导致文件系统损坏。

3.6 验证一下:这个系统有多小?

进入系统后,你可以跑几个命令看看:

# uname -a
Linux buildroot 5.15.78 #1 SMP Tue Nov 21 10:30:00 UTC 2023 armv5tejl GNU/Linux

# free -m
              total        used        free      shared  buff/cache   available
Mem:            126          12         108           0           5         110

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda        124M   12M  112M  10% /

看到了吗?根文件系统只用了12MB,内存占用才12MB。这就是最小系统的魅力——去掉所有不需要的东西,只保留核心功能。

我曾经给一个工业控制器做系统,Flash只有64MB,RAM只有128MB。用Buildroot做出来的系统,跑起来绰绰有余。要是用Ubuntu Core,光系统就占掉一半空间。

3.7 避坑指南:我踩过的几个坑

嗯,这里分享几个我实际遇到过的问题:

  • 编译到一半报错说缺少某个包:别慌,看错误信息。90%的情况是缺了 flexbison 这类工具,apt-get install 装上就行。
  • QEMU启动后黑屏:检查一下 -append 参数里的 console=ttyAMA0 是否写对了。Versatile板子的串口设备名就是 ttyAMA0,不是 ttyS0
  • 登录后没有shell提示符:这是因为根文件系统里缺少 /dev/console 设备节点。在Buildroot配置里勾选 System configuration → Run /dev managementDynamic using devtmpfs + mdev 就能解决。

3.8 小结:你学到了什么?

这一章我们做了三件事:

  1. make qemu_arm_versatile_defconfig 加载了默认配置
  2. make menuconfig 精简了系统,去掉了不必要的包
  3. make 编译,然后在QEMU中成功启动

说白了,Buildroot的核心工作流就是这三步:选配置 → 调配置 → 编译运行。后面的章节,我们会在这个基础上不断加功能——加网络、加文件系统、加应用层软件。

但今天,先享受一下这个只有12MB的「小不点」系统吧。它虽然小,五脏俱全。你想想看,从零开始,不到半小时,一个能用的Linux系统就在你手里诞生了。这种感觉,是不是挺爽的?