3、快速上手:执行make menuconfig、选择目标架构(ARM)、配置外部工具链、执行make编译、首次启动最小系统。
好,咱们直接动手。前面两章把 Buildroot 是什么、怎么装说清楚了,这一章咱们就走一遍完整的流程——从零配置到第一次看到内核启动。我个人的习惯是,先跑通一个最小系统,再回头慢慢调细节。你想想看,如果连灯都点不亮,后面那些花里胡哨的优化都是白搭。
3.1 启动配置界面:make menuconfig
进入 Buildroot 源码目录,执行:
cd buildroot
make menuconfig
你会看到一个蓝底白字的菜单界面。嗯,这里要注意,你的终端窗口最好开大一点,至少 80x24,否则界面会错位。我在项目里遇到过几次因为窗口太小导致选项显示不全的情况,折腾了半天才发现是终端的问题。
这个界面分三块:
- 顶部:菜单栏,按方向键切换
- 中间:配置项列表,按 Enter 进入子菜单
- 底部:操作提示,Select/Exit/Help
/ 可以搜索配置项,输入关键字直接定位。比如搜 "arm",所有跟 ARM 相关的选项就列出来了。这个功能我几乎每用必点。
3.2 选择目标架构:ARM
进入 Target options 子菜单,第一项就是 Target Architecture。默认是 i386,改成 ARM (little endian)。
然后往下翻,设置具体的 ARM 变体:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| Target Architecture Variant | cortex-a9 | 我用的 QEMU 模拟器,选这个最通用 |
| Target ABI | EABIhf | 硬浮点,性能更好 |
| Floating point strategy | VFPv3-D16 | 跟 cortex-a9 配套 |
| ARM instruction set | ARM | Thumb2 也行,但新手先用 ARM |
armv7 通用选项,结果在 cortex-a9 上死活起不来,最后发现是缺少某些指令集扩展。老老实实按实际芯片选,别偷懒。
3.3 配置外部工具链
Buildroot 默认会自己编译一套工具链,但那个过程……说实话挺慢的。我建议新手直接用外部工具链,省时间。进入 Toolchain 菜单:
- Toolchain type → 选
External toolchain - Toolchain → 选
Linaro ARM 2021.07(或者你手头有的版本) - Toolchain origin →
Pre-installed toolchain - Toolchain path → 填你工具链的安装路径,比如
/opt/linaro/gcc-arm-2021.07-x86_64-arm-none-linux-gnueabihf - External toolchain kernel headers series → 选
5.10.x(跟你的内核版本匹配)
填完之后,按 Save 保存配置,退出。配置文件默认存在 .config 里。
为什么用外部工具链?
Buildroot 自编译工具链,第一次要下载源码、打补丁、编译,少说半小时。外部工具链是预编译好的,直接拿来用,第一次编译能压缩到 10 分钟以内。说白了,就是拿空间换时间。
3.4 执行 make 编译
配置完,直接跑:
make -j$(nproc)
-j$(nproc) 的意思是并行编译,用满你 CPU 的所有核心。我第一次编译的时候没加这个参数,单核跑了快一小时……后来同事提醒才加上,速度直接翻了好几倍。
编译过程会输出大量日志,大致分几个阶段:
- 下载源码:从网络拉取内核、busybox、u-boot 等包
- 解压打补丁:Buildroot 会自动应用补丁
- 配置编译:每个包独立编译
- 打包根文件系统:生成
rootfs.tar或rootfs.ext2 - 生成内核镜像:
zImage或uImage
编译完成后,输出文件在 output/images/ 目录下:
| 文件 | 说明 |
|---|---|
| zImage | 压缩后的内核镜像 |
| rootfs.ext2 | 根文件系统镜像(ext2 格式) |
| rootfs.tar | 根文件系统打包文件 |
| vexpress-v2p-ca9.dtb | 设备树文件(ARM 专用) |
别慌。90% 的错误都是网络问题(下载超时)或依赖缺失。先检查
output/build/ 下对应包的日志文件,比如 output/build/linux-5.10.x/.stamp_built 能告诉你编译到哪一步挂的。我遇到最多的是 ncurses 没装,sudo apt install libncurses-dev 搞定。
3.5 首次启动最小系统
编译完,咱们用 QEMU 模拟器启动看看效果。QEMU 是啥?说白了就是一个软件版的 ARM 开发板,你不需要买硬件就能跑 Linux。
启动命令:
qemu-system-arm -M vexpress-a9 \
-kernel output/images/zImage \
-dtb output/images/vexpress-v2p-ca9.dtb \
-drive file=output/images/rootfs.ext2,if=sd,format=raw \
-append "console=ttyAMA0 root=/dev/mmcblk0" \
-nographic
参数解释:
-M vexpress-a9:模拟 ARM Versatile Express 开发板-kernel:指定内核镜像-dtb:设备树文件,告诉内核硬件布局-drive:挂载根文件系统镜像-append:传给内核的启动参数-nographic:不用图形窗口,直接在终端输出
启动后,你会看到内核打印信息刷刷地滚屏。大概几秒钟后,出现 login: 提示符。默认用户名 root,没有密码,直接回车就能进系统。
第一次看到这个画面,我挺激动的
说实话,我第一次用 Buildroot 编译完、看到 # 提示符的时候,心里还是挺有成就感的。虽然只是一个最小系统,连网络都没有,但这是你自己从源码一步步构建出来的。后面再往里面加东西,心里就有底了。
3.6 本章核心流程一览
下面这张图把整个流程串起来了,你可以对照着看:
这张图把咱们这一章做的事儿全画出来了。从 make menuconfig 开始,到 QEMU 里看到 # 提示符,一共五步。你照着走一遍,Buildroot 的基本玩法就掌握了。
QEMU 启动后如果卡在
Kernel panic - not syncing: VFS: Unable to mount root fs,八成是根文件系统没挂上。检查一下 -drive 参数里的文件路径对不对,或者 -append 里的 root= 设备名是否匹配。我刚开始学的时候,这个错至少遇到了三次。
好,这一章就到这儿。你已经亲手构建并启动了一个最小的 ARM Linux 系统。后面咱们再往里面加应用、加驱动,都是在这个基础上做加法。