1 Yocto Project 简介
1 什么是 Yocto Project?
Yocto Project 是开源协作项目,帮助开发者为嵌入式产品创建定制 Linux 系统, 不受硬件架构限制。它提供灵活工具集和开发环境,让全球开发者共享技术、软件 栈、配置和实践,共同生成所需镜像。
全球数千名开发者发现,它在系统与应用开发、归档管理,以及速度、体积和内存 定制方面都有优势,已成为交付嵌入式软件栈的一种标准。项目支持跨硬件平台 定制和交换构建成果,也支持可维护、可扩展的软件栈。
下面概述其优势和挑战。
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 层本身。
备注
BSP 层结构见 Yocto Project 板级支持包(BSP)手册。
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 使用方案中的第二种:
Hob: 早期基础图形界面,已弃用,自 2.1 起移除,由 Toaster 完全替代。
Build Appliance: Hob 之后出现,适合试用项目环境,从未推荐作为日常 生产开发环境。
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:
概要步骤:
开发者指定架构、策略、补丁和配置。
系统从指定位置获取源码,支持归档、Git 等标准方式。
解包到本地工作区,应用补丁,再配置和编译。
安装到临时暂存区域,以 DEB、RPM 或 IPK 打包。
整个过程执行各种 QA 和合理性检查。
生成二进制包源,用于创建最终根文件系统镜像。
并行生成文件系统镜像和应用开发所需的定制 SDK。
详细说明见 “OpenEmbedded 构建系统概念”。
1 基本术语
完整术语表见参考手册的 “Yocto Project 术语”。 以下列出入门所需定义:
配置文件: 保存全局及用户变量、硬件信息,告诉构建系统构建什么,以及 为平台支持向镜像加入什么。
可扩展 SDK(eSDK): 面向应用开发者的定制 SDK,允许把库和程序修改 整合回镜像,供其他开发者使用。见 Yocto 项目应用开发与软件开发套件(SDK/eSDK)手册。
层: 相关元数据集合,可含配方、机器配置、发行版配置及类。通过汇集 和隔离元数据实现定制与多架构支持。层按层级覆盖先前设置,可以组合现有 层,再添加自己的层。可通过层索引搜索。
元数据: 构建 Linux 发行版的关键,由构建系统解析。包括配方、配置及 构建指令、控制构建内容和效果的数据,以及软件版本、来源、补丁和辅助 文件等。OE-Core 是重要的已验证元数据集合。
OpenEmbedded 构建系统: 有时也被称为 BitBake 或构建系统。
BitBake 解析配方和配置,创建依赖树安排编译,再调度执行定制 Linux 镜像 构建,类似 make。
构建中跟踪依赖并执行本机或交叉编译。交叉构建首先尝试创建适合目标平台 的交叉工具链,即可扩展 SDK。
OpenEmbedded-Core(OE-Core): 多个 OpenEmbedded 派生系统共用的基础 配方、类和文件。它从社区原始仓库精选并缩减为持续验证的核心,实现严格 管理和质量保证。元数据可见 源码仓库 的 meta 目录。
软件包: 在本项目中,指 BitBake 处理配方后的打包输出,通常是编译 二进制,俗称“烘焙”配方。
其他上下文可能含义略异,例如 “构建主机所需的软件包” 中的软件包是为主机发行版增加功能的预编译二进制。
Poky: 参考嵌入式发行版和测试配置,提供:
基础可用 DISTRO,展示发行版定制方法。
验证 Yocto Project 组件的手段。
它不是产品级发行版,而是定制起点。
配方: 最常见元数据形式,包含构建软件包的设置和任务,软件包再组成 镜像。配方描述源码位置、补丁、库或其他配方依赖,以及配置和编译选项。 相关配方汇集为层。