1 Yocto Project 简介

1 什么是 Yocto Project?

Yocto Project 是开源协作项目,帮助开发者为嵌入式产品创建定制 Linux 系统, 不受硬件架构限制。它提供灵活工具集和开发环境,让全球开发者共享技术、软件 栈、配置和实践,共同生成所需镜像。

全球数千名开发者发现,它在系统与应用开发、归档管理,以及速度、体积和内存 定制方面都有优势,已成为交付嵌入式软件栈的一种标准。项目支持跨硬件平台 定制和交换构建成果,也支持可维护、可扩展的软件栈。

../_images/key-dev-elements.svg

下面概述其优势和挑战。

1 功能特点

主要功能与优势包括:

  • 行业广泛采用: 众多半导体、操作系统、软件和服务厂商在产品中采用并 支持它。社区和参与企业见 项目首页 的 COMMUNITY 和 ABOUT。

  • 架构无关: 支持 Intel、ARM、MIPS、AMD、PPC、RISC-V 等。多数 ODM、OSV 和芯片厂商为自己的硬件提供 BSP,自定义芯片也可自行创建。部分架构的 支持级别见 Yocto Project 支持的架构和功能。

    此外,项目充分支持 QEMU 模拟的多种设备。

  • 镜像和代码容易迁移: 可以跨架构转移而无需更换开发环境。若无法继续 维护所创建的镜像或应用,https://www.yoctoproject.org/members/ 和 https://www.yoctoproject.org/about/participants/ 中的商业 Linux 厂商可接手支持。

  • 灵活: 例如企业可建立各产品组共用的内部 Linux 发行版,再通过定制和 分层满足具体产品需求。

  • 适合资源受限的嵌入式和 IoT 设备: 只添加真正需要的功能与软件包。 有显示硬件时,可选 X11、Wayland、GTK+、Qt、Clutter、SDL 等创建丰富界面; 无显示或使用其他界面框架时,则不构建这些组件。

  • 完善工具链: 支持架构的工具链覆盖多数用途。硬件有标准工具链之外的 特性时,可通过平台调优参数定制;也可使用内置机制接入第三方工具链。

  • 机制优先于策略: 用户按设计需要自行制定策略,不必接受系统软件供应商 强制的决策。

  • 层模型: 层基础设施 将相关功能分组,按需逐步加入。隔离和组织功能可降低复杂度与重复,便于 扩展和定制。

  • 局部构建: 通过 共享状态缓存 按需构建或重建单个包,方便独立调试组件。

  • 固定发布节奏: 主要版本按 六个月周期, 在四月和十月发布。最近两个版本通过补丁版本处理 CVE。这种可预测性便于 下游项目规划。

  • 丰富生态: 社区提供支持论坛、专业知识和持续推进项目的活跃开发者。

  • 二进制可复现: 可精确指定依赖,实现很高的可复现比例,例如 core-image-minimal 为 99.8%。其他构建系统若不明确依赖包及顺序,可能 随意纳入软件包。

  • 许可证清单: 提供 许可证清单, 供法务等需要跟踪开源许可的人员审阅。

1 挑战

可能遇到的挑战包括:

  • 学习曲线陡峭: 同类任务有多种实现方式,选择可能不容易。

  • 针对设计的修改需要研究: 简单教程之外,理解具体项目需要改什么,可能 需要大量调查。入门转向实际项目的帮助见 “希望在使用 Yocto 项目前就知道的事” 和 “转向定制的系统开发环境”。

  • 工作流程可能陌生: 习惯桌面或服务器开发的人可能不易理解 Yocto 流程。 桌面系统通常直接从网络安装预编译包,而在这里添加包需要修改配置并重建。

  • 交叉构建可能不熟悉: 直接在目标编译、执行和测试有时比主机 BitBake 构建再部署更快。虽然支持目标端开发工具,仍需额外把修改整合回构建环境。 折中方式是在主机 BitBake 环境修改,只部署更新的软件包。

    构建系统生成 RPM、DEB、IPK 标准包。镜像若启用 运行时包管理, 可用目标上的 rpm/dnf、dpkg/apt 或 opkg 安装到运行中的系统。

  • 首次构建耗时长: 完整 Linux 系统需从头构建大量软件包,初次耗时难以 避免。之后共享状态缓存避免重建未变化内容,大幅缩短后续构建。

1 Yocto Project 层模型

层模型面向嵌入式和 IoT Linux,同时支持协作与定制,是它区别于简单构建系统 的重要特点。层是包含相关指令的仓库,指导 OpenEmbedded Build System, 可以协作、共享和复用。

层可随时修改此前的指令或设置。这种覆盖能力使社区或协作层能够适应产品需求。

用不同层分离 BSP、GUI、发行版策略、中间件、应用等信息。把所有内容放在一层 会限制未来定制和复用,即使单项目中这样做看似方便,元数据越模块化,越容易 应对变化。

备注

  • 尽可能使用芯片厂商的 BSP 层。

  • 了解 Yocto Project 兼容层 和 OpenEmbedded 层索引。后者更多,但统一验证较少。

  • 层可以集成技术、硬件和软件组件。 Yocto Project Compatible 提供最低标准化要求,增强生态。适用的 BSP、OE 兼容层和相关开源项目 获得资格后,提供者可使用项目徽标及品牌素材。

例如,机器定制放在专用 BSP 层,与新 GUI 所需配方和元数据隔离,形成硬件层 和 GUI 层。BSP 层仍可通过 .bbappend 为 GUI 配方添加机器专用内容,而 不污染 GUI 层本身。

Source Directory 默认包含通用层和 BSP 层,名称通常以 meta- 开头。

备注

此前缀不是硬性要求,但属于社区惯例。

例如查看 openembedded-core 的 树视图, 可见 meta、meta-skeleton 和 meta-selftest,分别代表不同层。

创建方法见 “理解和创建层”。

1 组件和工具

项目自身、开发者及用户使用一组开源组件、工具和元数据,它们与参考发行版 Poky 及 OpenEmbedded Build System 分开,多数需单独下载。 本节作简要介绍。

1 开发工具

用于镜像和应用开发的工具包括:

  • devtool: eSDK 的核心命令行工具,帮助构建、测试、打包,并可将结果 集成到构建系统生成的镜像。

    子命令支持新增、修改和升级配方。add 自动生成配方,modify 根据已有配方 找到源码和补丁,两者都建立由开发者控制的源码树,允许自由修改。新配方 和源码默认放在 eSDK 工作区。upgrade 更新配方以适应新版源码。

    工作流程见 “在 SDK 工作流中使用 devtool”。

  • 可扩展 SDK(eSDK): 提供针对具体镜像定制的交叉工具链和库,方便添加 应用与库、修改组件源码、在硬件测试并集成回构建系统。它将工具链体验与 devtool 的强大功能结合,详见 Yocto 项目应用开发与软件开发套件(SDK/eSDK)手册。

  • Toaster: 构建系统的 Web 界面,可配置、运行并查看构建,见 Toaster 用户手册。

  • VSCode IDE 扩展: Yocto Project BitBake 支持配方及嵌入 Python、Bash 的高亮、悬停和补全,提供浏览、编辑及构建 命令,并通过 devtool 集成 SDK 交叉编译和调试。

    详见 扩展主页。

1 生产相关工具

用于生产活动的工具包括:

  • Auto Upgrade Helper: 配合 BitBake 和 OE-Core,按上游新版本自动生成 配方升级。设置见 使用自动升级助手(AUH)。

  • Recipe Reporting System: 跟踪可用配方版本,帮助管理维护工作并动态 展示项目概况,建立在 OpenEmbedded 层索引 之上。

  • Patchwork: 项目实例 是 OzLabs 原项目的分支,通过 Web 跟踪贡献,帮助 组织每次发行涉及的数千个补丁。

  • AutoBuilder: 自动化构建测试和 QA。公开实例让任何人查看 OE-Core、 BitBake 等核心仓库开发分支的状态。

    备注

    它基于 buildbot。

    项目希望推动开源行业的自动测试和 QA,鼓励社区公开测试计划、展示执行 过程,并开发自动化工具服务整个社区。

    详见 Autobuilder 介绍。

  • Pseudo: 项目的 fakeroot 实现,让命令看起来 运行于 root 环境。

    构建可能需要设置所有者或权限等管理员操作。直接使用 Pseudo 或通过 LD_PRELOAD,可在没有管理员权限时让这些操作成功,因此构建目标镜像 永远无需 root。详见 “Fakeroot 与 Pseudo”。

1 OpenEmbedded 构建系统组件

相关组件包括:

  • BitBake: 项目核心组件,构建系统用它生成镜像,但它独立维护。

    这是通用任务执行引擎,在复杂依赖约束下高效并行运行 Shell 和 Python 任务,依据特定格式的配方执行工作。详见 BitBake 用户手册。

  • OpenEmbedded-Core: OE-Core 是 OpenEmbedded 派生系统共用的配方、类 及文件集合,由 Yocto Project 与 OpenEmbedded 共同维护。源码见 仓库。

    早期 Poky 集成全部相关元数据。Yocto Project 1.0 之后,两个项目共同 维护 OE-Core,将原 Poky 的许多功能放入公共核心,实现 OpenEmbedded 长期追求的严格管理、质量受控核心,也符合 Yocto 以少量完整工具替代 众多分散工具的目标。

    如今 Poky 仓库 不再更新,设置 Poky 发行版所需仓库的首选方法已是 bitbake-setup。

1 成品目标的软件包

相关组件包括:

  • Matchbox: 面向手持设备、机顶盒、信息终端等非桌面嵌入式平台的开源 X Window 基础环境,适用于显示空间、输入方式或资源受限场景。

    它由可替换、可选的应用组成,可按平台定制以改善使用体验。源码见 Yocto Project 源码仓库。

  • Opkg: 基于 ipkg 的轻量包管理系统,用 C 编写,操作类似 APT 和 dpkg。 面向嵌入式 Linux,Yocto Project、OpenEmbedded 和 OpenWrt 都使用它。

    备注

    它尽量兼容 ipkg,并遵循 Debian 控制文件规范的一个子集。

    源码见 Yocto Project 源码仓库。

1 已归档组件

Build Appliance 是虚拟机镜像,使非 Linux 开发系统能构建和启动自定义 嵌入式 Linux。历史上它是三种非原生 Linux 使用方案中的第二种:

  1. Hob: 早期基础图形界面,已弃用,自 2.1 起移除,由 Toaster 完全替代。

  2. Build Appliance: Hob 之后出现,适合试用项目环境,从未推荐作为日常 生产开发环境。

  3. CROPS: 曾用于非 Linux 系统开发,见 https://github.com/crops/poky-container。

1 开发方式

环境通常包括构建主机和目标硬件,主机构建镜像及应用,目标执行部署的软件。 选择取决于工作偏好和主机操作系统。

备注

更多细节见 “Yocto Project 开发环境”。

  • 原生 Linux: 最佳选择,可在受支持发行版普通 Shell 中直接用 BitBake 完成全部开发。设置见 “设置原生 Linux 主机”。

  • OCI 容器: 通常用于 Windows、macOS 等非 Linux 主机,例如 OCI 兼容的 Docker 或 Podman。

  • WSL 2: Windows 10、Windows Server 2019 及以后版本可使用它,在轻量 虚拟机内运行真实 Linux 内核。设置见 “设置 Windows Subsystem For Linux(WSL 2)”。

  • Toaster: 不论主机运行什么系统,都可通过 Web 配置和运行构建,将信息 保存到数据库,也可操作多个远程构建服务器。见 Toaster 用户手册。

  • VSCode 扩展: 通过 Yocto Project BitBake 图形界面启动构建,详见 市场页面。

1 参考嵌入式发行版(Poky)

Poky 读作 Pock-ee,是项目参考发行版或 Reference OS Kit,其定义是 meta-poky 中的 DISTRO 配置文件。

警告

尽管规范完整且经过测试和 QA,当前形式的 Poky 不能直接作为成品使用。

它遵循成熟固定的六个月发布周期,详见 Yocto Project 版本与稳定版本发布流程。

1 OpenEmbedded 构建系统流程

构建系统按以下流程生成镜像和 SDK:

../_images/yp-flow-diagram.svg

概要步骤:

  1. 开发者指定架构、策略、补丁和配置。

  2. 系统从指定位置获取源码,支持归档、Git 等标准方式。

  3. 解包到本地工作区,应用补丁,再配置和编译。

  4. 安装到临时暂存区域,以 DEB、RPM 或 IPK 打包。

  5. 整个过程执行各种 QA 和合理性检查。

  6. 生成二进制包源,用于创建最终根文件系统镜像。

  7. 并行生成文件系统镜像和应用开发所需的定制 SDK。

详细说明见 “OpenEmbedded 构建系统概念”。

1 基本术语

完整术语表见参考手册的 “Yocto Project 术语”。 以下列出入门所需定义:

  • 配置文件: 保存全局及用户变量、硬件信息,告诉构建系统构建什么,以及 为平台支持向镜像加入什么。

  • 可扩展 SDK(eSDK): 面向应用开发者的定制 SDK,允许把库和程序修改 整合回镜像,供其他开发者使用。见 Yocto 项目应用开发与软件开发套件(SDK/eSDK)手册。

  • 层: 相关元数据集合,可含配方、机器配置、发行版配置及类。通过汇集 和隔离元数据实现定制与多架构支持。层按层级覆盖先前设置,可以组合现有 层,再添加自己的层。可通过层索引搜索。

    详见 “理解和创建层”,BSP 专题见 “BSP 层”。

  • 元数据: 构建 Linux 发行版的关键,由构建系统解析。包括配方、配置及 构建指令、控制构建内容和效果的数据,以及软件版本、来源、补丁和辅助 文件等。OE-Core 是重要的已验证元数据集合。

  • OpenEmbedded 构建系统: 有时也被称为 BitBake 或构建系统。

    BitBake 解析配方和配置,创建依赖树安排编译,再调度执行定制 Linux 镜像 构建,类似 make。

    构建中跟踪依赖并执行本机或交叉编译。交叉构建首先尝试创建适合目标平台 的交叉工具链,即可扩展 SDK。

  • OpenEmbedded-Core(OE-Core): 多个 OpenEmbedded 派生系统共用的基础 配方、类和文件。它从社区原始仓库精选并缩减为持续验证的核心,实现严格 管理和质量保证。元数据可见 源码仓库 的 meta 目录。

  • 软件包: 在本项目中,指 BitBake 处理配方后的打包输出,通常是编译 二进制,俗称“烘焙”配方。

    其他上下文可能含义略异,例如 “构建主机所需的软件包” 中的软件包是为主机发行版增加功能的预编译二进制。

    历史上配方也称 package,因此 PR、PV、PE 等 变量名称看起来可能不完全准确。

  • Poky: 参考嵌入式发行版和测试配置,提供:

    • 基础可用 DISTRO,展示发行版定制方法。

    • 验证 Yocto Project 组件的手段。

    它不是产品级发行版,而是定制起点。

  • 配方: 最常见元数据形式,包含构建软件包的设置和任务,软件包再组成 镜像。配方描述源码位置、补丁、库或其他配方依赖,以及配置和编译选项。 相关配方汇集为层。