找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2053

积分

0

好友

289

主题
发表于 21 小时前 | 查看: 2| 回复: 0

一、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 分层源码的下载,安装步骤如下:

  1. 创建工具目录并下载 Repo:
mkdir -p ~/bin

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

chmod a+x ~/bin/repo
  1. 配置环境变量(永久生效):
echo "export PATH=~/bin:\$PATH" >> ~/.bashrc

source ~/.bashrc

三、Yocto 环境搭建

(一)下载 i.MX Yocto BSP 源码

  1. 创建工作目录并初始化 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 指定清单文件(定义源码仓库及版本)
  1. 同步源码(耗时较长,取决于网络速度):
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 文件),适配源码到目标平台。
阶段 5:配置与编译(Configure & Compile)
  • 配置:执行源码的配置脚本(如 ./configuremake menuconfigCMake),注入 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 卡镜像

  1. 插入 SD 卡到主机,通过 lsblk 查看设备节点(如 /dev/sdb
  2. 执行烧录命令(替换 <镜像名><设备节点>):
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
  1. 烧录完成后,将 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)

  1. 复制现有发行版配置文件(以 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
  1. 编辑 my-custom-distro.conf,修改参数(如内核版本、默认包、图形后端等)
  2. 使用自定义发行版构建:
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}:"

八、参考资料

  1. 官方文档:i.MX Yocto Project User‘s Guide(UG10164)
  2. Yocto Project 官方文档:https://docs.yoctoproject.org/
  3. 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底层开发非常有帮助。




上一篇:Java数据库连接池选型指南:Spring Boot中HikariCP与Druid的性能与功能对比
下一篇:从零构建LC-3架构的C语言虚拟机:实现与指令详解
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-16 22:07 , Processed in 0.244860 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表