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 菜单:

  1. Toolchain type → 选 External toolchain
  2. Toolchain → 选 Linaro ARM 2021.07(或者你手头有的版本)
  3. Toolchain origin → Pre-installed toolchain
  4. Toolchain path → 填你工具链的安装路径,比如 /opt/linaro/gcc-arm-2021.07-x86_64-arm-none-linux-gnueabihf
  5. 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 本章核心流程一览

下面这张图把整个流程串起来了,你可以对照着看:

Buildroot 快速上手流程 Buildroot 快速上手:从配置到启动 make menuconfig 选择 ARM 架构 & 变体 配置外部工具链 make -j$(nproc) QEMU 启动最小系统 关键输出文件:zImage + vexpress-v2p-ca9.dtb + rootfs.ext2

这张图把咱们这一章做的事儿全画出来了。从 make menuconfig 开始,到 QEMU 里看到 # 提示符,一共五步。你照着走一遍,Buildroot 的基本玩法就掌握了。

常见坑:
QEMU 启动后如果卡在 Kernel panic - not syncing: VFS: Unable to mount root fs,八成是根文件系统没挂上。检查一下 -drive 参数里的文件路径对不对,或者 -append 里的 root= 设备名是否匹配。我刚开始学的时候,这个错至少遇到了三次。

好,这一章就到这儿。你已经亲手构建并启动了一个最小的 ARM Linux 系统。后面咱们再往里面加应用、加驱动,都是在这个基础上做加法。