2 准备使用 Yocto Project
本章介绍使用 Yocto Project 前的准备工作,包括建立团队开发环境、设置 构建主机、查找项目源码 仓库,以及创建本地 Git 仓库。
2 创建团队开发环境
如何在团队环境中使用 Yocto Project,或将其扩展到大型开发团队,可能并不 直观。Yocto Project 能适应很多用途和场景,但这种灵活性也可能给建立高效 可扩展的工作环境带来困难。
本节提供一个总体流程,汇集项目中已经证明有效的经验、实践、解决方案和 技术,帮助你设置这类环境。它只是起点,可以在此基础上调整,使其适合特定 工作环境和实践。
明确参与开发的人员: 首先了解谁会从事与 Yocto Project 相关的工作, 并确定各自角色。这是后续准备设备、设置开发环境硬件拓扑的基础。
可能的角色包括:
应用程序开发者: 在现有软件栈上进行应用层开发。
核心系统开发者: 开发操作系统镜像本身的内容。
构建工程师: 管理自动构建器和发行版本。并非所有环境都需要此角色。
测试工程师: 创建和管理自动化测试,确保应用程序与核心系统开发 达到预期质量标准。
准备硬件: 根据团队规模和组成准备硬件。理想情况下,开发、构建和 测试工程师都使用受支持 Linux 发行版。系统通常应具备较高性能,例如 双路六核 Xeon、24 GB 内存和充足磁盘空间。测试及自动构建机器的性能 应尽可能高,以提高效率。
备注
处理能力充足时,也可以考虑构建运行在 Docker 中的 Yocto Project 开发容器,后文将介绍。
理解硬件拓扑: 明确硬件及团队组成后,即可梳理开发环境的硬件拓扑, 直观了解各机器及其角色。
使用 Git 作为源码管理系统(SCM): 建议将 Metadata,即配方、 配置文件、类等,以及开发的软件,纳入与 OpenEmbedded build system 兼容的 SCM。在 BitBake 支持的 SCM 中,Yocto Project 团队强烈推荐 Git。Git 是分布式系统, 易于备份,支持离线或远程工作后再连接到基础设施。
备注
BitBake 的更多信息见 BitBake User Manual。
设置 Git 服务并建立类似 https://git.yoctoproject.org/ 的基础设施相对容易。该服务 使用 Gitolite 服务器软件,并由 cgit 生成仓库浏览界面。
gitolite通过 SSH 密钥识别用户,支持按分支控制仓库访问权限, 可以按需精细或宽松地配置。设置应用开发机器: 应用开发者在现有软件栈上构建应用,推荐实践如下:
使用包含软件栈的预构建工具链,再在其上开发应用。适用于少量相对 独立的应用。
及时更新交叉开发工具链,可提供新版工具链下载,也可以通过软件包 更新机制升级已有工具链。具体方式和时机由本地策略决定。
在本地不同位置安装多个工具链,以支持跨版本开发。
设置核心开发机器: 核心开发者处理操作系统内容。镜像开发机器的推荐 实践如下:
在开发工作站提供 OpenEmbedded Build System,允许开发者 自行构建并直接重建软件栈。
尽量保持核心系统不变,在其上的层中工作。升级核心系统或板级支持包 (BSP)时,这有助于提高可移植性。
项目开发者共享层,并在其中保存定义项目的策略配置。
设置自动构建器: 自动构建器往往是开发环境的核心,用于汇集个人变更 并集中测试,再根据自动构建和测试结果作出发布决策。它还支持软件组件的 持续集成测试以及回归问题识别和跟踪。
更多信息及 buildbot 链接见 “Yocto Project Autobuilder”。 Yocto Project 团队发现此实现在该角色上效果良好,其公开实例就是用于 检查项目整体健康状态的 Yocto Project 自动构建器。
此系统的功能包括:
突出显示破坏构建的提交。
填充 共享状态缓存, 让开发者直接获取产物,无需本地构建。
支持提交钩子,在出现新提交时触发构建。
自动在快速模拟器 QEMU 中启动并测试镜像。
支持增量构建测试和从头构建。
共享输出,供开发者测试和调查历史回归。
生成可用于发布的产物。
支持构建调度,高效使用资源。
设置测试机器: 使用少量共享高性能系统执行测试。开发者可继续在 主工作站本地开发,同时利用这些系统开展更广泛、更充分的测试。
记录策略和变更流程: Yocto Project 使用分层组织和拉取模型,提供
create-pull-request、send-pull-request脚本创建并发送拉取请求。 与其他开源项目类似,各维护者负责特定领域,由一名维护者完成最终顶层合并。备注
也可以使用更集体化的推送模型,
gitolite很容易支持这两种模型。与任何开发环境一样,应记录采用的策略和主要项目指南,使所有人都理解。 结构清晰的提交说明通常也是项目规范的一部分,对于日后理解变更原因 至关重要。
如果发现项目核心层需要修改,最好尽早与社区分享。你需要的变化,很可能 也是其他社区成员所需。
开发环境要点: 除上述步骤外,Yocto Project 开发环境还建议:
使用 Git 管理源码。
按实际需要将元数据组织到层中。更多信息见概述与概念手册的 “Yocto Project 层模型” 及本手册的 “理解和创建层” 一节。
用独立 Git 仓库分隔项目元数据和代码。仓库介绍见概述与概念手册的 “Yocto Project 源码仓库”。 如何为相关上游仓库设置本地 Git 仓库,见 “手动设置 Poky 参考发行版”。
合理设置共享状态缓存目录(SSTATE_DIR )。例如放在组织内 开发者共同使用的系统上,并在各机器上共享相同源码目录。
设置本地 哈希等价 服务器。
哈希等价功能的详细介绍,见 Yocto Project 概述与概念手册的 哈希等价 一节。
设置自动构建器,由它填充共享状态缓存和源码目录。
社区鼓励提交修复缺陷或添加功能的补丁。提交时,请遵循项目规范, 撰写良好的提交说明,见 Yocto Project 与 OpenEmbedded 贡献者指南的 “向组件贡献修改”。
尽早提交核心变更,其他人很可能遇到同样问题。选择邮件列表的指导见 “查找合适的邮件列表”; 可用列表说明见参考手册的 “邮件列表” 一节。
2 准备构建主机
本节介绍如何设置 Build Host,用于 Yocto Project 开发。推荐原生 Linux 机器,也可使用 OCI 容器, 例如 Docker 或 Podman, 或能够运行 Windows Subsystem For Linux 第 2 版(WSL 2)的 Windows 机器。
备注
Yocto Project 不兼容 Windows Subsystem for Linux 第 1 版。它与 WSL 2 兼容,但未获官方支持或验证。如果决定使用 WSL, 请升级到 WSL 2。
构建主机准备好后,还需要根据具体目标执行后续步骤。BSP 和内核开发的准备 方法见:
BSP 开发: Yocto Project 板级支持包(BSP)开发指南的 “准备使用 BSP 层的构建主机” 一节。
内核开发: Yocto Project Linux 内核开发手册的 “准备内核开发构建主机” 一节。
2 设置原生 Linux 主机
按以下步骤准备原生 Linux 构建主机:
使用受支持的 Linux 发行版: 应采用较新的 Linux 主机系统。较新版本的 Fedora、openSUSE、Debian、Ubuntu、RHEL 或 CentOS 经常接受 Yocto Project 测试并获官方支持,通常效果最好。验证中的发行版及状态见参考手册的 “支持的 Linux 发行版” 一节。
保留足够空间: 系统应有至少 50 GB 可用磁盘空间用于构建镜像。
满足最低版本要求: 现代发行版只要提供以下版本的 Git、tar、Python、 gcc 和 make,通常就能运行 OpenEmbedded 构建系统。
Git 2.22.0 或更高版本
tar 1.28 或更高版本
Python 3.9.0 或更高版本
gcc 10.1 或更高版本
GNU make 4.0 或更高版本
如果构建主机未满足全部要求,仍可通过准备系统使用 Yocto Project。方法见 参考手册的 “所需的 Git、tar、Python、make 和 gcc 版本” 一节。
安装开发主机软件包: 所需软件包取决于构建主机和开发目标。如果希望 覆盖所有场景,需要安装的软件包数量会很多。
各场景的软件包列表见参考手册的 “构建主机所需的软件包” 一节。
完成这些步骤后,就可以在原生 Linux 机器上选择开发路线。使用 BitBake 时, 见 “准备 Poky 参考发行版”;使用可扩展 SDK 时,见应用程序开发与可扩展 SDK 手册的 “使用可扩展 SDK” 一章;内核开发见 Yocto Project Linux 内核开发手册;使用 Toaster 时,见 Toaster 用户手册的 “配置和使用 Toaster”。VSCode 用户还可相应配置 Yocto Project BitBake 扩展。
2 设置 Windows Subsystem For Linux(WSL 2)
通过 Windows Subsystem for Linux(WSL 2), 可以在 Windows 内设置 Linux 发行版,建立 Yocto Project 开发环境并进行构建。
使用 WSL 2 将 Windows 机器准备为构建主机的基本步骤如下:
确保 Windows 机器可以运行 WSL 2:
所有 Windows 11 和 Windows Server 2022 版本都支持 WSL 2,但早期 Windows 10 和 Windows Server 2019 不支持。请检查 Windows 10 和 Windows Server 2019 的最低构建号要求。
可在 Windows 命令提示符运行 "ver",检查当前版本:
C:\Users\myuser> ver Microsoft Windows [Version 10.0.19041.153]
在 WSL 2 中安装所选 Linux 发行版: 确认 Windows 支持 WSL 2 后, 打开 Microsoft Store,搜索 Linux 并选择发行版。虽然有多个可选项,此处 假定你选择的是前文原生主机说明中列出的 Yocto Project 受支持发行版。 点击 "Get" 下载并安装。
检查 WSL 2 使用的发行版: 打开 Windows PowerShell 并运行:
C:\WINDOWS\system32> wsl -l -v NAME STATE VERSION *Ubuntu Running 2
WSL 2 支持安装并运行任意多个不同的 Linux 发行版。
按需了解 WSL: 更多信息见 https://docs.microsoft.com/en-us/windows/wsl/wsl2-about。
启动 WSL 发行版: 与普通应用一样,从 Windows 开始菜单启动。
经常优化 WSL 2 存储: 由于 WSL 2 的存储处理方式,底层 Linux 发行版 的空间使用变化不会立即反映。BitBake 大量使用存储,多次构建后可能在 不知情时耗尽空间。WSL 2 使用 VHDX 文件保存数据,定期手动优化该文件 可避免此问题:
查找 VHDX 文件位置:
首先查找发行版应用包目录。以管理员身份打开 Windows PowerShell, 运行:
C:\WINDOWS\system32> Get-AppxPackage -Name "*Ubuntu*" | Select PackageFamilyName PackageFamilyName ----------------- CanonicalGroupLimited.UbuntuonWindows_79abcdefgh
将下方路径中的 PackageFamilyName 和用户名替换为实际值,查找 VHDX:
ls C:\Users\myuser\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79abcdefgh\LocalState\ Mode LastWriteTime Length Name -a---- 3/14/2020 9:52 PM 57418973184 ext4.vhdx
VHDX 文件路径为:
C:\Users\myuser\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79abcdefgh\LocalState\ext4.vhdx
2a. 使用 Windows PowerShell 优化 VHDX:
使用
optimize-vhd前,先安装 Windows 的 Hyper-V 功能,再以 管理员身份打开 PowerShell,先关闭 WSL,再优化文件:C:\WINDOWS\system32> wsl --shutdown C:\WINDOWS\system32> optimize-vhd -Path C:\Users\myuser\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79abcdefgh\LocalState\ext4.vhdx -Mode full
优化时应显示进度条,完成后 Windows 资源管理器应正确反映存储占用。
2b. 使用 DiskPart 优化 VHDX:
上述
optimize-vhd由 Hyper-V 提供,但不是所有 Windows 版本都能 安装 Hyper-V。也可以使用 DiskPart。以管理员身份打开命令提示符, 先关闭 WSL,再执行优化:C:\WINDOWS\system32> wsl --shutdown C:\WINDOWS\system32> diskpart DISKPART> select vdisk file="<path_to_VHDX_file>" DISKPART> attach vdisk readonly DISKPART> compact vdisk DISKPART> detach DISKPART> exit
备注
当前 WSL 2 实现不能直接访问 USB 等外部设备,但会自动将 C: 挂载
到 /mnt/c/ 等位置。可借此共享部署产物,再通过 Windows 烧写硬件,
但 Build Directory 不应位于这些挂载点中。
WSL 2 设置好后,就可以像原生 Linux 机器一样开发。使用可扩展 SDK 容器时, 见应用程序开发与可扩展 SDK 手册的 “使用可扩展 SDK” 一章; 使用 Toaster 容器时,见 Toaster 用户手册的 “配置和使用 Toaster”。 VSCode 用户还可相应配置 Yocto Project BitBake 扩展。
2 准备 Poky 参考发行版
Build Host 准备好构建镜像后,下一步可以构建 Poky 参考 发行版。设置它有两种方式:
使用 BitBake 的
bitbake-setup命令行工具。参阅:手动克隆所需仓库。参阅:
2 初始化构建环境
初始化构建环境是一项常见任务:在已设置 Poky 参考发行版的环境中, 每个新 Shell 实例都需要执行。
如果使用
bitbake-setup设置 Poky,需要加载 bitbake-setup init 创建的 Setup 目录中的init-build-env文件:$ source <setup-dir>/build/init-build-env
如果通过手动克隆层设置 Poky,需要加载 OpenEmbedded-Core (OE-Core) 层中的
oe-init-build-env脚本:$ source openembedded-core/oe-init-build-env
这会设置当前 Shell,并将当前工作目录切换到 Build Directory。