2 准备使用 Yocto Project

本章介绍使用 Yocto Project 前的准备工作,包括建立团队开发环境、设置 构建主机、查找项目源码 仓库,以及创建本地 Git 仓库。

2 创建团队开发环境

如何在团队环境中使用 Yocto Project,或将其扩展到大型开发团队,可能并不 直观。Yocto Project 能适应很多用途和场景,但这种灵活性也可能给建立高效 可扩展的工作环境带来困难。

本节提供一个总体流程,汇集项目中已经证明有效的经验、实践、解决方案和 技术,帮助你设置这类环境。它只是起点,可以在此基础上调整,使其适合特定 工作环境和实践。

  1. 明确参与开发的人员: 首先了解谁会从事与 Yocto Project 相关的工作, 并确定各自角色。这是后续准备设备、设置开发环境硬件拓扑的基础。

    可能的角色包括:

    • 应用程序开发者: 在现有软件栈上进行应用层开发。

    • 核心系统开发者: 开发操作系统镜像本身的内容。

    • 构建工程师: 管理自动构建器和发行版本。并非所有环境都需要此角色。

    • 测试工程师: 创建和管理自动化测试,确保应用程序与核心系统开发 达到预期质量标准。

  2. 准备硬件: 根据团队规模和组成准备硬件。理想情况下,开发、构建和 测试工程师都使用受支持 Linux 发行版。系统通常应具备较高性能,例如 双路六核 Xeon、24 GB 内存和充足磁盘空间。测试及自动构建机器的性能 应尽可能高,以提高效率。

    备注

    处理能力充足时,也可以考虑构建运行在 Docker 中的 Yocto Project 开发容器,后文将介绍。

  3. 理解硬件拓扑: 明确硬件及团队组成后,即可梳理开发环境的硬件拓扑, 直观了解各机器及其角色。

  4. 使用 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 密钥识别用户,支持按分支控制仓库访问权限, 可以按需精细或宽松地配置。

  5. 设置应用开发机器: 应用开发者在现有软件栈上构建应用,推荐实践如下:

    • 使用包含软件栈的预构建工具链,再在其上开发应用。适用于少量相对 独立的应用。

    • 及时更新交叉开发工具链,可提供新版工具链下载,也可以通过软件包 更新机制升级已有工具链。具体方式和时机由本地策略决定。

    • 在本地不同位置安装多个工具链,以支持跨版本开发。

  6. 设置核心开发机器: 核心开发者处理操作系统内容。镜像开发机器的推荐 实践如下:

    • 在开发工作站提供 OpenEmbedded Build System,允许开发者 自行构建并直接重建软件栈。

    • 尽量保持核心系统不变,在其上的层中工作。升级核心系统或板级支持包 (BSP)时,这有助于提高可移植性。

    • 项目开发者共享层,并在其中保存定义项目的策略配置。

  7. 设置自动构建器: 自动构建器往往是开发环境的核心,用于汇集个人变更 并集中测试,再根据自动构建和测试结果作出发布决策。它还支持软件组件的 持续集成测试以及回归问题识别和跟踪。

    更多信息及 buildbot 链接见 “Yocto Project Autobuilder”。 Yocto Project 团队发现此实现在该角色上效果良好,其公开实例就是用于 检查项目整体健康状态的 Yocto Project 自动构建器。

    此系统的功能包括:

    • 突出显示破坏构建的提交。

    • 填充 共享状态缓存, 让开发者直接获取产物,无需本地构建。

    • 支持提交钩子,在出现新提交时触发构建。

    • 自动在快速模拟器 QEMU 中启动并测试镜像。

    • 支持增量构建测试和从头构建。

    • 共享输出,供开发者测试和调查历史回归。

    • 生成可用于发布的产物。

    • 支持构建调度,高效使用资源。

  8. 设置测试机器: 使用少量共享高性能系统执行测试。开发者可继续在 主工作站本地开发,同时利用这些系统开展更广泛、更充分的测试。

  9. 记录策略和变更流程: Yocto Project 使用分层组织和拉取模型,提供 create-pull-request、send-pull-request 脚本创建并发送拉取请求。 与其他开源项目类似,各维护者负责特定领域,由一名维护者完成最终顶层合并。

    备注

    也可以使用更集体化的推送模型,gitolite 很容易支持这两种模型。

    与任何开发环境一样,应记录采用的策略和主要项目指南,使所有人都理解。 结构清晰的提交说明通常也是项目规范的一部分,对于日后理解变更原因 至关重要。

    如果发现项目核心层需要修改,最好尽早与社区分享。你需要的变化,很可能 也是其他社区成员所需。

  10. 开发环境要点: 除上述步骤外,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 和内核开发的准备 方法见:

2 设置原生 Linux 主机

按以下步骤准备原生 Linux 构建主机:

  1. 使用受支持的 Linux 发行版: 应采用较新的 Linux 主机系统。较新版本的 Fedora、openSUSE、Debian、Ubuntu、RHEL 或 CentOS 经常接受 Yocto Project 测试并获官方支持,通常效果最好。验证中的发行版及状态见参考手册的 “支持的 Linux 发行版” 一节。

  2. 保留足够空间: 系统应有至少 50 GB 可用磁盘空间用于构建镜像。

  3. 满足最低版本要求: 现代发行版只要提供以下版本的 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 版本” 一节。

  4. 安装开发主机软件包: 所需软件包取决于构建主机和开发目标。如果希望 覆盖所有场景,需要安装的软件包数量会很多。

    各场景的软件包列表见参考手册的 “构建主机所需的软件包” 一节。

完成这些步骤后,就可以在原生 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 机器准备为构建主机的基本步骤如下:

  1. 确保 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]
    
  2. 在 WSL 2 中安装所选 Linux 发行版: 确认 Windows 支持 WSL 2 后, 打开 Microsoft Store,搜索 Linux 并选择发行版。虽然有多个可选项,此处 假定你选择的是前文原生主机说明中列出的 Yocto Project 受支持发行版。 点击 "Get" 下载并安装。

  3. 检查 WSL 2 使用的发行版: 打开 Windows PowerShell 并运行:

    C:\WINDOWS\system32> wsl -l -v
    NAME    STATE   VERSION
    *Ubuntu Running 2
    

    WSL 2 支持安装并运行任意多个不同的 Linux 发行版。

  4. 按需了解 WSL: 更多信息见 https://docs.microsoft.com/en-us/windows/wsl/wsl2-about。

  5. 启动 WSL 发行版: 与普通应用一样,从 Windows 开始菜单启动。

  6. 经常优化 WSL 2 存储: 由于 WSL 2 的存储处理方式,底层 Linux 发行版 的空间使用变化不会立即反映。BitBake 大量使用存储,多次构建后可能在 不知情时耗尽空间。WSL 2 使用 VHDX 文件保存数据,定期手动优化该文件 可避免此问题:

    1. 查找 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 参考 发行版。设置它有两种方式:

备注

Poky 是参考发行版,可用于试用 Yocto Project,但不应直接用于 生产环境。建议创建自己的发行版,见开发任务手册的 创建自己的发行版 一节。

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。

2 后续步骤