Yocto 项目下通过网络更新内核、设备树及模块

Yocto 项目下通过网络更新内核、设备树及模块

前言

在 Yocto 项目的开发过程中,特别是在进行 BSP(Board Support Package)开发时,经常需要调整特定软件包的版本,修改内核、设备树以及内核模块。然而,每次更改后都重新刷写整个镜像不仅耗时,而且效率低下。本文主要记录一种快速迭代开发的方法,即通过网络更新内核镜像、设备树以及内核模块,以 ST 开发板为例进行详细说明。

调整特定软件包版本

在 Yocto 项目中,调整特定软件包的版本是一个常见的需求。

以调整 libgpiod 版本为例,libgpiod 是一个专为 Linux 系统设计的 GPIO 控制库。它提供了一组用户空间的API,使开发者能够方便地与GPIO设备进行交互,进行配置、读取和控制操作。

  • 定位配方:
    • 在 openembedded 目录下使用 find . -name "libgpiod" 搜索 libgpiod 的配方路径。
    • 确定 meta-openembedded/meta-oe/recipes-support/libgpiod 目录下是否存在你需要的指定版本配方。(如果不存在,那就要考虑自己编写配方,这里不考虑这种情况)
      在这里插入图片描述
  • 指定版本:在 conf/local.conf 文件中添加 PREFERRED_VERSION_libgpiod = "1.6.4%" 来指定 libgpiod 的版本为 1.6.4。
  • 编译配方:使用 bitbake libgpiod 命令编译 libgpiod 版本,观察是否下载指定版本的软件包。
  • 检查依赖关系:确保没有其他配方依赖于更高版本的 libgpiod。如果有,可能需要调整这些配方的依赖关系或更新它们以兼容 1.6.4 版本。
  • 清理构建缓存:如果之前构建过其他版本的 libgpiod,可能需要清理构建缓存以避免潜在冲突。可以使用 bitbake -c cleansstate libgpiodbitbake -c cleanall libgpiod 命令。
  • 验证版本:在构建完成后,可以使用 bitbake -e libgpiod PV 命令来验证实际使用的 libgpiod 版本号(PV 代表 Package Version)。

查找所有配方

Yocto 项目构建系统依赖于大量的配方(Recipe)文件,这些文件定义了如何构建软件包、镜像和其他组件。当需要定位某个特定软件或镜像的配方时,使用 bitbake -s 命令结合 grep 进行筛选是一个实用的技巧。

  • 使用 bitbake -s 列出所有配方及其版本。
  • 使用 bitbake-layers show-recipes,列出所有可用的配方及其所属的层,这有助于我们理解配方的来源和层次结构。

如何通过网络更新内核镜像和设备树

  • 定位配方文件:在 Yocto 中,内核镜像的配方通常符合 linux-<?> 的命名规则,这种命名模式用于表示特定于某个硬件平台或特定功能的 Linux 内核配方(Recipe)。如 linux-imx(i.MX系列)、linux-stm32mp(STM32MP系列)、linux-qcom(针对高通平台)、linux-rpi(针对树莓派平台)等。

    • 使用 bitbake -s | grep linux 查找当前构建系统中可能涉及 Linux 内核的源代码、模块、设备树或其他与 Linux 相关组件的配方。
    • 如果不确定哪个目标是内核镜像,可以查看与 Linux 内核相关的配方文件(通常位于 meta-layers 的recipes-kernel/ 目录下)。这些配方文件会定义如何构建 Linux 内核,并且可能会包含构建镜像的目标。如下图的 linux-stm32mp
      在这里插入图片描述
  • 使用 bitbake linux-stm32mp 触发一个完整的内核镜像构建过程,这个过程会自动去下载源代码、配置、编译和打包内核镜像等步骤。

  • 查找编译包的位置

    • Yocto 在编译完成后会生成很多文件,通常位于<work dir>/<build dir>/tmp 目录下。其中,内核编译完成后的镜像文件一般会放在类似于<work dir>/<build dir>/tmp/work/<machine name>-<distro name>-linux/<kernel name>/<version>-r<revision>/image/boot/的目录下。这里的< >需要根据具体的 Yocto工程配置来确定。比如说我这里:

    • 内核镜像 uImage :build/tmp-glibc/work/stm32mp15_loar_gateway-ostl-linux-gnueabi/linux-stm32mp/6.1.82-stm32mp-r2-r0/image/boot/uImage

    • 设备树文件 : build/tmp-glibc/work/stm32mp15_loar_gateway-ostl-linux-gnueabi/linux-stm32mp/6.1.82-stm32mp-r2-r0/image/boot/stm32mp15-loar-gateway.dtb
      在这里插入图片描述

  • 通过网络更新目标板的内核

    • 进入编译好的镜像目录,替换目标板 /boot 目录下的 uimage,dtb
    • scp uImage root@10.2.1.62:/boot/uImage
    • scp stm32mp15-loar-gateway.dtb root@10.2.1.62:/boot/stm32mp15-loar-gateway.dtb
    • reboot 重启目标板重新加载镜像和设备树
      在这里插入图片描述

如何通过网络更新内核模块

Linux 内核模块可分为内置模块和可加载的模块。

内置模块

  • 内置模块被静态地编译进了内核,它们与内核的其他部分一起被编译成一个单独的二进制文件,并在系统启动时被加载到内存中。所以在更新内核时同样会更新内置模块。

  • 要确定一个模块是不是内置模块,可以运行以下命令,这个文件包含了当前内核版本下所有内置模块的名称。如果一个模块在这个文件中,那么它就是内置的。

    cat /lib/modules/$(uname -r)/modules.builtin
    

可加载模块

  • 可加载模块(也称为动态内核模块)是可以在系统运行时动态地加载和卸载的内核代码块。
  • Yocto 内核编译完成后的内核模块文件一般会放在类似于<work dir>/<build dir>/tmp/work/<machine name>-<distro name>-linux/<kernel name>/<version>-r<revision>/image/lib/modules/的目录下。这里的< >需要根据具体的 Yocto工程配置来确定。比如说我这里的 SPI 模块:build/tmp-glibc/work/stm32mp15_loar_gateway-ostl-linux-gnueabi/linux-stm32mp/6.1.82-stm32mp-r2-r0/image/lib/modules/6.1.82/kernel/drivers/spi/spi-stm32.ko
    在这里插入图片描述
  • 进入编译好的模块目录,替换目标板 /lib/modules/ 目录下对应的内核模块,比如 spi-stm32.ko
    • scp spi-stm32.ko root@10.2.1.62:/lib/modules/6.1.82/kernel/drivers/spi/spi-stm32.ko
    • 更新模块依赖::sudo depmod
    • 加载新模块:sudo insmod /lib/modules/6.1.82/kernel/drivers/spi/spi-stm32.ko
    • 或者使用 modprobe 自动处理模块依赖关系:sudo modprobe spi-stm32

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/59804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s集群安装(kubeadm)

k8s集群安装&#xff08;kubeadm&#xff09; 1、环境准备&#xff08;master和node节点都执行&#xff09;1.1、替换yum源1.2、关闭selinux1.3、永久关闭防火墙1.4、永久关闭swap1.5、修改主机名添加host1.6、时间同步1.7、将桥接的IPv4流量传递到iptables的链1.8、docker安装…

Ubuntu 修改时区 同步时间

Ubuntu 修改时区 同步时间 1、设置系统时区为中国上海2、更新软件包列表3、安装 ntpdate 工具4、从阿里云 NTP 服务器同步时间5、将系统时间同步到硬件时钟6、读取硬件时钟时间 1、设置系统时区为中国上海 timedatectl set-timezone Asia/Shanghai2、更新软件包列表 apt upda…

什么是JVM实现

JVM&#xff08;Java Virtual Machine&#xff0c;Java虚拟机&#xff09;实现是指将JVM规范转化为具体可执行代码的过程和结果。JVM规范定义了Java虚拟机应该具备的功能、行为以及与其他组件的交互方式&#xff0c;但它本身并不包含具体的实现代码。因此&#xff0c;不同的组织…

【日常问题排查小技巧-连载】

线上服务CPU飙高排查 先执行 top&#xff0c;找到CPU占用比较高的进程 id&#xff0c;&#xff08;比如 21448&#xff09; jstack 进程 id > show.txt&#xff08;jstack 21448 > show.txt&#xff09; 找到进程中CPU占用比较高的线程&#xff0c;线程 id 转换为 16 进…

您与此网站之间建立的连接不安全解决方法

如果你打开网站&#xff0c;地址栏有警告&#xff0c;点进去是这样的提示&#xff1a;您与此网站之间建立的连接不安全&#xff0c;了解详细信息。 请勿在此网站上输入任何敏感信息&#xff08;例如密码或信用卡信息&#xff09;&#xff0c;因为攻击者可能会盗取这些信息。 …

【与AI+】学习SAP开发有什么渠道可以推荐

前言&#xff1a;好的&#xff0c;我又将开辟一个新的专栏&#xff0c;这个专栏呢&#xff0c;就准备放一些我向AI提问的问题&#xff0c;以及AI的回答。因为感觉真的好方便哈哈哈~ 我不是很确定我的专栏文章内容是否涉及版权&#xff0c;以及也不确定这些整合过的文字是否涉嫌…

江苏博才众创科技产业园集团拟投资10亿元在泰兴打造汽车零部件产业园

2024年11月7日&#xff0c;泰兴市高新技术产业开发区与江苏博才众创科技产业园集团举行新能源汽车零部件智能制造产业园项目签约仪式。 泰兴市高新区党工委委员、管理办副主任王峰表示&#xff1a;高新区是全市项目建设的主阵地&#xff0c;近年来聚焦高端化、智能化、绿色化&a…

Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比

一、Flutter 的 Widget 概述 Flutter 是 Google 开发的一款开源 UI 框架&#xff0c;旨在帮助开发者快速构建高性能、高保真度的移动、Web 和桌面应用程序。在 Flutter 中&#xff0c;UI 的构建完全是通过 Widget 来实现的。Widget 是 Flutter 中所有用户界面元素的基础构建块…

【python】Flask

文章目录 1、Flask 介绍2、Flask 实现网页版美颜效果3、参考 1、Flask 介绍 Flask 是一个用 Python 编写的轻量级 Web 应用框架。它设计简单且易于扩展&#xff0c;非常适合小型项目到大型应用的开发。 以下是一些 Flask 库中常用的函数和组件&#xff1a; 一、Flask 应用对…

FastAPI —— 请求参数验证

1.hello world 给后端船数据 hello world 接口给后端传 COVID-19 感染数据_高性能 FastAPI 框架入门精讲-慕课网 #!/usr/bin/python3 # -*- coding:utf-8 -*- # __author__ __Jack__from typing import Optionalfrom fastapi import FastAPI from pydantic import BaseModel…

产品经理如何使用项目管理软件推进复杂项目按时上线

前言 相信很多产品同学或多或少都有过这样的经历&#xff1a;平时没有听到任何项目延期风险&#xff0c;但到了计划时间却迟迟无法提测……评审时没有任何argue&#xff0c;提测后发现开发的功能不是自己想要的……费劲九牛二虎之力终于让项目上线了&#xff0c;然而发现成果达…

新系统如何进行模型环境配置

在机器学习和深度学习中&#xff0c;一个良好的开发环境能够显著提高工作效率。本篇博客将详细介绍如何在新的Linux系统&#xff08;以Ubuntu为例&#xff09;上进行模型环境的配置&#xff0c;包括基础系统设置、Python虚拟环境搭建、常用库的安装以及GPU驱动和CUDA的安装等。…

机器视觉:轮廓匹配算法原理

轮廓匹配的模板变量主要包括模板图像&#xff08;Template&#xff09;和待检测图像&#xff08;Source Image&#xff09; 在轮廓匹配中&#xff0c;模板变量主要包括一下几个关键部分&#xff1a; ‌模板图像&#xff08;Template&#xff09;‌&#xff1a;这是进行匹配的…

OpenAI大事记;GPT到ChatGPT参数量进化

目录 OpenAI大事记 GPT到ChatGPT参数量进化 OpenAI大事记 GPT到ChatGPT参数量进化 ChatGPT是从初代 GPT逐渐演变而来的。在进化的过程中,GPT系列模型的参数数量呈指数级增长,从初代GPT的1.17亿个参数,到GPT-2的15 亿个参数,再到 GPT-3的1750 亿个参数。模型越来越大,训练…

STM32移植RT-Thread---时钟管理

一RTT时钟节拍概念 RT-Thread的时钟节拍&#xff08;Tick&#xff09;是操作系统用于管理时间和任务调度的一个基本单位。它在实时操作系统中尤为关键&#xff0c;用于实现任务的延时、超时管理等功能。以下是关于RT-Thread时钟节拍的简单说明&#xff1a; 1.Tick定义&#x…

Am I Isolated:一款安全态势基准测试工具

基于Rust的容器运行时扫描器作为一个容器运行&#xff0c;检测用户容器运行时隔离中的漏洞。 它还提供指导&#xff0c;帮助用户改善运行时环境&#xff0c;以提供更强的隔离保证。 容器的现状是它们并不包含&#xff08;隔离&#xff09;。 容器隔离的缺失在云原生环境中有…

SQLite的BLOB数据类型与C++二进制存储学习记录

一、BLOB数据类型简介 Blob&#xff08;Binary Large Object&#xff09;是一种用于存储二进制数据的数据类型&#xff0c;在数据库中常用于存储图片、音频和视频等大型&#xff08;大数据量&#xff09;的二进制数据[1-2]。需要注意的是&#xff0c;SQLite中BLOB类型的单对象最…

编写一个基于React的聊天室

前言 此前已经编写了一版后端的im&#xff0c;此次就用其作为服务端&#xff0c;可查看参考资料1 代码 使用WebStorm创建React项目 安装依赖包 PS C:\learn-demo\front\chatroom> npm installadded 183 packages, and audited 184 packages in 16s43 packages are looki…

Javascript事件循环流程分析

基础概念 事件循环&#xff08;Event Loop&#xff09;&#xff1a;事件循环是JavaScript运行时环境中的一个循环机制&#xff0c;它不断地检查调栈用和任务队列。当调用栈为空时&#xff0c;事件循环会首先检查微任务队列&#xff0c;并执行其中的所有任务。只有当微任务队列…

解决使用Golang的email库发送qq邮件报错short response,错误类型为textproto.ProtocolError

问题阐述 使用email库发送QQ邮件&#xff0c;采用587端口&#xff1a; package mainimport ("fmt""net/smtp""github.com/jordan-wright/email" )func SendEmail(sendTo string, subject string, body string) (err error) {e : email.NewEmai…