3. 开发环境搭建
Yocto 项目并不是一个可以直接“安装”的软件,而是一套以 BitBake 为调度核心、以 OpenEmbedded 元数据为配方体系的构建框架。要让这套框架在主机上跑起来,需要依次完成四件事:准备主机依赖、获取 Poky 参考发行版源码、初始化构建环境、执行第一次镜像构建。本节按这条主线展开,并在中间插入目录结构说明,帮助你建立对构建系统的空间感。
一、主机依赖安装:先满足 BitBake 的运行前提
BitBake 本身是 Python 程序,但它调用的编译、打包、解压、校验工具全部来自主机。官方推荐使用 Ubuntu 20.04/22.04 LTS 或同代 Debian 系统,并安装以下基础包:
sudo apt update
sudo apt install -y gawk wget git diffstat unzip texinfo gcc build-essential \
chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils \
iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
pylint xterm python3-subunit mesa-common-dev zstd liblz4-tool file locales
sudo locale-gen en_US.UTF-8
其中 chrpath 用于修正 ELF 的 RPATH,socat 与 pexpect 支撑自动化测试,zstd 与 liblz4-tool 用于新型压缩格式。若缺少这些包,构建往往在 do_configure 或 do_package 阶段才报错,排查成本很高,因此建议一次性装齐。
二、Poky 源码获取:选择正确的分支
Poky 是 Yocto 项目的参考发行版,包含 BitBake、OpenEmbedded-Core 和若干 BSP 层。获取方式有两种:直接克隆 Poky,或克隆 Poky 后再叠加 meta-openembedded 等常用层。入门阶段先克隆 Poky 即可:
git clone -b kirkstone git://git.yoctoproject.org/poky.git
cd poky
git branch -a
分支名对应 Yocto 版本代号,例如 kirkstone 对应 4.0,dunfell 对应 3.1。分支选择要与后续 BSP 层、meta-openembedded 层保持一致,混用不同代号的分支是初学者最常见的失败原因之一。
三、初始化构建环境:oe-init-build-env 做了什么
Poky 通过一个 shell 脚本初始化环境,它并不修改系统全局变量,而是在当前 shell 中设置 PATH、BBPATH、BUILDDIR 等变量,并创建构建目录:
source oe-init-build-env build-qemu
# 等价于:
# . ./oe-init-build-env build-qemu
执行后你会进入 build-qemu 目录,其中自动生成 conf/local.conf 与 conf/bblayers.conf。前者定义目标机器、发行版、并行度、下载目录等;后者声明本次构建启用了哪些层。初始化脚本还会把 BitBake 加入 PATH,因此之后可以直接运行 bitbake 命令。
source oe-init-build-env,否则 bitbake 不在 PATH 中。可以把这条命令写进 shell 别名或脚本,减少重复输入。四、目录结构说明:理解构建系统的空间布局
Poky 源码树与构建目录是分离的:源码树存放元数据,构建目录存放配置、下载缓存、临时产物和最终镜像。下图展示了这一关系,以及第一次构建时数据从层到镜像的流动方向。
需要重点记住三个目录:tmp/work/ 存放每个配方的工作目录,tmp/deploy/images/<machine>/ 存放最终镜像,downloads/ 存放源码压缩包。清理构建时通常删除 tmp/,而保留 downloads/ 与 sstate-cache/ 可以大幅加速重建。
五、第一个镜像构建:core-image-minimal
初始化完成后,直接构建最小镜像:
bitbake core-image-minimal
首次构建会下载大量源码并编译工具链,耗时从几十分钟到数小时不等。构建成功后,镜像位于:
tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.wic
tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4
若使用 QEMU 验证,可运行:
runqemu qemux86-64
下表汇总了本节涉及的关键文件与作用,便于对照排查:
| 文件/目录 | 位置 | 作用 |
|---|---|---|
| oe-init-build-env | poky/ | 初始化构建环境,创建构建目录 |
| local.conf | build-qemu/conf/ | 定义 MACHINE、DISTRO、并行度、下载目录 |
| bblayers.conf | build-qemu/conf/ | 声明启用的层及其路径 |
| tmp/work/ | build-qemu/ | 各配方的工作目录与编译产物 |
| tmp/deploy/images/ | build-qemu/ | 最终镜像与根文件系统 |
| downloads/ | build-qemu/ | 源码压缩包缓存,可跨构建复用 |
| sstate-cache/ | build-qemu/ | 共享状态缓存,加速重复构建 |
六、常见误区与复盘
- 分支混用:Poky 用 kirkstone,BSP 层却用 dunfell,解析阶段就会报层不兼容。所有层应统一到同一 Yocto 代号。
- 忘记 source:新终端未执行
oe-init-build-env,直接运行bitbake会提示命令不存在。 - 误删 downloads:清理时只删
tmp/即可,删除downloads/会导致所有源码重新下载。 - 并行度设置过高:
BB_NUMBER_THREADS与PARALLEL_MAKE超过 CPU 核数会引发内存不足,建议先设为核数的一半再逐步上调。 - 忽略磁盘空间:一次完整构建可能占用 50 GB 以上,构建前应确认磁盘余量。