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

相关推荐
无足鸟ICT1 小时前
【RHCA+】for循环
linux
雨声不在1 小时前
vm.mmap_rnd_bits 引发 ASAN CPU 100% 问题解析
linux·服务器·网络
进击切图仔2 小时前
在 windows 和 ubuntu 中配置 host 文件
linux·windows·ubuntu
郭涤生2 小时前
C++ 零拷贝(Zero-Copy)
linux·开发语言·c++
weixin_445476682 小时前
LIMS 3.0 测试环境部署过程记录
linux·状态模式
The Chosen One9852 小时前
【操作系统】操作系统引导、虚拟机、进程通信、信号
linux·运维·服务器·操作系统·虚拟机·信号
宵时待雨3 小时前
linux笔记归纳14:Socket编程TCP
linux·服务器·网络·笔记·tcp/ip
小张同学a.3 小时前
zabbix企业级监控平台3——服务监控与API实战
linux·运维·mysql·nginx·tomcat·zabbix
hwx15463 小时前
Linux内核时钟
linux