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或内核配置添加)。