第4章 首次构建:运行oe-init-build-env脚本,配置bblayers.conf和local.conf,执行bitbake core-image-minimal

好,到了真正动手的时候了。

前面我们搭好了环境,下载了源码。现在要做的,就是让Yocto真正跑起来。

我第一次做这一步时,心里其实有点忐忑。毕竟整个构建过程要下载几百兆甚至上G的包,万一中间断了怎么办?嗯,后来发现,Yocto的断点续传做得还不错,不用太担心。

4.1 运行oe-init-build-env脚本

这个脚本,说白了就是初始化构建环境的入口。

你进入Poky目录后,执行:

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

注意,这里用的是 source,不是直接 ./ 执行。为什么?因为这个脚本会设置一堆环境变量,比如 TEMPLATECONFBITBAKEDIR 这些。如果用子进程跑,环境变量就传不回来了。

我个人习惯把构建目录命名为 build,但你可以改成任何名字,比如 mybuildtest 都行。脚本会自动创建这个目录。

执行成功后,你会看到类似这样的输出:

### Shell environment set up for builds. ###

You can now run 'bitbake <target>'

Common targets are:
    core-image-minimal
    core-image-full-cmdline
    core-image-sato
    core-image-weston

看到这个,说明环境已经就绪了。

小技巧: 每次打开新终端,都要重新执行 source oe-init-build-env build。我建议你把这个命令写到一个脚本里,或者加到 .bashrc 中,省得每次都敲一遍。

4.2 配置bblayers.conf

进入 build/conf 目录,你会看到两个文件:bblayers.conflocal.conf

bblayers.conf 的作用,就是告诉BitBake:你要去哪些层找配方(recipes)。

默认生成的 bblayers.conf 大概长这样:

# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
  /home/user/poky/meta \
  /home/user/poky/meta-poky \
  /home/user/poky/meta-yocto-bsp \
  " 

这里列出了三个层:

  • meta:核心层,包含基础配方和类
  • meta-poky:Poky发行版配置
  • meta-yocto-bsp:Yocto官方板级支持包

如果你要添加自己的层,比如 meta-mylayer,就在 BBLAYERS 变量里加上路径就行。

注意: 路径一定要写绝对路径,或者用 ${TOPDIR} 这种变量。我曾经见过有人写相对路径,结果换了个目录构建就找不到了,折腾了半天。

4.3 配置local.conf

local.conf 是构建的核心配置文件。这里面的参数,直接影响构建结果。

默认生成的 local.conf 内容很多,但大部分都被注释掉了。我们只需要关注几个关键参数:

参数 说明 建议值
MACHINE 目标硬件平台 qemux86-64(虚拟机)或具体板子名
DL_DIR 源码下载缓存目录 建议设到大磁盘分区,比如 /home/user/downloads
SSTATE_DIR 共享状态缓存目录 同样建议设到大磁盘分区
BB_NUMBER_THREADS BitBake并行任务数 CPU核心数 + 1 或 2
PARALLEL_MAKE make并行编译数 CPU核心数

我个人习惯这样配置:

MACHINE ?= "qemux86-64"
DL_DIR = "/home/user/yocto_downloads"
SSTATE_DIR = "/home/user/yocto_sstate"
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"

你想想看,如果不设 DL_DIRSSTATE_DIR,每次构建都会重新下载所有源码,那得多慢?我第一次没设,结果构建到一半磁盘满了,血泪教训啊。

核心要点: DL_DIRSSTATE_DIR 一定要设到独立的大分区。这样即使你删掉构建目录重来,下载过的源码和编译缓存都还在,能省下大量时间。

4.4 执行bitbake core-image-minimal

配置好了,就该真正构建了。

执行:

bitbake core-image-minimal

这个命令会做以下几件事:

  1. 解析所有层的配方文件
  2. 分析依赖关系,生成任务依赖图
  3. 按顺序执行任务:下载源码、配置、编译、打包、生成镜像

构建过程会输出大量日志。你会看到类似这样的信息:

Loading cache: 100% |###########################################| Time: 0:00:01
Loaded 0 entries from dependency cache.
Parsing recipes: 100% |#########################################| Time: 0:00:05
Parsing of 1234 .bb files complete. 0 cached, 0 parsed, 1234 targets.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
Currently  1 running tasks (0 of 1234) 0% 0:00:00 / 0:00:00

第一次构建,时间会比较长。根据网络和机器性能,可能需要30分钟到2小时不等。

构建完成后,镜像文件会放在 build/tmp/deploy/images/qemux86-64/ 目录下。你会看到 core-image-minimal-qemux86-64.wic.ext4 文件,这就是最终的镜像。

避坑指南: 我曾经在构建过程中不小心关掉了终端,结果BitBake进程被中断了。后来我学会了用 screentmux 来跑构建,这样即使断网或关终端,构建也不会中断。强烈推荐!

4.5 验证构建结果

镜像生成后,可以用QEMU启动测试:

runqemu qemux86-64

如果一切正常,你会看到一个Linux启动画面,最后进入登录提示符。默认用户名是 root,没有密码。

嗯,看到这个界面,说明你的Yocto环境已经搭建成功了。从源码到镜像,这条路算是走通了。

接下来,我们就可以开始定制自己的镜像了。