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 构建设计。它的核心职责:

  1. 解析元数据:读取 .bb、.bbclass、.conf 文件,构建依赖图
  2. 任务调度:根据依赖关系并行执行任务(如 do_fetch、do_compile、do_install)
  3. 缓存管理:使用共享状态缓存(sstate)加速增量构建
  4. 变量展开:支持 Python 表达式和覆盖语法

3.3.2 OpenEmbedded 的角色

OpenEmbedded 是元数据框架,定义了 BitBake 如何理解嵌入式 Linux 构建:

  • 配方格式:.bb 文件的语法和变量约定
  • 任务生命周期:标准任务流(fetch → unpack → patch → configure → compile → install → package → image)
  • 层机制:通过 BBLAYERS 实现元数据分层与覆盖
  • 类继承:通过 inherit 关键字复用构建逻辑

3.4 构建系统架构图

下图展示了 Poky、BitBake、OpenEmbedded 三者之间的协作关系:

Yocto 项目构建系统架构 Poky 参考发行版(集成层) BitBake 任务调度引擎 解析元数据 · 调度任务 · 管理缓存 OpenEmbedded 元数据框架 配方格式 · 任务流 · 层机制 · 类继承 meta/ (OE-Core) meta-poky/ meta-yocto-bsp/ 构建输出:镜像 · SDK · 包仓库 说明: 1. Poky 聚合 BitBake + OpenEmbedded + 三层元数据 2. BitBake 负责执行,OpenEmbedded 负责定义“做什么”和“怎么做” 3. 用户通过添加自定义层扩展功能,覆盖默认配置

3.5 构建流程概览

从源码到镜像的典型流程如下:

  1. 初始化环境:运行 source oe-init-build-env 设置构建目录
  2. 配置构建:编辑 conf/local.conf(目标机器、并行度)和 conf/bblayers.conf(层列表)
  3. 执行构建:运行 bitbake core-image-minimal 触发任务链
  4. 生成输出:在 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)分别提供核心功能、发行版策略和硬件支持
  • 层优先级机制允许用户通过添加自定义层覆盖默认行为