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
进入配置界面后,我建议你做这几步:
- Target options → Target Architecture Variant:选
arm926t(这是Versatile板子的CPU) - Toolchain → Enable C++ support:去掉勾选(纯C系统就够了)
- System configuration → Root filesystem overlay directories:留空
- Target packages:全部取消勾选(我们只要一个能启动的shell)
保存配置,退出。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%的情况是缺了
flex、bison这类工具,apt-get install装上就行。 - QEMU启动后黑屏:检查一下
-append参数里的console=ttyAMA0是否写对了。Versatile板子的串口设备名就是ttyAMA0,不是ttyS0。 - 登录后没有shell提示符:这是因为根文件系统里缺少
/dev/console设备节点。在Buildroot配置里勾选System configuration → Run /dev management为Dynamic using devtmpfs + mdev就能解决。
3.8 小结:你学到了什么?
这一章我们做了三件事:
- 用
make qemu_arm_versatile_defconfig加载了默认配置 - 用
make menuconfig精简了系统,去掉了不必要的包 - 用
make编译,然后在QEMU中成功启动
说白了,Buildroot的核心工作流就是这三步:选配置 → 调配置 → 编译运行。后面的章节,我们会在这个基础上不断加功能——加网络、加文件系统、加应用层软件。
但今天,先享受一下这个只有12MB的「小不点」系统吧。它虽然小,五脏俱全。你想想看,从零开始,不到半小时,一个能用的Linux系统就在你手里诞生了。这种感觉,是不是挺爽的?