Yocto项目实战:自定义Linux发行版构建 - 第3节

3.1 Poky 是什么?

Poky 是 Yocto 项目的参考发行版和构建系统参考实现。它不是 Yocto 项目的全部,而是 Yocto 项目最核心、最基础的“样板间”。理解 Poky 是掌握 Yocto 的第一步。

3.1.1 Poky 的核心组成

Poky 本质上是一个聚合仓库,它包含了构建一个最小 Linux 系统所需的所有关键组件。下表列出了 Poky 的主要组成部分及其作用:

组件 说明 在 Poky 中的角色
BitBake 任务执行引擎 解析元数据(配方、层、配置文件),调度和执行构建任务
OpenEmbedded-Core (OE-Core) 核心元数据层 提供基础配方(recipes)、类(classes)和机器配置,是构建 Linux 发行版的“配方库”
meta-poky Poky 发行版配置层 定义 Poky 作为参考发行版的默认策略、版本号和特性集
meta-yocto-bsp 参考板级支持包层 提供对 QEMU(模拟器)和部分真实硬件的内核配置与设备支持
文档与脚本 辅助工具 包含 oe-init-build-env 等初始化脚本和构建说明
关键理解:Poky 是 Yocto 项目的“最小可行产品”。当你下载 Poky 时,你实际上获得了 BitBake 引擎 + OE-Core 配方库 + 一套默认的发行版配置。你可以在 Poky 的基础上添加自己的层(Layers)来定制功能。

3.1.2 Poky 在 Yocto 项目中的位置

下面的 SVG 图展示了 Poky 与 Yocto 项目其他组件之间的关系。Poky 位于核心位置,是构建自定义发行版的起点。

Poky 在 Yocto 项目中的位置 Poky 在 Yocto 项目中的位置 Yocto 项目 用户自定义层 (Meta Layers) Poky (参考发行版) BitBake 任务执行引擎 OE-Core 核心元数据 meta-poky 发行版配置 meta-yocto-bsp BSP 支持 Poky 是 Yocto 的起点 用户在此基础上扩展

3.2 下载 Poky 源码

Poky 的源码托管在 git.yoctoproject.org。我们使用 Git 来克隆它。推荐的做法是克隆一个特定的稳定分支,而不是直接使用 master 分支,以确保构建环境的稳定性。

3.2.1 环境准备与分支选择

在开始之前,请确保你的 Linux 主机(推荐 Ubuntu 22.04 或 CentOS 7+)已经安装了以下基础软件包:

  • Git:用于版本控制。
  • tar:用于解压工具链。
  • Python 3:BitBake 依赖 Python 3。
  • gcc / g++:用于编译本地工具。
  • make:构建工具。

Yocto 项目每 6 个月发布一个稳定版本(如 Mickledore、Nanbield)。下表列出了常用的 Poky 稳定分支及其对应的 Yocto 版本:

Yocto 版本 Poky 分支名 建议用途
4.3 (Nanbield) nanbield 最新稳定版,用于新项目
4.2 (Mickledore) mickledore 上一稳定版,兼容性好
4.1 (Langdale) langdale 长期支持版 (LTS)
4.0 (Kirkstone) kirkstone 长期支持版 (LTS),推荐企业使用

3.2.2 克隆 Poky 源码

打开终端,执行以下命令来克隆 Poky 的 kirkstone 分支(LTS 版本,稳定性最佳):

# 克隆 Poky 源码到本地 poky-kirkstone 目录
git clone -b kirkstone git://git.yoctoproject.org/poky poky-kirkstone

# 进入目录
cd poky-kirkstone
网络提示:如果 git:// 协议被防火墙阻止,可以尝试使用 https:// 协议:git clone -b kirkstone https://git.yoctoproject.org/git/poky poky-kirkstone。克隆过程可能需要几分钟,取决于你的网络速度。

克隆完成后,目录结构如下所示:

poky-kirkstone/
├── bitbake/           # BitBake 引擎源码
├── meta/              # OE-Core 核心元数据
├── meta-poky/         # Poky 发行版配置
├── meta-yocto-bsp/    # 参考 BSP
├── oe-init-build-env  # 构建环境初始化脚本
├── README.md
└── ...

3.3 构建第一个最小镜像

有了源码,我们就可以开始构建第一个镜像了。Yocto 项目提供了一个名为 core-image-minimal 的配方,它构建一个仅包含 BusyBox 和基本系统工具的最小 Linux 镜像,非常适合验证构建环境。

3.3.1 构建流程概览

下面的 SVG 流程图展示了从下载源码到生成最终镜像的完整步骤:

构建第一个最小镜像流程 构建 core-image-minimal 流程 1. 下载 Poky git clone 2. 初始化环境 oe-init-build-env 3. 配置构建 local.conf 4. 执行构建 bitbake core-image-minimal 5. 输出镜像 tmp/deploy/images/ 整个流程耗时取决于主机性能,首次构建需要下载源码包并编译工具链,通常需要 30 分钟到 2 小时

3.3.2 分步构建命令

按照以下步骤,在 poky-kirkstone 目录中执行构建:

  1. 初始化构建环境:
    # 在 poky-kirkstone 目录下执行
    source oe-init-build-env build-qemu

    这个脚本会做三件事:

    • 创建一个名为 build-qemu 的构建目录(如果不存在)。
    • 将当前工作目录切换到 build-qemu。
    • 设置 PATH 等环境变量,使 bitbake 命令可用。
  2. 检查构建配置:

    初始化后,build-qemu/conf 目录下会生成两个关键配置文件:

    • local.conf:本地构建配置,如目标机器、并行编译数等。
    • bblayers.conf:定义哪些层(layers)参与构建。

    对于首次构建,默认配置已经足够。你可以用 cat 命令查看:

    cat conf/local.conf | grep -E "^MACHINE|^BB_NUMBER_THREADS|^PARALLEL_MAKE"
  3. 执行构建:
    # 构建最小镜像
    bitbake core-image-minimal

    BitBake 会开始解析元数据、下载源码包、编译工具链和软件包,最终生成镜像文件。构建过程中,终端会显示实时进度。

3.3.3 构建输出与验证

构建成功后,输出文件位于 build-qemu/tmp/deploy/images/qemux86-64/ 目录下。关键文件包括:

文件 说明
core-image-minimal-qemux86-64.rootfs.ext4 根文件系统镜像(ext4 格式)
core-image-minimal-qemux86-64.rootfs.tar.bz2 根文件系统的压缩归档
bzImage Linux 内核镜像
core-image-minimal-qemux86-64.qemuboot.conf QEMU 启动配置文件

你可以使用 QEMU 模拟器来启动这个镜像,验证构建是否成功:

# 在 build-qemu 目录下执行
runqemu qemux86-64
成功标志:QEMU 窗口启动后,你会看到 Linux 内核启动日志,最终出现 Poky (Yocto Project Reference Distro) 4.0.x qemux86-64 ttyS0 的登录提示符。输入 root 登录(无密码),你就成功进入了自己构建的最小 Linux 系统!

3.4 本章小结

通过本章的学习,你掌握了以下核心知识点:

  • Poky 的定义:Yocto 项目的参考发行版,包含 BitBake、OE-Core、meta-poky 和 meta-yocto-bsp。
  • 源码下载:使用 git clone 命令克隆 Poky 的稳定分支(如 kirkstone)。
  • 构建流程:通过 source oe-init-build-env 初始化环境,然后执行 bitbake core-image-minimal 构建最小镜像。
  • 输出验证:使用 runqemu 在 QEMU 中启动构建好的镜像。