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源码,选择目标配置
- 编译阶段:Buildroot自动下载、交叉编译、打包
- 运行阶段: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开发最核心的工作流:配置 → 编译 → 运行。后面所有章节,都是在这个流程上做扩展和优化。
嗯,第一次跑通的感觉是不是很爽?接下来,咱们可以开始「玩」配置了。