3. 开发环境搭建

Yocto 项目并不是一个可以直接“安装”的软件,而是一套以 BitBake 为调度核心、以 OpenEmbedded 元数据为配方体系的构建框架。要让这套框架在主机上跑起来,需要依次完成四件事:准备主机依赖、获取 Poky 参考发行版源码、初始化构建环境、执行第一次镜像构建。本节按这条主线展开,并在中间插入目录结构说明,帮助你建立对构建系统的空间感。

一、主机依赖安装:先满足 BitBake 的运行前提

BitBake 本身是 Python 程序,但它调用的编译、打包、解压、校验工具全部来自主机。官方推荐使用 Ubuntu 20.04/22.04 LTS 或同代 Debian 系统,并安装以下基础包:

sudo apt update
sudo apt install -y gawk wget git diffstat unzip texinfo gcc build-essential \
  chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils \
  iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
  pylint xterm python3-subunit mesa-common-dev zstd liblz4-tool file locales
sudo locale-gen en_US.UTF-8

其中 chrpath 用于修正 ELF 的 RPATH,socat 与 pexpect 支撑自动化测试,zstd 与 liblz4-tool 用于新型压缩格式。若缺少这些包,构建往往在 do_configure 或 do_package 阶段才报错,排查成本很高,因此建议一次性装齐。

不要使用 root 用户执行 BitBake。Poky 会拒绝以 root 身份构建,且构建目录权限混乱后极难恢复。请使用普通用户,并确保该用户对构建目录有读写权限。

二、Poky 源码获取:选择正确的分支

Poky 是 Yocto 项目的参考发行版,包含 BitBake、OpenEmbedded-Core 和若干 BSP 层。获取方式有两种:直接克隆 Poky,或克隆 Poky 后再叠加 meta-openembedded 等常用层。入门阶段先克隆 Poky 即可:

git clone -b kirkstone git://git.yoctoproject.org/poky.git
cd poky
git branch -a

分支名对应 Yocto 版本代号,例如 kirkstone 对应 4.0,dunfell 对应 3.1。分支选择要与后续 BSP 层、meta-openembedded 层保持一致,混用不同代号的分支是初学者最常见的失败原因之一。

三、初始化构建环境:oe-init-build-env 做了什么

Poky 通过一个 shell 脚本初始化环境,它并不修改系统全局变量,而是在当前 shell 中设置 PATH、BBPATH、BUILDDIR 等变量,并创建构建目录:

source oe-init-build-env build-qemu
# 等价于:
# . ./oe-init-build-env build-qemu

执行后你会进入 build-qemu 目录,其中自动生成 conf/local.conf 与 conf/bblayers.conf。前者定义目标机器、发行版、并行度、下载目录等;后者声明本次构建启用了哪些层。初始化脚本还会把 BitBake 加入 PATH,因此之后可以直接运行 bitbake 命令。

每次打开新终端都要重新执行 source oe-init-build-env,否则 bitbake 不在 PATH 中。可以把这条命令写进 shell 别名或脚本,减少重复输入。

四、目录结构说明:理解构建系统的空间布局

Poky 源码树与构建目录是分离的:源码树存放元数据,构建目录存放配置、下载缓存、临时产物和最终镜像。下图展示了这一关系,以及第一次构建时数据从层到镜像的流动方向。

Poky 源码树与构建目录关系及首次构建数据流 poky/ 源码树(只读元数据) bitbake/ meta/ meta-poky/ meta-yocto-bsp/ oe-init-build-env(初始化脚本) build-qemu/ 构建目录(可写) conf/local.conf conf/bblayers.conf tmp/(临时产物) downloads/(源码缓存) sstate-cache/(共享状态缓存) source 初始化 首次构建数据流:bitbake core-image-minimal 解析 .bb/.bbappend 生成任务依赖图 fetch 源码 存入 downloads/ configure/compile 写入 tmp/work/ package/rootfs 生成根文件系统 镜像 .wic/.ext4 sstate-cache 命中时跳过重复编译,显著缩短二次构建时间

需要重点记住三个目录:tmp/work/ 存放每个配方的工作目录,tmp/deploy/images/<machine>/ 存放最终镜像,downloads/ 存放源码压缩包。清理构建时通常删除 tmp/,而保留 downloads/ 与 sstate-cache/ 可以大幅加速重建。

五、第一个镜像构建:core-image-minimal

初始化完成后,直接构建最小镜像:

bitbake core-image-minimal

首次构建会下载大量源码并编译工具链,耗时从几十分钟到数小时不等。构建成功后,镜像位于:

tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.wic
tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4

若使用 QEMU 验证,可运行:

runqemu qemux86-64

下表汇总了本节涉及的关键文件与作用,便于对照排查:

文件/目录 位置 作用
oe-init-build-envpoky/初始化构建环境,创建构建目录
local.confbuild-qemu/conf/定义 MACHINE、DISTRO、并行度、下载目录
bblayers.confbuild-qemu/conf/声明启用的层及其路径
tmp/work/build-qemu/各配方的工作目录与编译产物
tmp/deploy/images/build-qemu/最终镜像与根文件系统
downloads/build-qemu/源码压缩包缓存,可跨构建复用
sstate-cache/build-qemu/共享状态缓存,加速重复构建

六、常见误区与复盘

  • 分支混用:Poky 用 kirkstone,BSP 层却用 dunfell,解析阶段就会报层不兼容。所有层应统一到同一 Yocto 代号。
  • 忘记 source:新终端未执行 oe-init-build-env,直接运行 bitbake 会提示命令不存在。
  • 误删 downloads:清理时只删 tmp/ 即可,删除 downloads/ 会导致所有源码重新下载。
  • 并行度设置过高:BB_NUMBER_THREADS 与 PARALLEL_MAKE 超过 CPU 核数会引发内存不足,建议先设为核数的一半再逐步上调。
  • 忽略磁盘空间:一次完整构建可能占用 50 GB 以上,构建前应确认磁盘余量。
复盘要点:环境搭建的每一步都在为后续 Recipe 工程打基础。主机依赖决定工具链能否运行,分支一致性决定元数据能否解析,构建目录结构决定你能否快速定位产物与日志。第一次镜像构建成功,意味着 BitBake 调度、层解析、任务执行、镜像打包这条链路已经全部打通,之后新增自定义 Recipe 时,就可以把注意力集中在配方本身,而不是环境问题上。