2. 基于Yocto的定制Linux系统构建

任务目标

为边缘智能工业网关构建一个基于Yocto Project的定制嵌入式Linux系统,该系统需包含网关运行所必需的硬件驱动(如CAN、GPIO、I2C)与核心软件库(如Python3、libgpiod),并生成可烧录的SD卡镜像。

环境与依赖

  • 主机系统:Ubuntu 20.04/22.04 x86_64(推荐),至少100GB磁盘空间
  • Yocto版本:Kirkstone (4.0.x) LTS
  • 目标硬件:NXP i.MX8M Plus评估板(本文以该平台为例,其他平台需替换对应BSP层)
  • 必要包:gawk make wget tar bzip2 gzip python3 unzip chrpath diffstat texinfo lz4 zstd等(执行sudo apt install安装)

实现步骤

使用Yocto构建定制系统分为三个核心阶段:初始化构建环境、配置自定义镜像层、执行构建。以下给出最小可复现的完整实现。

1. 初始化Yocto构建环境

# 创建工作目录并克隆Yocto与NXP BSP层
mkdir -p ~/yocto-edge-gateway && cd ~/yocto-edge-gateway
git clone -b kirkstone git://git.yoctoproject.org/poky.git
git clone -b kirkstone https://github.com/nxp-imx/meta-imx.git
git clone -b kirkstone https://github.com/openembedded/meta-openembedded.git

# 进入构建目录并初始化环境
cd poky
source oe-init-build-env ../build

2. 配置bblayers.conf与local.conf

编辑build/conf/bblayers.conf,添加所需层(路径需按实际位置调整):

BBLAYERS ?= " \
  /home/user/yocto-edge-gateway/poky/meta \
  /home/user/yocto-edge-gateway/poky/meta-poky \
  /home/user/yocto-edge-gateway/poky/meta-yocto-bsp \
  /home/user/yocto-edge-gateway/meta-imx/meta-bsp \
  /home/user/yocto-edge-gateway/meta-imx/meta-sdk \
  /home/user/yocto-edge-gateway/meta-openembedded/meta-oe \
  /home/user/yocto-edge-gateway/meta-openembedded/meta-python \
  /home/user/yocto-edge-gateway/meta-imx/meta-ml \
  " 

编辑build/conf/local.conf,设置机器类型与镜像特性:

MACHINE = "imx8mpevk"
DISTRO = "poky"
PACKAGE_CLASSES = "package_rpm"

# 添加网关所需驱动与库到镜像
IMAGE_INSTALL:append = " can-utils python3 python3-pip libgpiod libgpiod-tools i2c-tools"

# 启用systemd作为init系统
DISTRO_FEATURES:append = " systemd"
VIRTUAL-RUNTIME_init_manager = "systemd"

# 生成SD卡镜像
IMAGE_FSTYPES = "wic wic.bmap"

3. 创建自定义镜像配方

在poky/meta/recipes-core/images/下新建edge-gateway-image.bb:

SUMMARY = "Edge Gateway Custom Linux Image"
LICENSE = "MIT"

inherit core-image

# 核心系统组件
IMAGE_FEATURES:append = " ssh-server-openssh tools-debug"

# 已通过IMAGE_INSTALL添加的包在local.conf中定义
# 此处可添加仅本镜像需要的额外配置
IMAGE_ROOTFS_EXTRA_SPACE = "524288"

4. 执行构建

bitbake edge-gateway-image

构建完成后,镜像位于build/tmp/deploy/images/imx8mpevk/edge-gateway-image-imx8mpevk.wic。

验证方法

将生成的.wic镜像写入SD卡(假设设备为/dev/sdb):

sudo dd if=tmp/deploy/images/imx8mpevk/edge-gateway-image-imx8mpevk.wic of=/dev/sdb bs=4M status=progress
sync

将SD卡插入目标板并上电启动,通过串口或SSH登录后执行以下检查:

  • 内核与系统版本:uname -a应显示Linux内核版本;cat /etc/os-release显示Yocto版本信息。
  • 驱动加载:ls /dev/can*应存在CAN设备节点;ls /dev/i2c-*存在I2C总线;gpiodetect能列出GPIO控制器。
  • 软件库可用:python3 --version正常输出;libgpiod工具(如gpioget)可执行。
  • 系统服务:systemctl status sshd显示SSH服务运行中。

以上条件全部满足,即证明定制系统构建成功且包含所需驱动与库。

常见问题

  • 磁盘空间不足:Yocto构建需要大量空间,确保至少100GB可用,并设置DL_DIR和SSTATE_DIR到独立大分区。
  • 网络下载失败:Yocto需从网络获取源码包,若网络受限,可预先配置PREMIRRORS指向内网镜像。
  • 驱动未包含:若目标板需要特定驱动,需确认对应内核模块已启用(在local.conf中通过KERNEL_MODULE_AUTOLOAD或内核配置添加)。