Yocto / OpenEmbedded
一、什么是 Yocto
- OpenEmbedded(OE)+ Yocto Project(YP)
- 工业级嵌入式 Linux 构建系统
- 灵活、可扩展、可量产
- 比 Buildroot 复杂,但功能强大
二、与 Buildroot 对比
| 特性 | Buildroot | Yocto |
|---|---|---|
| 学习曲线 | 平缓 | 陡峭 |
| 配置方式 | menuconfig | BitBake 配方 |
| 包数量 | 几百 | 1000+ |
| 工具链支持 | 单一 | 多种并存(SDK) |
| 量产 | 适合中小项目 | 适合大型产品 |
| 增量构建 | 一般 | 优秀(sstate) |
| 应用 | 路由器、IoT | 汽车、医疗、电信 |
三、核心概念
- BSP(Board Support Package):板级支持包
- Distro:发行版配置
- Image:目标镜像(
core-image-minimal等) - Recipe:.bb 文件,描述如何构建一个包
- Layer:目录,存放相关 recipe
- BitBake:构建引擎
- sstate(shared state cache):缓存,加速重编
- MACHINE:目标板
- DISTRO:发行版
四、获取
git clone git://git.yoctoproject.org/poky
cd poky
git checkout kirkstone # 当前 LTS 分支
source oe-init-build-env build
初始化:
TEMPLATECONF=meta-myvendor/conf-templates/conf-source . oe-init-build-env build
五、目录结构
poky/
├── bitbake/ 构建引擎
├── documentation/
├── meta/ OE 核心 recipes
├── meta-poky/ Poky distro
├── meta-yocto-bsp/ 通用 BSP
├── meta-* 第三方 layer(openembedded.org)
├── scripts/
├── LICENSE
└── README
build/
├── conf/ 用户配置
│ ├── bblayers.conf
│ ├── local.conf
│ └── ...
├── sstate-cache/ 缓存
├── tmp/
│ ├── work/ 各包构建目录
│ ├── deploy/
│ │ └── images/
│ └── ...
六、关键配置文件
1. conf/local.conf
MACHINE ??= "qemuarm64"
DISTRO ?= "poky"
PACKAGE_CLASSES ?= "package_rpm"
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"
SSTATE_MIRRORS ?= "file://.* https://sstate.yoctoproject.org/2.5/PATH;downloadfilename=PATH"
DL_DIR ?= "${TOPDIR}/downloads"
2. conf/bblayers.conf
BBLAYERS ?= " \
/path/to/poky/meta \
/path/to/poky/meta-poky \
/path/to/poky/meta-yocto-bsp \
/path/to/meta-myvendor \
"
七、常用命令
# 查看 machine
bitbake -l | grep ^MACHINE
# 解析 recipe
bitbake -e busybox | less
bitbake -c cleansstate busybox # 清一个包的 sstate
bitbake -c clean busybox # 清 build
bitbake -c devshell busybox # 打开开发 shell
bitbake -c menuconfig linux-yocto # 配置内核
# 构建
bitbake core-image-minimal
bitbake core-image-sato
bitbake my-custom-image
# 看依赖
bitbake -g busybox
# 生成 SDK
bitbake -c populate_sdk core-image-minimal
八、Recipe 示例
# myapp_1.0.bb
SUMMARY = "My Application"
DESCRIPTION = "My awesome application"
HOMEPAGE = "https://example.com/myapp"
LICENSE = "GPL-2.0-only"
LIC_FILES_CHKSUM = "file://COPYING;md5=..."
SRC_URI = "git://github.com/myvendor/myapp;protocol=https;branch=main"
SRCREV = "abc123def456"
inherit autotools pkgconfig systemd
# inherit cmake
DEPENDS += "libuv openssl"
EXTRA_OECONF = "--with-ssl"
SYSTEMD_SERVICE:${PN} = "myapp.service"
do_install:append() {
install -d ${D}${sysconfdir}
install -m 0644 ${WORKDIR}/myapp.conf ${D}${sysconfdir}/myapp.conf
}
FILES:${PN} += "${sysconfdir}/myapp.conf"
九、自定义 Layer
bitbake-layers create-layer meta-myvendor
cd meta-myvendor
mkdir -p conf/recipes-* recipes-*/myapp
十、自定义 Image
# my-custom-image.bb
require recipes-core/images/core-image-minimal.bb
IMAGE_INSTALL:append = " \
myapp \
openssh \
vim \
"
IMAGE_FEATURES:append = " ssh-server-dropbear"
十一、SDK
为应用开发者生成独立工具链:
bitbake -c populate_sdk core-image-minimal
# 生成 tmp/deploy/sdk/poky-glibc-x86_64-core-image-minimal-armv7at2hf-neon-vfpv4-toolchain-3.1.20.sh
./tmp/deploy/sdk/...sh
source /opt/poky/.../environment-setup-armv7at2hf-neon-vfpv4
十二、镜像生成
ls tmp/deploy/images/<MACHINE>/
├── core-image-minimal-<machine>.ext4
├── core-image-minimal-<machine>.tar.xz
├── zImage
├── uImage
├── *.dtb
├── u-boot.bin
└── *.wic # 全镜像
十三、典型厂商使用
- NXP:imx-linux BSP
- ST:meta-st-stm32mp
- TI:meta-ti
- RPi:meta-raspberrypi
- 瑞芯微:meta-rockchip
十四、debug
# 看日志
cat tmp/work/.../temp/log.do_compile
# 调试单个包
bitbake -c devshell myapp
# 看失败任务
bitbake -c cleansstate failed-task