Yocto项目实战教程 · 第4章:4.3小节-层
🔍
B站相应的视频教程:
📌 Yocto项目实战教程-第4章-4.3小节-层
记得三连,标为原始粉丝。
在 Yocto 项目中,元数据(Metadata)不仅是构建系统的核心驱动力,更是实现高度定制化、可移植构建流程的基础。在复杂的嵌入式 Linux 系统开发中,Yocto 通过定义结构化的元数据文件,描述菜谱、配置、任务等,使整个构建流程具备了强大的灵活性和模块化管理能力。本篇我们将深入讲解元数据层(Layer)的结构组成、分类方式、作用机制及在项目实践中的应用策略。
一、元数据与元数据层简介
1.1 元数据的本质
元数据(Metadata)是“关于数据的数据”,在 Yocto 项目中,它用来定义构建 Linux 系统所需的各种规则、配方(菜谱)、变量、任务等内容。元数据以 .bb
、.bbappend
、.bbclass
、.conf
等形式存在于文本文件中,被 BitBake 构建系统解析和执行。
简单来说,元数据就像 Yocto 项目的“指挥手册”,告诉构建系统要做什么、怎么做、在什么条件下做。
1.2 元数据层的结构意义
元数据层(Layer)是组织元数据文件的逻辑单位。它本质上是一个包含特定目录结构和 layer.conf
配置文件的文件夹,按功能或供应商划分,用于模块化管理元数据内容。通过将元数据分布到多个层中,Yocto 实现了高内聚低耦合的构建体系,支持复用、继承、覆盖和扩展。
例如:
meta-example/
├── conf/
│ └── layer.conf
├── recipes-example/
│ └── example/
│ ├── example_1.0.bb
│ └── example.inc
二、标准层结构与关键目录
一个合格的元数据层通常具备以下结构:
目录名 | 描述 |
---|---|
conf/ | 包含该层的配置文件,必须存在 layer.conf |
recipes-*/ | 存放菜谱的目录,按功能或软件分类 |
classes/ | 可复用的 BitBake 类(.bbclass 文件) |
files/ 或 recipes-*/example/files/ | 存放补丁、脚本、配置文件等 |
README , COPYING , MAINTAINERS | 说明文件,非必须,但推荐 |
例如,meta-oe
层下可能包含 recipes-support/
, recipes-core/
等子目录,每个都组织特定功能模块。
三、常见元数据层分类与作用
Yocto 项目中的元数据层种类丰富,下面按功能划分常见的几类:
3.1 基础层(Core Layers)
- meta:Yocto 官方提供的核心层,包含 BitBake 必要的类、任务、基础菜谱,是系统构建的根基。
- meta-poky:包含 Yocto 默认发行版 Poky 的定义和策略配置。
- meta-yocto-bsp:为 QEMU 和部分开发板提供参考 BSP 支持。
3.2 扩展层(Extended Layers)
- meta-openembedded(meta-oe):社区维护的大量通用包集合,包含 meta-networking、meta-python、meta-multimedia 等子层。
- meta-qt5 / meta-qt6:用于构建 Qt 应用相关软件栈。
- meta-browser:提供 Chromium、Firefox 等浏览器的菜谱。
3.3 BSP 层(Board Support Package)
-
以 SoC 或硬件厂商命名,如:
- meta-freescale(NXP)
- meta-rockchip
- meta-raspberrypi
BSP 层负责定义设备树、引导程序(如 U-Boot)、内核版本和硬件适配相关配置。
3.4 应用或项目定制层
- 通常由项目团队自己创建,例如
meta-myproject
或meta-customer
- 用于封装业务应用、配置定制、集成专用组件
四、layer.conf 配置文件详解
每个元数据层都必须在 conf/layer.conf
文件中声明其元数据路径和兼容性等信息。关键变量如下:
BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \${LAYERDIR}/recipes-*/*/*.bbappend"BBFILE_COLLECTIONS += "myproject"
BBFILE_PATTERN_myproject = "^${LAYERDIR}/"
BBFILE_PRIORITY_myproject = "6"
变量 | 作用 |
---|---|
BBPATH | 添加当前层路径到搜索路径 |
BBFILES | 指定包含的 .bb 和 .bbappend 文件 |
BBFILE_COLLECTIONS | 层标识符 |
BBFILE_PRIORITY | 冲突时的优先级,数值越大越优先 |
五、元数据层的继承与覆盖机制
元数据层之间可以互相依赖、继承、追加甚至覆盖内容:
- 依赖关系:通过
LAYERSERIES_COMPAT
与bitbake-layers add-layer
显式声明。 - 继承机制:使用
.bbclass
和inherit
关键字实现任务和函数的复用。 - 覆盖机制:使用
.bbappend
扩展其他层的.bb
文件,例如添加补丁或修改编译选项。
# example_1.0.bbappend
FILESEXTRAPATHS_prepend := "${THISDIR}/example:"
SRC_URI += "file://extra-config.patch"
六、layer.conf 与 distro.conf、local.conf 区别
文件 | 所属层 | 作用 | 示例路径 |
---|---|---|---|
layer.conf | 每个 layer 中必须有 | 定义该层的文件路径与匹配规则 | meta-myproject/conf/layer.conf |
distro.conf | 一般在发行版层 | 定义发行版策略,如优化选项、包管理器 | meta-poky/conf/distro/poky.conf |
local.conf | 用户构建配置 | 定义构建时选项、镜像内容、调试配置 | build/conf/local.conf |
这三者共同决定了最终构建系统的行为,分别从层级组织、发行策略和本地构建维度进行控制。
七、添加与管理自定义元数据层
项目开发中,通常需要添加自定义层以组织特定应用、业务逻辑与配置。添加步骤如下:
7.1 使用工具创建层
yocto-layer create meta-myapp
该命令将自动生成目录结构与 layer.conf
。
7.2 添加层到构建环境
bitbake-layers add-layer ../meta-myapp
或者手动添加到 bblayers.conf
:
BBLAYERS += "${TOPDIR}/../meta-myapp"
7.3 设置优先级和兼容性
编辑 meta-myapp/conf/layer.conf
:
BBFILE_PRIORITY_meta-myapp = "10"
LAYERSERIES_COMPAT_meta-myapp = "mickledore"
八、实战建议与组织策略
8.1 按模块拆分多个层
例如将 BSP、通用库、应用分别组织为:
- meta-myproject-bsp
- meta-myproject-libs
- meta-myproject-apps
可提升可维护性与协作效率。
8.2 保持 layer 互斥独立
不同功能避免交叉依赖、重复菜谱路径,防止冲突。
8.3 使用版本控制统一管理
建议将所有元数据层纳入 Git 并通过 repo
工具管理,保证构建环境的一致性与可追溯性。
九、小结与问答回顾
元数据层是 Yocto 项目模块化构建体系的核心,掌握其结构、配置与组织策略,是高效开发嵌入式 Linux 系统的关键。本节内容涵盖了:
- 元数据与 Layer 的基本定义
- 标准结构与层分类
layer.conf
的详细字段说明- 层之间的依赖、继承与覆盖关系
- 自定义层的创建与维护流程
常见问题答疑:
Q1:layer.conf 和 local.conf 有什么区别?
A:前者定义元数据层自身的路径与规则,后者是构建系统局部的用户配置。
Q2:如何优雅地组织多个自定义层?
A:建议按模块拆分、设定明确优先级,并配合版本控制与文档规范。
Q3:.bbappend 文件和 .bb 有冲突怎么办?
A:通过 BBFILE_PRIORITY
设置优先级,或者确保修改内容互补、非重复。
🔍
B站相应的视频教程:
📌 Yocto项目实战教程-第4章-4.3小节-层
记得三连,标为原始粉丝。
相关文章:
Yocto项目实战教程 · 第4章:4.3小节-层
🔍 B站相应的视频教程: 📌 Yocto项目实战教程-第4章-4.3小节-层 记得三连,标为原始粉丝。 在 Yocto 项目中,元数据(Metadata)不仅是构建系统的核心驱动力,更是实现高度定制化、可移植…...
小红书爬虫,小红书api,小红书数据挖掘
背景: 小红书(Xiaohongshu)是一款结合社交、购物和内容分享的移动应用,近年来在中国以及全球范围内拥有大量的用户群体。小红书上的内容包括用户的消费体验、生活方式、旅行分享、时尚搭配等。通过这些内容,用户可以了…...
选择 iOS 按键精灵无根有根越狱辅助工具的理由
节省成本 使用 iOS 按键精灵,每台设备可为你减少 5 - 10 元的签名成本。对于需要使用大量脚本或者多设备操作的用户来说,长期下来能够节省一笔可观的费用。 不断更新优化 按键精灵团队始终致力于产品的更新与优化。新版本不断增加新功能&#x…...
电脑里的AI帮手:Open Interpreter智能助手食用指南
Open Interpreter简介如下: interpreter是一个使用python开发的命令行工具,可以让你在终端中使用类似AI对话的方式,只需简单输入指令要求,即可自动编写程序、执行代码,实现各种自动化操作interpreter有自动检测输出结…...
Windows软件界面分析软件-控件识别工具
Inspect.exe 这是微软提供的一款 UI 自动化检查工具,主要用于开发和测试应用程序的辅助功能(Accessibility)及 UI 自动化。 主要功能: 查看界面元素的属性(如名称、角色、状态、位置等)。 支持 UIA&…...
iOS 冷启动时间监控:启动起点有哪些选择?
⏱️ iOS 冷启动时间监控:启动起点有哪些选择? 作者:侯仕奇 来源:sqi.io 在监控 iOS 冷启动性能时,一个关键问题是:如何精确记录 App 冷启动的开始时间? 本文将对不同的“冷启动起点”监控方式…...
MacOS怎么显示隐藏文件
现象描述: 有些文件比如git的配置文件会作为隐藏文件存在。 Mac os默认是不显示隐藏文件的。 但是很多场合下我们需要查看或者编辑这些隐藏文件。 解决方法: 如下图所示,在Finder中使用Shift⇧Command⌘.快捷键 显示和隐藏都是同样的按…...
苹果紧急修复两个已被利用的iOS漏洞,用于针对特定目标的复杂攻击
苹果公司已发布iOS 18.4.1和iPadOS 18.4.1更新,修复两个被用于针对特定iPhone用户实施高度定向、复杂攻击的关键零日漏洞。 这两个漏洞存在于CoreAudio和RPAC组件中,攻击者可利用它们在受影响设备上执行任意代码或绕过安全保护机制。 两个正被活跃利用…...
8.观察者模式:思考与解读
原文地址:观察者模式:思考与解读 更多内容请关注:7.深入思考与解读设计模式 引言 在开发软件时,系统的某些状态可能会发生变化,而你希望这些变化能够自动通知到依赖它们的其他模块。你是否曾经遇到过,系统中某个对象…...
13.编码器的结构
从入门AI到手写Transformer-13.编码器的结构 13.编码器的结构代码 整理自视频 老袁不说话 。 13.编码器的结构 T r a n s f o r m e r E n c o d e r : 输入 [ b , n ] TransformerEncoder:输入[b,n] TransformerEncoder:输入[b,n] E m b e d d i n g : − > [ b , n , d ]…...
java 设计模式之模板方法模式
简介 模板方法模式:定义一个算法的基本流程,将一些步骤延迟到子类中实现。模板方法模式可以提高代码的复用性, 模板方法中包含的角色: 抽象类:负责给出一个算法的基本流程,它由一个模板方法和若干个基本…...
C++面向对象
面向对象的思想 面向过程: 根据程序的执行过程,来设计软件的所有细节。面向过程的缺点:开发大型项目时,越来越难以把控,甚至失去控制。后期维护、更新成本很大。解决方案:使用面向对象。 什么是面向对象…...
守护进程编程
目录 一、守护进程 1.1 守护进程概述 1.2 守护进程的功能及特点 1.2.1 守护进程的功能 1.2.2 守护进程的特点 1.3 主要过程 1.4 阿里云服务器编程实现守护进程 1.4.1 daemon 命令 1.4.2 nohup命令 1.4.3 fork()编程实现 1.5 在树莓派中通过三种方式创建守护进程 1.5…...
【Spring Boot 源码学习】深入 ConfigurableEnvironment 的初始化过程
《Spring Boot 源码学习系列》 深入 ConfigurableEnvironment 的初始化过程 一、引言二、配置环境的初始化2.1 源码总览2.2 prepareEnvironment 方法2.2.1 获取或创建可配置环境2.2.2 配置环境并设置参数2.2.3 将配置属性源附加到环境中2.2.4 触发环境准备事件2.2.5 将DefaultP…...
若依集成BladeX单点登录的令牌管理与api请求流程
目录 概述系统架构单点登录流程令牌管理机制接口调用流程关键代码实现数据结构安全性考虑常见问题与解决 概述 本文档详细说明若依系统如何实现与BladeX的单点登录集成,包括令牌管理和接口调用的完整流程。整个集成采用基于OAuth2的授权码流程,允许用…...
54常用控件_QLCDNumber的属性
目录 代码示例: 倒计时 QLCDNumer 是一个专门用来显示数字的控件.类似于“老式计算器”的效果 核心属性 属性 说明 intValue QLCDNumber显示的数字值(int). value QLCDNumber 显示的数字值(double). 和intValue是联动的. 例如给value设为1.5, intValue的值就是2. 另外&a…...
IcePlayer音乐播放器项目分析及学习指南
IcePlayer音乐播放器项目分析及学习指南 项目概述 IcePlayer是一个基于Qt5框架开发的音乐播放器应用程序,使用Visual Studio 2013作为开发环境。该项目实现了音乐播放、歌词显示、专辑图片获取等功能,展现了桌面应用程序开发的核心技术和设计思想。 技…...
【ELF2学习板】Ne10进行FFT测试
目录 引言 Ne10简介 交叉编译Ne10 测试 测试程序 测试结果 结语 引言 在上一篇博文介绍了FFTW在ELF2开发板的测试。其中我们提到--enable-neon选项在aarch64平台下无法启用。接下来测试一个专门用NEON指令优化的FFT库Ne10。 Ne10简介 NE10 是一个面向 ARM 架构的开源数…...
Android device PCO (protocol configuration options) intro
术语 英文缩写英文全称中文PCOprotocol configuration options协议配置选项RILradio interface layer 无线电接口层PCO介绍 PCO(Protocol Configuration Options) 是 3GPP 标准协议(TS 24.008)中定义的核心概念,用于在 LTE/5G 网络建立 PDN 连接时传递动态配置参数(如 D…...
HAL库通过FATFS和SDIO+DMA写入SD卡数据错误
HAL库F4版本 1.28.1 最近在使用HAL库配置SDIODMA并通过FATFS向SD卡写入数据,但是发现写入的数据经常有错误,不是少了一部分就是多了一部分,写入的数据为csv格式,通过循环向缓冲区写入"100100,12.345678\r\n"数据来观察问…...
RK Android11 修改默认语言为法语及时区为巴黎时间
文章目录 1、需求2、解决 1、需求 客户要求将系统默认语言改为法语,系统默认时区改为巴黎时间(也称为欧洲中部时间)2、解决 --- a/build/make/tools/buildinfo.shb/build/make/tools/buildinfo.sh-46,7 46,7 echo "ro.product.cpu.ab…...
文件上传Ⅰ
文件上传--前后端验证 不让上传php,所以要绕过它 遇到网站可能不是php语言,会是java或者python语言等,它只能解析网站本身的语言,那我们就上传符合网站语言识别的格式(它能解析什么后缀,就上传什么后缀)&…...
IntelliJ IDEA clean git password
IntelliJ IDEA clean git password 清除git密码 方法一:(这个要特别注意啊,恢复默认设置,你的插件什么要重新下载了) File->Manage IDE Settings->Restore Default Settings以恢复IDEA的默认设置(可选); 清空…...
【C++指南】哈希驱动的封装:如何让unordered_map/set飞得更快更稳?【上】
🌟 各位看官好,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 💬 注意:本文在哈希函数中主讲除法散列法,乘法散列法、全域散列法、双重散列等自行了解。 &#x…...
论坛测试报告
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
人脸扫描黑科技:多相机人脸扫描设备,打造你的专属数字分身
随着科技的迅猛发展,人脸扫描这个词已经并不陌生,通过人脸扫描设备制作超写实人脸可以为影视制作打造逼真角色、提升游戏沉浸感,还能助力教育机构等领域生产数字人以丰富教学资源,还在安防、身份识别等领域发挥关键作用࿰…...
统计字符串每个字符出现频率
输入一个字符串,统计每个字符的出现频率,然后判断最大频率与最小频率的差值 cnt: 如果 cnt 是质数,则输出 "Lucky Word" 和 差值; 否则输出 "No Answer" 和 0。 #include <bits/stdc.h> u…...
SQL-子查询
SQL子查询是嵌套在另一个SQL查询中的SELECT语句,将内部查询的结果作为外部查询的条件或者数据源。 核心概念 子查询是一个完整的SELECT语句,可以嵌入到其他查询的where, from, SELECT, HAVING等子句中,用于动态生成条件或临时数据集。 例如…...
Python(21)Python日期时间完全指南:从基础到实战注意事项
目录 一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法则 三、企业级应用案例3.1 全球日志分析系统3.2 金融交易时间校验 四、六大核心注意事项1. 时区意识优先原则2. 时间戳的精度陷阱3. 夏令时转换三步骤4. 日期格式化安全指南5. 性…...
【医学影像 AI】早产儿视网膜病变国际分类(第三版)
【医学影像 AI】早产儿视网膜病变国际分类(第三版) 0. 论文简介0.1 基本信息0.2 摘要0.3 缩略语0.4 ICROP3的关键内容总结 1. 引言2. 血管化位置:区域(ZONE)3. 加重病变与前加重病变4. 急性病变分期(阶段1-…...
焊接机器人的设计
一、引言 随着制造业的发展,焊接工艺在各个领域得到广泛应用。焊接机器人具有焊接质量高、效率高、劳动强度低等优点,能够满足现代制造业对焊接生产的要求。设计一款性能优良的焊接机器人,对于提高焊接生产的自动化水平和产品质量具有重要意…...
SQL SERVER里面也可以插入存储过程,操作TCP,WEBSOCKET吗?数据发生改变时用于通知客户端
SQL SERVER里面也可以插入存储过程,操作TCP,WEBSOCKET吗?数据发生改变时用于通知客户端SQL存储过程入门🔥 - 人生得E不早朝 深度思考完成 用时28秒 好的,用户的问题是:SQL Server里面是否可以通过插入存储过程来操作TCP或WebSocket&…...
利用 DeepSeek-R1 模型和计算机视觉微调模型实现马铃薯叶片疾病识别和分类
一、需求背景 在农业现代化进程中,作物健康监测对于保障粮食安全和提高农业生产效率起着举足轻重的作用。马铃薯作为全球重要的粮食作物之一,其种植面积广泛,产量和质量直接关系到众多农户的生计以及食品供应链的稳定。准确、快速地鉴别马铃…...
文章记单词 | 第39篇(六级)
一,单词释义 themselves [əmˈselvz] pron. 他们自己;她们自己;它们自己;(用以加强语气)他们亲自,她们亲自,它们亲自;(反身代词) 指某人或某物本…...
深入理解C++中string的深浅拷贝
目录 一、引言 二、浅拷贝与深拷贝的基本概念 2.1 浅拷贝 2.2 深拷贝 在C 中, string 类的深浅拷贝有着重要的区别。 浅拷贝 深拷贝 string 类中的其他构造函数及操作 resize 构造 构造(赋值构造) 构造(拼接构造…...
C++ 常用的智能指针
C 智能指针 一、智能指针类型概览 C 标准库提供以下智能指针(需包含头文件 <memory>): unique_ptr:独占所有权,不可复制, 可移动shared_ptr:共享所有权,用于引用计数weak_pt…...
【AI部署】腾讯云GPU-常见故障—SadTalker的AI数字人视频—未来之窗超算中心 tb-lightly
ERROR: Could not find a version that satisfies the requirement tb-nightly (from torchreid) (from versions: none) ERROR: No matching distribution found for tb-nightly 解决 阿里云 python -m pip install tb-nightly -i https://mirrors.aliyun.com/pypi/simple …...
三大等待和三大切换
三大等待 1、三大等待:等待的方式有三种:强制等待,隐性等待,显性等待。 1、强制等待:time.sleep(2),秒 优点:使用简单缺点:等待时间把握不准,容易造成时间浪费或者等待时…...
工程化实践:Flutter项目结构与规范
工程化实践:Flutter项目结构与规范 在Flutter项目开发中,良好的工程化实践对于提高开发效率、保证代码质量和团队协作至关重要。本文将从项目结构、代码规范、CI/CD流程搭建以及包管理等方面,详细介绍Flutter项目的工程化最佳实践。 项目结…...
数据结构-Map和Set
文章目录 1. 搜索树2. Map3. Set4. 哈希表4.1 哈希表的基本概念4.2 哈希表的实现方法4.3 Java中的哈希表实现 5. 哈希桶哈希桶的实现方式哈希桶的作用哈希桶的应用模拟实现 1. 搜索树 二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树࿰…...
cpolar 内网穿透 实现公网可以访问本机
1、登录网站,升级成专业版,测试的话建议选一个月付费,选择预留 2、保留的TCP地址增加一条记录,描述可以自己取 3、验证,生成一个Authtocken码 4、在安装目录下,打开CMD命令,复制上面的码运行aut…...
QT调用ffmpeg库实现视频录制
可以通过QProcess调用ffmpeg命令行,也可以直接调用ffmpeg库,方便。 调用库 安装ffmpeg ffmpeg -version 没装就装 sudo apt-get update sudo apt-get install ffmpeg sudo apt-get install ffmpeg libavdevice-dev .pro引入库路径,引入库 LIBS += -L/usr/lib/aarch64-l…...
AI专题(一)----NLP2SQL探索以及解决方案
前面写了很多编码、算法、底层计算机原理等相关的技术专题,由于工作方向调整的缘故,今天开始切入AI人工智能相关介绍。本来按照规划,应该先从大模型的原理开始介绍会比较合适,但是计划赶不上变化,前面通用大模型的工作…...
Redis 的指令执行方式:Pipeline、事务与 Lua 脚本的对比
Pipeline 客户端将多条命令打包发送,服务器顺序执行并一次性返回所有结果。可以减少网络往返延迟(RTT)以提升吞吐量。 需要注意的是,Pipeline 中的命令按顺序执行,但中间可能被其他客户端的命令打断。 典型场景&…...
群辉默认docker数据存储路径
做一下笔记 今天不小心路径规划错误,好不容易找到了数据,特此做个路径记录。 /var/packages/ContainerManager/var/docker/...
【C++】入门基础【上】
目录 一、C的发展历史二、C学习书籍推荐三、C的第一个程序1、命名空间namespace2、命名空间的使用3、头文件<iostream>是干什么的? 个人主页<—请点击 C专栏<—请点击 一、C的发展历史 C的起源可以追溯到1979年,当时Bjarne Stroustrup(本…...
Git LFS 学习笔记:原理、配置、实践与心路历程
最近在学习 Git LFS,把一些零散的笔记整理成一篇博文,记录我的学习思路与心路历程。以下内容均为个人理解总结,部分尚未在生产项目中验证,仅供回顾与参考。 🔍 Git LFS 是什么?原理是什么? 刚接…...
SpringBoot集成oshi 查询系统数据
实现功能: <!-- 获取系统信息 --><dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>6.6.1</version></dependency><dependency><groupI…...
iOS Facebook 登录
iOS Facebook 登录 官方文档 SDK下载链接...
uniapp打包IOS私钥证书过期了,如何在非mac系统操作
在非Mac系统下解决uniapp打包iOS私钥证书过期的问题,需通过以下步骤实现: --- ### **一、重新生成iOS证书(非Mac环境操作)** 1. **生成私钥和CSR文件** 使用OpenSSL工具(需提前安装)生成私钥和证书签…...