3. Poky参考发行版:理解核心构建系统
Poky 是 Yocto 项目提供的参考发行版,它不是一个完整的嵌入式 Linux 发行版,而是一个构建系统示例和元数据集合。理解 Poky 的结构与 BitBake/OpenEmbedded 的关系,是掌握 Yocto 项目定制流程的第一步。
3.1 Poky 是什么
Poky 本质上是一个集成层,它聚合了构建嵌入式 Linux 系统所需的核心组件:
- 构建引擎:BitBake 任务调度器
- 核心元数据:OpenEmbedded-Core (OE-Core) 配方与类
- 参考发行版配置:meta-poky 层的默认策略
- 参考 BSP:meta-yocto-bsp 层提供的硬件支持
关键理解:Poky 是 Yocto 项目的“样板间”,展示了如何组织层、配置构建、生成镜像。实际产品开发通常基于 Poky 裁剪,而非直接使用。
3.2 Poky 目录结构详解
克隆 Poky 仓库后,顶层目录结构如下表所示:
| 目录/文件 | 作用 | 是否必须 |
|---|---|---|
bitbake/ |
BitBake 构建引擎源码 | 是 |
meta/ |
OpenEmbedded-Core 核心层(配方、类、配置) | 是 |
meta-poky/ |
Poky 参考发行版配置层 | 是 |
meta-yocto-bsp/ |
Yocto 参考板级支持包层 | 是 |
scripts/ |
辅助脚本(如 oe-init-build-env) |
是 |
documentation/ |
项目文档源码 | 否 |
3.2.1 meta/ — OpenEmbedded-Core (OE-Core)
meta/ 是构建系统的核心层,包含所有架构无关的配方、类和基础配置。它定义了:
- 配方(recipes):如何获取、配置、编译、安装软件包
- 类(classes):可复用的构建逻辑(如
autotools.bbclass、cmake.bbclass) - 机器配置(machine conf):通用 CPU 架构定义(如 qemuarm、qemux86)
- 发行版配置(distro conf):默认策略(如
poky.conf的继承)
核心原则:OE-Core 不包含任何特定于 Poky 发行版或特定硬件的配置,保持纯上游中立性。
3.2.2 meta-poky/ — 参考发行版配置
meta-poky/ 层将 OE-Core 实例化为一个具体的参考发行版。它提供:
- 发行版配置文件:
conf/distro/poky.conf,设置版本号、维护者、默认特性 - 本地化配置:
conf/local.conf.sample,作为用户自定义配置的模板 - 包组定义:如
packagegroup-core-boot、packagegroup-core-x11
3.2.3 meta-yocto-bsp/ — 参考板级支持包
meta-yocto-bsp/ 层提供对特定硬件平台的支持,主要用于测试和参考:
- 机器配置:如
conf/machine/beaglebone-yocto.conf、conf/machine/edgerouter.conf - 内核配方:针对参考板的 Linux 内核源码与补丁
- 引导加载程序配方:如 U-Boot 配置
3.3 理解 BitBake 与 OpenEmbedded 构建系统
Yocto 项目的构建系统由两个核心组件构成:BitBake(任务调度器)和 OpenEmbedded(元数据框架)。
常见混淆:BitBake 是独立于 Yocto 的项目,OpenEmbedded 是元数据集合。Poky 将两者打包在一起,但概念上它们是分离的。
3.3.1 BitBake 的角色
BitBake 是一个类 Make 的任务调度引擎,专门为嵌入式 Linux 构建设计。它的核心职责:
- 解析元数据:读取
.bb、.bbclass、.conf文件,构建依赖图 - 任务调度:根据依赖关系并行执行任务(如
do_fetch、do_compile、do_install) - 缓存管理:使用共享状态缓存(sstate)加速增量构建
- 变量展开:支持 Python 表达式和覆盖语法
3.3.2 OpenEmbedded 的角色
OpenEmbedded 是元数据框架,定义了 BitBake 如何理解嵌入式 Linux 构建:
- 配方格式:
.bb文件的语法和变量约定 - 任务生命周期:标准任务流(fetch → unpack → patch → configure → compile → install → package → image)
- 层机制:通过
BBLAYERS实现元数据分层与覆盖 - 类继承:通过
inherit关键字复用构建逻辑
3.4 构建系统架构图
下图展示了 Poky、BitBake、OpenEmbedded 三者之间的协作关系:
3.5 构建流程概览
从源码到镜像的典型流程如下:
- 初始化环境:运行
source oe-init-build-env设置构建目录 - 配置构建:编辑
conf/local.conf(目标机器、并行度)和conf/bblayers.conf(层列表) - 执行构建:运行
bitbake core-image-minimal触发任务链 - 生成输出:在
tmp/deploy/images/下获得镜像文件
关键文件:
bblayers.conf 定义了哪些层参与构建,local.conf 定义了构建参数。这两个文件是定制发行版的入口。
3.6 层优先级与覆盖机制
当多个层提供同名的配方或配置文件时,层优先级决定最终使用哪个版本:
| 层 | 默认优先级 | 典型内容 |
|---|---|---|
meta/ |
5 | 基础配方、类、架构配置 |
meta-poky/ |
5 | 发行版策略、包组 |
meta-yocto-bsp/ |
6 | 参考板 BSP 配方 |
meta- |
用户定义 | 自定义配方、补丁、配置 |
优先级越高的层,其配方和配置会覆盖优先级低的层。这允许用户在不修改上游层的情况下定制系统。
3.7 本章小结
- Poky 是 Yocto 的参考发行版,包含 BitBake、OE-Core、meta-poky、meta-yocto-bsp
- BitBake 是任务调度引擎,负责解析元数据并执行构建任务
- OpenEmbedded 是元数据框架,定义了配方格式、任务流和层机制
- 三层元数据(meta、meta-poky、meta-yocto-bsp)分别提供核心功能、发行版策略和硬件支持
- 层优先级机制允许用户通过添加自定义层覆盖默认行为