第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,不是直接 ./ 执行。为什么?因为这个脚本会设置一堆环境变量,比如 TEMPLATECONF、BITBAKEDIR 这些。如果用子进程跑,环境变量就传不回来了。
我个人习惯把构建目录命名为 build,但你可以改成任何名字,比如 mybuild、test 都行。脚本会自动创建这个目录。
执行成功后,你会看到类似这样的输出:
### 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.conf 和 local.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_DIR 和 SSTATE_DIR,每次构建都会重新下载所有源码,那得多慢?我第一次没设,结果构建到一半磁盘满了,血泪教训啊。
DL_DIR 和 SSTATE_DIR 一定要设到独立的大分区。这样即使你删掉构建目录重来,下载过的源码和编译缓存都还在,能省下大量时间。
4.4 执行bitbake core-image-minimal
配置好了,就该真正构建了。
执行:
bitbake core-image-minimal
这个命令会做以下几件事:
- 解析所有层的配方文件
- 分析依赖关系,生成任务依赖图
- 按顺序执行任务:下载源码、配置、编译、打包、生成镜像
构建过程会输出大量日志。你会看到类似这样的信息:
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 文件,这就是最终的镜像。
screen 或 tmux 来跑构建,这样即使断网或关终端,构建也不会中断。强烈推荐!
4.5 验证构建结果
镜像生成后,可以用QEMU启动测试:
runqemu qemux86-64
如果一切正常,你会看到一个Linux启动画面,最后进入登录提示符。默认用户名是 root,没有密码。
嗯,看到这个界面,说明你的Yocto环境已经搭建成功了。从源码到镜像,这条路算是走通了。
接下来,我们就可以开始定制自己的镜像了。