Yocto:关于Layer

Layer是Yocto最重要的一个概念,可以说就是Yocto的基石。

1.概述

最终 BMC 固件镜像由多个 Layer 像搭积木一样拼合而成,每个 Layer 负责提供一部分功能。 以 meta‑ibm meta‑romulus 的bblayers.conf.sample举例:

LCONF_VERSION = "8"

BBPATH = "${TOPDIR}"

BBFILES ?= ""

BBLAYERS ?= " \

##OEROOT##/meta \

##OEROOT##/meta-openembedded/meta-oe \

##OEROOT##/meta-openembedded/meta-networking \

##OEROOT##/meta-openembedded/meta-perl \

##OEROOT##/meta-openembedded/meta-python \

##OEROOT##/meta-phosphor \

##OEROOT##/meta-aspeed \

##OEROOT##/meta-openpower \

##OEROOT##/meta-ibm/meta-romulus \

"

加载顺序从上到下,越靠下的 Layer 优先级越高

1)基础地基层:metameta‑openembedded/*,OE 核心、基础工具链、通用软件包;

##OEROOT##/meta \

##OEROOT##/meta-openembedded/meta-oe \

##OEROOT##/meta-openembedded/meta-networking \

##OEROOT##/meta-openembedded/meta-perl \

##OEROOT##/meta-openembedded/meta-python \

2)BMC 通用业务层:meta‑phosphor,BMC 业务逻辑、DBus 服务,不绑定具体 BMC 硬件;

##OEROOT##/meta-phosphor \

3)SoC 硬件层:meta‑aspeed,包含 BMC 芯片驱动、内核、设备树、Machine 单板配置;

##OEROOT##/meta-aspeed \

4)厂商平台定制层:meta‑ibm/meta‑romulus,整机平台业务、产品定制。

##OEROOT##/meta-ibm/meta-romulus \

厂商内部通常会再拆分两层:common 公共层 + platform 平台层,common 在前,具体 platform 层放在 BBLAYERS 末尾获取最高优先级。

关键规则:BBLAYERS的先后顺序直接决定 Layer 优先级,后加载层可以覆盖前加载层的内容;也可以通过BBFILE_PRIORITY变量设置层优先级,该变量优先级高于 BBLAYERS 顺序。

每一个合法 Layer 必须包含 conf/layer.conf,用于注册本层,声明本层 recipes 路径。

其中:

BBFILES += "${LAYERDIR}/meta-common/recipes-*/*/*.bb \

${LAYERDIR}/meta-common/recipes-*/*/*.bbappend"

指定了这个layer用于查找recipe的路径

2.bb 完全重载(替换整个 Recipe)

如果多个 Layer 下存在相同相对路径 + 相同文件名.bb配方文件,高优先级 Layer 的 bb 会完全替代低优先级 Layer 的 bb。

例如原有:

meta-phosphor/recipes-phosphor/leds/phosphor-led-manager_git.bb

想要完全替换这个 recipe,可以在自己高优先级 Layer 新建完全同名路径文件名:

meta-ibm/meta-romulus/recipes-phosphor/leds/phosphor-led-manager_git.bb

3.bbappend 增量追加(推荐优先使用)

不想完整替换整个 bb,只想做少量修改、增加补丁、追加配置,优先使用.bbappend文件

meta-aaal/meta-common/recipes-phosphor/leds/phosphor-led-manager_%.bbappend

这样每一个layer都可以对这个recipe进行追加,丰富或定制化自己的功能。

  • %通配符匹配任意版本号,OpenBMC 工程普遍使用
  • bbappend 不会替换原始 bb;
  • 所有 Layer 的 bbappend,会按照 Layer 加载顺序依次追加到原始 recipe;
  • 高优先级层 append 可以覆盖前面 append 设置的变量;
  • 可以使用 VAR:append / VAR:remove 语法新增、删除变量内容,例如新增补丁,移除上层补丁。

4.BBMASK 屏蔽 recipes

BBMASK 用来屏蔽指定路径下的所有 bb、bbappend,bitbake 不会解析这些配方。 一般写在本层的conf/layer.conf中:

BBMASK:append = "|meta-aspeed-sdk/recipes-phosphor/leds"

  • |作为多个屏蔽路径分隔符;
  • 写在 layer.conf 的 BBMASK,只对本层以及本层之后加载的 Layer 生效;写在 bblayers.conf 为全局屏蔽。
  • 可以屏蔽原始 bb,也可以屏蔽其他层的 bbappend,解决上层 append 带来不需要的修改。

5.查看layer

5.1如果想查看所有layer的优先级可以通过:

$ bitbake-layers show-layers

5.2查看最终使用的是哪个bb文件

$ bitbake -e phosphor-led-manager | grep "^FILE="

FILE="/meta-phosphor/recipes-phosphor/leds/phosphor-led-manager_git.bb"

5.3查看某个recipe实际所有生效bbappend

$ bitbake-layers show-appends phosphor-led-manager

phosphor-led-manager_git.bb:

meta-aaa/meta-common/recipes-phosphor/leds/phosphor-led-manager_%.bbappend

meta-aaa/meta-bbb/recipes-phosphor/leds/phosphor-led-manager_%.bbappend

相关推荐
Escalating_xu3 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
傲世仙尊3 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
码农小韩3 小时前
Linux应用开发(六)——进程间通信
linux·linux驱动·嵌入式软件开发·嵌入式操作系统·linux应用
笨笨饿4 小时前
#138_解决Codex要五次回复的问题
linux·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式实时数据库
m0_459872924 小时前
Linux 系统基础
linux·运维·服务器
吴声子夜歌4 小时前
Shell编程——数组
linux·运维·shell
blueSatchel5 小时前
ros-humble仿真-建图-导航
linux·ros2
Lucis__5 小时前
基于责任链模式的消息队列—异步处理流水线的最佳实践
linux·c++·消息队列·责任链模式·ipc
程序员-Benothing5 小时前
Shell 脚本条件判断与流程控制:if for while case 详解
linux·运维·服务器
mounter6255 小时前
统一安全域:KVM Planes 如何驾驭硬件特权级
linux·安全·linux kernel·kernel