一、Yocto Project 简介
Yocto Project 是一个开源协作项目,专注于嵌入式 Linux 操作系统开发,能够帮助开发者为不同硬件平台构建定制化的 Linux 镜像。对于 NXP i.MX 系列开发板,Yocto 提供了专门的 BSP(Board Support Package),通过分层架构整合内核、U-Boot、驱动及应用组件,支持 i.MX 6/7/8/9 等多个家族的 SoC(System-on-Chips)。
本教程聚焦 i.MX 平台的 Yocto 环境搭建、镜像构建、部署及定制化操作,适用于嵌入式开发工程师快速上手。
1. 核心概念铺垫
在理解构建过程前,需明确 Yocto 的核心组件:
- Poky:Yocto 的参考发行版,包含构建系统(BitBake)、基础元数据(meta-poky)、开源层(meta-openembedded)等核心内容。
- BitBake:Yocto 的构建引擎,负责解析配方(Recipe)、依赖管理、执行构建任务。
- 层(Layer):元数据的组织单元,用于分离硬件、软件、定制化配置(如 meta-yocto-bsp 对应硬件 BSP,meta-custom 对应自定义配置)。
- 配方(Recipe):
.bb 文件,定义单个软件包的构建规则(源码地址、编译参数、依赖、安装步骤)。
- 机器配置(Machine):
conf/machine/<machine>.conf,定义硬件平台的参数(架构、内核、驱动、分区等)。
- 发行版配置(Distro):
conf/distro/<distro>.conf,定义系统全局特性(包管理器、初始化系统、编译器版本等)。
- 构建目录(Build Directory):构建过程中生成的临时文件、编译产物、最终镜像的存放目录(通常为
build/)。
二、前置准备
(一)硬件要求
- 主机系统:推荐 Ubuntu 22.04 及以上版本(其他 Linux 发行版需适配依赖包)
- 硬盘空间:最小 50GB(基础构建),推荐 120GB(全后端编译),机器学习组件构建需 250GB 以上
- 网络环境:稳定网络(用于下载源码、依赖包及镜像资源)
(二)软件依赖安装
在 Ubuntu 主机中执行以下命令,安装 Yocto 构建必需的依赖包:
sudo apt-get install build-essential chrpath cpio debianutils
diffstat file gawk gcc git iputils-ping libacl1 liblz4-tool locales
python3 python3-git python3-jinja2 python3-pexpect python3-pip
python3-subunit socat texinfo unzip wget xz-utils zstd efitools
注意:确保系统默认 grep 版本未被替换,否则可能导致构建失败。
(三)Repo 工具安装
Repo 是基于 Git 的多仓库管理工具,用于简化 Yocto 分层源码的下载,安装步骤如下:
- 创建工具目录并下载 Repo:
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
- 配置环境变量(永久生效):
echo "export PATH=~/bin:\$PATH" >> ~/.bashrc
source ~/.bashrc
三、Yocto 环境搭建
(一)下载 i.MX Yocto BSP 源码
- 创建工作目录并初始化 Repo:
mkdir imx-yocto-bsp
cd imx-yocto-bsp
repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-walnascar -m imx-6.12.34-2.1.0.xml
-b 指定分支(对应 Yocto 5.2 Walnascar 版本)
-m 指定清单文件(定义源码仓库及版本)
- 同步源码(耗时较长,取决于网络速度):
repo sync
同步完成后,源码将存储在 imx-yocto-bsp/sources 目录,包含 i.MX 专属层(meta-imx)和社区层(如 poky、meta-freescale 等)。
(二)构建配置初始化
i.MX 提供 imx-setup-release.sh 脚本简化构建配置,需指定目标硬件(MACHINE)和图形后端(DISTRO),语法如下:
DISTRO=<发行版配置> MACHINE=<机器名称> source imx-setup-release.sh -b <构建目录名>
关键参数说明:
| 参数 |
可选值 |
说明 |
| DISTRO |
fsl-imx-wayland |
纯 Wayland 图形(推荐 i.MX 8/9) |
|
fsl-imx-xwayland |
Wayland + X11(默认,兼容 X11 应用) |
|
fsl-imx-fb |
帧缓冲(仅支持 i.MX 6/7,不支持 8/9) |
| MACHINE |
imx8mpevk |
i.MX 8M Plus EVK 开发板 |
|
imx8mqevk |
i.MX 8M Quad EVK 开发板 |
|
imx6qpsabresd |
i.MX 6QuadPlus SABRE-SD 开发板 |
|
其他 |
完整列表见文档 5.1 节(如 imx93evk、imx7dsabresd 等) |
示例:配置 i.MX 8M Plus EVK + XWayland 后端
DISTRO=fsl-imx-xwayland MACHINE=imx8mpevk source imx-setup-release.sh -b build-xwayland
执行后会提示接受 NXP EULA(最终用户许可协议),输入 y 确认后,脚本将创建构建目录 build-xwayland,并生成配置文件 conf/bblayers.conf(分层配置)和 conf/local.conf(本地参数配置)。
四、镜像构建
(一)选择镜像类型
Yocto 支持多种预定义镜像,适配不同场景,常用镜像如下:
| 镜像名称 |
用途 |
提供层 |
| core-image-minimal |
最小系统(仅能启动) |
poky |
| core-image-base |
控制台完整系统(支持硬件功能) |
poky |
| imx-image-multimedia |
带多媒体功能(无 Qt) |
meta-imx/meta-imx-sdk |
| imx-image-full |
带 Qt 6 + 机器学习功能(需 GPU 支持) |
meta-imx/meta-imx-sdk |
| fsl-image-machine-test |
社区基础测试镜像(无 GUI) |
meta-freescale-distro |
(二)执行构建命令
使用 bitbake 命令启动构建,语法:bitbake <镜像名称>
以构建最小系统镜像 core-image-minimal 为例:
bitbake core-image-minimal
BitBake 会按以下阶段执行构建(可通过 bitbake -e <目标> 查看完整变量和阶段):
阶段 1:解析元数据(Parsing)
- 加载
bblayers.conf 中所有层的元数据(配方、配置文件)。
- 解析目标镜像的配方(如
core-image-minimal.bb),递归解析所有依赖的软件包配方(如内核、根文件系统、工具链)。
- 生成构建任务依赖图(Task Graph),确定任务执行顺序(如先编译依赖,再编译主包)。
阶段 2:依赖解析(Dependency Resolution)
- BitBake 分析所有配方的
DEPENDS(编译依赖)和 RDEPENDS(运行依赖),解决依赖冲突。
- 确定每个软件包的构建顺序(如先编译 glibc,再编译 gcc,最后编译应用程序)。
阶段 3:资源下载(Fetch)
- 下载配方中
SRC_URI 指定的源码(如内核源码、软件包源码),缓存到 DL_DIR。
- 支持多种协议(HTTP、Git、FTP),并验证校验和(如 SHA256),确保源码完整性。
- 若本地已缓存,则跳过下载(加速构建)。
阶段 4:解包与补丁(Unpack & Patch)
- 将下载的源码解包到
build/tmp/work/<架构>/<包名>/<版本>/workdir/。
- 应用配方中定义的补丁(
SRC_URI 中的 .patch 文件),适配源码到目标平台。
- 配置:执行源码的配置脚本(如
./configure、make menuconfig、CMake),注入 Yocto 定义的编译参数(如交叉编译器路径、CFLAGS、LDFLAGS)。
- 编译:调用交叉编译器(Yocto 自动构建的工具链,位于
build/tmp/sysroots/<主机架构>/usr/bin/<目标架构>/)编译源码,生成可执行文件 / 库。
阶段 6:安装与打包(Install & Package)
- 安装:将编译产物(可执行文件、库、配置文件)安装到
build/tmp/work/<架构>/<包名>/<版本>/image/(临时安装目录)。
- 打包:根据
PACKAGE_CLASSES 配置,将安装目录的文件打包为指定格式(deb/rpm/ipk),或直接打包到根文件系统。
阶段 7:生成根文件系统(RootFS)
- 收集所有软件包的安装文件,合并到根文件系统目录(
build/tmp/work/<架构>/<镜像名>/<版本>/rootfs/)。
- 生成文件系统镜像(如 ext4、squashfs、ubifs),或生成可启动镜像(如 SD 卡镜像、ISO 镜像)。
阶段 8:输出最终镜像
- 最终镜像文件输出到
build/tmp/deploy/images/<MACHINE>/,常见产物:
core-image-minimal-<MACHINE>.rootfs.ext4:根文件系统镜像。
core-image-minimal-<MACHINE>.sdimg:可直接烧录到 SD 卡的镜像。
zImage/Image:内核镜像。
u-boot.bin:U-Boot 镜像(若配置了 U-Boot 构建)。
示例 1:构建多媒体镜像(无 Qt)
cd build-xwayland # 进入构建目录
bitbake imx-image-multimedia
示例 2:构建带 Qt 6 和机器学习的完整镜像
bitbake imx-image-full
- 首次构建会自动下载工具链和依赖包,耗时较长(数小时至数十小时,取决于硬件性能)
- 构建过程中可通过日志查看进度:
build-xwayland/tmp/work/<架构>/<组件>/temp
(三)常用 BitBake 选项
| 选项 |
功能 |
| -c fetch |
仅下载组件源码(不编译) |
| -c cleanall |
清理组件构建目录(彻底重新构建) |
| -c deploy |
部署镜像 / 组件到根文件系统 |
| -k |
构建失败时继续编译其他组件 |
| -g |
生成组件依赖树 |
| -s |
显示所有配方的当前版本和推荐版本 |
| -DDD |
开启三级调试日志 |
示例:强制重新编译某个组件
bitbake -c compile -f u-boot-imx
(四)U-Boot 配置(可选)
默认 U-Boot 采用 SD 卡启动,如需配置其他启动方式(如 SPI、NAND),需在 local.conf 中添加配置:
# 单启动方式(如 eimnor)
echo "UBOOT\_CONFIG = \"eimnor\"" >> conf/local.conf
# 多启动方式(如 SD + eimnor)
echo "UBOOT\_CONFIG = \"sd eimnor\"" >> conf/local.conf
# 单独构建 U-Boot
MACHINE=imx8mpevk bitbake -c deploy u-boot-imx
五、镜像部署
(一)查找构建产物
构建完成后,镜像文件存储在 build-xwayland/tmp/deploy/images/<机器名称>/,核心文件包括:
.wic.zst:SD 卡镜像(包含分区、U-Boot、内核、根文件系统)
.tar.gz:根文件系统压缩包(用于其他存储介质部署)
u-boot.imx:U-Boot 二进制文件
Image:Linux 内核镜像
(二)烧录 SD 卡镜像
- 插入 SD 卡到主机,通过
lsblk 查看设备节点(如 /dev/sdb)
- 执行烧录命令(替换
<镜像名> 和 <设备节点>):
zstdcat <镜像名>.wic.zst | sudo dd of=/dev/sd<分区> bs=1M conv=fsync
示例:
zstdcat imx-image-multimedia-imx8mpevk.wic.zst | sudo dd of=/dev/sdb bs=1M conv=fsync
- 烧录完成后,将 SD 卡插入 i.MX 开发板,设置启动开关为 SD 卡启动,上电即可启动系统。
六、定制化操作
(一)添加自定义包
如需在镜像中添加额外软件包(需存在对应 Yocto 配方),在 local.conf 中添加:
# 单个包
CORE\_IMAGE\_EXTRA\_INSTALL:append = " <包名>"
# 多个包(空格分隔)
CORE\_IMAGE\_EXTRA\_INSTALL:append = " chromium-ozone-wayland opencv"
示例:添加 Wayland 版本的 Chromium 浏览器
CORE\_IMAGE\_EXTRA\_INSTALL:append = " chromium-ozone-wayland"
bitbake-layers add-layer ../sources/meta-browser/meta-chromium # 添加浏览器层
bitbake imx-image-multimedia # 重新构建镜像
(二)创建自定义发行版(DISTRO)
- 复制现有发行版配置文件(以 fsl-imx-xwayland 为基础):
cp ../sources/meta-imx/meta-imx-sdk/conf/distro/fsl-imx-xwayland.conf ../sources/meta-imx/meta-imx-sdk/conf/distro/my-custom-distro.conf
- 编辑
my-custom-distro.conf,修改参数(如内核版本、默认包、图形后端等)
- 使用自定义发行版构建:
DISTRO=my-custom-distro MACHINE=imx8mpevk source imx-setup-release.sh -b build-custom
bitbake imx-image-full
七、常见问题解决
(一)构建失败:依赖包下载超时
- 手动下载对应包到
DL_DIR(默认 build-xwayland/downloads)
- 创建
<包名>.done 文件标记下载完成:touch <包名>.done
- 重新执行
bitbake 命令
(二)镜像启动失败
- 检查 SD 卡烧录是否完整(重新烧录)
- 确认开发板启动开关配置正确
- 查看 U-Boot 日志(串口输出),确认内核和根文件系统路径是否正确
(三)添加自定义配方(bbappend)不生效
- 检查配方文件名是否与原配方一致(如
u-boot-imx_%.bbappend)
- 查看
log.do_fetch 日志,确认补丁是否被正确加载
- 确保
FILESEXTRAPATHS 路径配置正确:
FILESEXTRAPATHS:prepend := "\${THISDIR}/\${PN}:"
八、参考资料
- 官方文档:i.MX Yocto Project User‘s Guide(UG10164)
- Yocto Project 官方文档:https://docs.yoctoproject.org/
- NXP i.MX 开发者官网:https://www.nxp.com/products/processors-and-microcontrollers/arm-processors/i-mx-applications-processors/i-mx-8-processors:i.MX8
在云栈社区的 C/C++ 板块,你也能找到许多关于底层开发和系统编程的深度讨论,这些知识对于理解像 Yocto 这样的构建系统和进行嵌入式Linux底层开发非常有帮助。