4. 第一次构建:配置构建环境、运行bitbake core-image-minimal、理解构建过程输出

好,到了真正动手的时候了。前面几章我们把Yocto的来龙去脉、目录结构、概念都捋了一遍。现在,我们要做第一次构建。

说实话,第一次跑bitbake,很多人会紧张。我当年也是。生怕敲错一个命令,或者等了两三个小时最后报个红错。别担心,这一章我带你一步步走,把每一步在干什么、输出什么、可能踩什么坑,都讲清楚。

4.1 配置构建环境:source oe-init-build-env

进入你的Poky目录,执行下面这条命令:

cd ~/yocto/poky
source oe-init-build-env build

这条命令做了三件事:

  • 设置一系列环境变量(比如 TEMPLATECONF、BBPATH)
  • 创建 build 目录(如果不存在的话)
  • 把当前 shell 的工作目录切换到 build 目录

执行完后,你会看到终端提示符变了,前面多了个 build 字样。这说明环境已经激活了。

我的习惯:每次打开新终端,第一件事就是 source 这个脚本。我建议你把这条命令记在笔记里,或者写个 alias。忘了 source,后面所有 bitbake 命令都会报错。

4.2 检查构建配置:local.conf 和 bblayers.conf

环境激活后,进入 build/conf 目录,你会看到两个关键文件:

文件 作用
local.conf 本地构建配置,比如目标机器、并行任务数、下载目录等
bblayers.conf 声明哪些 layer 参与构建,以及它们的路径

对于第一次构建,我建议你至少检查 local.conf 里的这几项:

# 目标机器(我一般先用 qemux86-64)
MACHINE ?= "qemux86-64"

# 并行编译线程数(建议设为 CPU 核心数)
BB_NUMBER_THREADS ?= "4"
PARALLEL_MAKE ?= "-j 4"

# 下载目录(共享给多个项目用)
DL_DIR ?= "/home/yourname/yocto/downloads"
注意:DL_DIR 和 SSTATE_DIR 最好设到 SSD 上。我曾经在 HDD 上跑过一次,那速度……嗯,等得我泡了三杯咖啡。另外,DL_DIR 可以多个项目共用,省得重复下载。

4.3 运行 bitbake core-image-minimal

配置检查完毕,开始构建:

bitbake core-image-minimal

这条命令会触发整个构建流程。第一次构建时间很长,通常 30 分钟到 2 小时不等,取决于你的网络和机器性能。

构建过程中,终端会不断输出日志。你可能会看到类似这样的信息:

Loading cache: 100%
Parsing recipes: 100%
NOTE: Resolving any missing task queue dependencies
NOTE: Executing Tasks
Currently  1 running tasks (1 of 1234):
0: bash-5.2.15-r0 do_fetch (pid 12345)

这里有个小技巧:按 Ctrl + R 可以刷新当前任务列表,按 q 退出交互视图。我个人习惯让它跑着,去做别的事,偶尔回来看一眼。

4.4 理解构建过程输出

构建过程中,Yocto 会在 build 目录下生成大量中间产物。核心目录结构如下:

构建输出目录结构 build/ tmp/ cache/ sstate-cache/ work/ deploy/ images/ 关键目录说明 • tmp/work/:每个 recipe 的构建工作目录,包含源码、编译产物、日志 • tmp/deploy/images/:最终生成的镜像文件(.wic、.tar.bz2、内核、设备树等) • sstate-cache/:共享状态缓存,加速后续构建 • cache/:解析后的 recipe 缓存,加速下次解析

4.5 构建成功后的产物

构建完成后,你会在 tmp/deploy/images/qemux86-64/ 下看到这些文件:

core-image-minimal-qemux86-64.wic
core-image-minimal-qemux86-64.tar.bz2
bzImage
core-image-minimal-qemux86-64.qemuboot.conf
*.dtb

其中:

  • .wic:完整的磁盘镜像,可以直接烧录到 SD 卡或启动盘
  • .tar.bz2:根文件系统的压缩包
  • bzImage:Linux 内核镜像
  • .dtb:设备树文件
  • .qemuboot.conf:QEMU 启动配置文件,方便直接用 runqemu 启动

验证构建是否成功:

执行 runqemu qemux86-64,如果能看到 QEMU 窗口弹出,并且系统启动到登录提示符,那就说明第一次构建成功了。默认用户名 root,无密码。

4.6 常见问题与避坑

第一次构建,我遇到过不少问题。挑几个典型的说说:

问题 原因 解决方法
do_fetch 失败 网络问题或源地址失效 检查网络,或设置 PREMIRROR 使用国内镜像源
磁盘空间不足 tmp 目录占用过大 至少预留 50GB 空间,或设置 INHERIT += "rm_work" 自动清理
编译错误 依赖缺失或版本冲突 查看 log.do_compile 日志,安装缺失的 host 工具
bitbake 命令找不到 没有 source 环境 重新执行 source oe-init-build-env
我曾经踩过的坑:有一次构建到一半,磁盘满了。我一看,tmp 目录占了 40GB。后来我养成了两个习惯:一是设置 INHERIT += "rm_work",二是用 df -h 定期检查磁盘。别等到报错才想起来。

4.7 理解构建日志

每个 recipe 的构建日志都在 tmp/work/<arch>/<recipe>/<version>/temp/ 下。关键文件:

  • log.do_fetch:下载日志
  • log.do_configure:配置日志
  • log.do_compile:编译日志
  • log.do_install:安装日志
  • run.do_*:实际执行的 shell 脚本,可以手动重跑调试

构建失败时,别慌。先看最后几行错误信息,然后去对应的 log 文件里找线索。我一般先看 log.do_compile,因为 80% 的错误都出在编译阶段。