征程6 上基于 DEB 工具实现包管理
1.引言
在开发、调测过程中,开发人员需要将系统软件、应用软件部署到 Soc 板端,以用于运行调试。传统的部署方式是通过解压复制或者调用部署脚本。这样的部署方式需要有着方式不统一、维护投入大的缺点。
在 linux 系统上,大多采用包管理的方式管理软件包,常见的包管理方式如上。相比于部署脚本的方式,使用统一的包管理工具有规范和优化软件包的发布、管理流程,减少维护工作量、可溯源性高的优点,适合多版本、多种类软件包的场景。
在 J6 上,底软支持基于 DEB 的包管理方式,支持通过 apt、dpkg 的方式安装软件包。本文将讲解基于 DEB 工具的包管理方式,并以管理 Boyan.deb 软件包为例,展示包的构建、在 征程6 上的部署等内容。
2.Deb 软件包原理介绍
.deb 是 Debian 和基于 Debian 系统(如 Ubuntu)使用的软件包格式,它包含软件及其安装信息。它的主要作用是简化软件的分发和安装,即用于板端软件包部署。
2.1 deb 包的结构
.deb 包中主要包括 可执行程序、控制文件两大部分。一个常见的 。deb 包的目录结构如下。可执行程序部分是需要安装在板端的程序内容,如下的 data.tar.gz 路径;控制文件是脚本集合,用于辅助软件包的安装、卸载操作,如下的 control.tar.gz 路径。
software_1.0-1.deb
│
├── control.tar.gz
│ ├── control
│ ├── preinst
│ ├── postinst
│ ├── prerm
│ └── postrm
│
└── data.tar.gz├── usr│ └── local│ └── bin│ └── software└── etc└── software└── config.conf
2.2 deb 包的安装原理
.deb 包的安装流程主要依赖 deb 包管理工具 和 辅助安装脚本。deb 包安装工具负责解压、复制、部署;辅助安装脚本负责安装前后的定制化操作。整个安装流程可以总结为以下 7 步:
- 解压软件包:
- dpkg 首先会解压 。deb 包的内容到一个临时目录。.deb 文件实际上是一个包含多个文件的归档,主要包括:
- control.tar.gz:包含控制文件(如 control、postinst、prerm 等)。
- data.tar.gz 或 data.tar.xz:包含实际的安装文件。
- debian-binary:标识该包使用的 dpkg 版本。
- 检查控制文件:
- dpkg 读取并解析 control 文件,该文件包含了包的元数据(如包名、版本、依赖关系等)。
- 执行预装脚本(preinst):
- 如果存在 preinst 脚本,dpkg 会在正式安装文件之前执行该脚本。这个脚本通常用于在安装之前执行某些准备工作。
- 解压文件到目标目录:
- dpkg 将 data.tar。* 解压到系统的根目录(/),覆盖或新建文件和目录。
- 设置文件权限和所有权:
- 解压后,dpkg 会根据包中的元数据设置文件的权限和所有权。
- 执行配置脚本(postinst):
- dpkg 接下来会执行 postinst 脚本。这个脚本通常用于执行安装后的配置工作,例如启动服务、注册系统组件等。
- 记录包信息:
- dpkg 会在 /var/lib/dpkg/status 文件中记录已安装包的信息,方便系统和用户查询包的状态。
2.3 deb 包的卸载原理
.deb 包的卸载流程原理同安装流程原理。卸载流程也主要依赖 deb 包管理工具 和 辅助安装脚本。deb 包安装工具负责删除;辅助卸载脚本负责卸载前后的定制化操作。整个卸载流程可以总结为以下 4 步:
- 执行预卸载脚本(prerm):
- 如果存在 prerm 脚本,dpkg 会在移除文件之前执行该脚本。这个脚本通常用于停止服务、解除系统注册等。
- 删除文件:
- dpkg 会删除安装包中包含的文件和目录。
- 执行后卸载脚本(postrm):
- dpkg 会执行 postrm 脚本。这个脚本通常用于清理卸载后的遗留文件或重置系统配置等。
- 更新包信息:
- dpkg 会更新 /var/lib/dpkg/status 文件,移除关于该包的记录。
3.Boyan 软件包管理示例
以管理 Boyan.deb 软件包为例,本节将展示 Boyan-runtime.deb 软件包的构建、在 J6 上的安装部署。
3.1 Boyan.deb 包构建
Boyan.deb 包生成的核心步骤是两两步:一是控制文件的生成;二是软件包 data 的生成。将 Boyan.deb 包的生成接入到 Boyan 整包的编译构建流程中,其整体构建流程如下:

在编译完成后,生成 runtime_tmp_package 目录,存放可执行程序、控制文件、辅助安装脚本等文件,用于构建 Boyan_Runtime.deb 软件包。最终,runtime_tmp_package 目录的结构如下:
runtime_tmp_package
│
├── DEBIAN // Package info文件
│ ├── control
│ ├── preinst
│ ├── postinst
│ ├── prerm
│ └── postrm
│
└── middleware // Package data
│ ├── bin
│ ├── etc
| │ ├── j6 // 配置文件
| │ │ └── sm
| │ │ └── em
| │ │ └── ...
│ ├── lib // 动态库
│ │ ├── libexec.so
│ │ ├── libsm_client.so
│ ├── pub // 三方库
│ │ ├── lib
│ │ │ └── ...
│ ├── config_repo // 配置文件库
│ │ ├── default
│ │ │ └── ...
│ │ ├── pilot5.1
│ │ │ └── ...
│ │ ├── ...
│ │ │ └── ...
│ └── ...
其中,可执行程序可直接从编译产出物拷贝,控制文件和辅助安装脚本则需要编写。
控制文件(Control 文件)需要描述软件包的相关信息,必须包含包名、版本等必要信息。Boyan_Runtime.deb 包的控制文件如下:
Package: boyan-runtime-j6
Version: 1.11.1
Section: utils
Priority: optional
Architecture: arm64
Depends:
Maintainer: Auto_Bsw <Auto_Bsw@horizon.cc>
Description: Basic Software. Boyan-runtime package is used to install in j6 soc for runtime. This package contains lib, bin and configs for all boyan modules.
辅助安装脚本用于 停止服务进程、启动服务经常、构建执行脚本 等工作,各个辅助安装脚本的作用如下:
- preinst(安装前脚本):停止 em_service 和 boyan 的相关服务
- postinst(安装后脚本):创建 em_service 启动脚本
- prerm(卸载前脚本):停止 em_service 和 boyan 的相关服务
- postrm(卸载后脚本):删除 em_service 启动脚本
通过上述步骤,将产出物都按照目录结构放置在 runtime_tmp_package 目录下,再通过 dpkg 工具构建指令构建 deb 包即可,构建指令如下:
dpkg-deb -b runtime_tmp_package/ Boyan_Runtime.deb
3.2 Boyan.deb 包部署
构建 Boyan.deb 包后,将软件包拷贝到 征程6 板端,并通过 dpkg 命令安装软件包,安装指令如下:
dpkg -i Boyan_Runtime_Full_J6_V1.11.1_20240920-110923.deb
安装日志如下:
Selecting previously unselected package boyan-runtime-j6.
(Reading database ... 24654 files and directories currently installed.)
Preparing to unpack Boyan_Runtime_Full_J6_V1.11.1_20240920-110923.deb ...
Running pre-installation tasks...
Termiate em_service and boyan service...
Stop boyan service...
Mount middleware partition...
Unpacking boyan-runtime-j6 (1.11.1) ...
Setting up boyan-runtime-j6 (1.11.1) ...
Running post-installation tasks...
Please restart the device...
安装后通过 dpkg -l 指令查询到包的安装状态、版本、架构等信息,显示如下。当安装新版本软件时,dpkg 工具会通过版本比较、依赖检查等方式管理多版本包的升级和替换。
ii boyan-runtime-j6 1.11.1 arm64 Basic Software. Boyan-runtime package is used to install in j6 soc for runtime. This package contains lib, bin and configs for all boyan modules.
安装后查看/middleware 分区下的文件安装情况:
total 24
drwxr-xr-x. 7 root root 4096 Jan 1 09:23 .
drwxr-xr-x 1 root root 340 Jan 27 2024 ..
drwxr-xr-x 3 root root 4096 Jan 1 09:23 bin
drwxr-xr-x 12 root root 4096 Jan 1 09:23 config_repo
drwxr-xr-x 12 root root 4096 Jan 1 09:23 etc
lrwxrwxrwx 1 root root 35 Jan 1 09:23 init.sh -> /middleware/bin/em_service_boyan.sh
drwxr-xr-x 2 root root 4096 Jan 1 09:23 lib
drwxr-xr-x 3 root root 4096 Jan 1 09:23 pub
如上,软件包完成安装,可启动软件正常运行。
相关文章:
征程6 上基于 DEB 工具实现包管理
1.引言 在开发、调测过程中,开发人员需要将系统软件、应用软件部署到 Soc 板端,以用于运行调试。传统的部署方式是通过解压复制或者调用部署脚本。这样的部署方式需要有着方式不统一、维护投入大的缺点。 在 linux 系统上,大多采用包管理的…...
【git】一文详解: git rebase到底有啥问题
引子 我反复看到这样的评论:“git rebase 像屎一样”。人们似乎对此有很强烈的感受,我真的很惊讶,因为我没有遇到太多使用 rebase 的问题,而且我一直在使用它。 使用 rebase 的成本有多大?在实际使用中它给你带来了什…...
高性能计算应用优化实践之WRF
WRF(Weather Research Forecast)模式是由美国国家大气研究中心(NCAR)、国家环境预报中心(NCEP)等机构自1997年起联合开发的新一代高分辨率中尺度天气研究预报模式,重点解决分辨率为1~…...
nsight-compute使用教程
一 安装 有的时候在linux上安装上了nsight-compute,可以生成报告,但是却因为缺少qt组件而无法打开,我选择的方法是在linux上生成报告,在window上的nsight compute的图形界面打开,需要注意的是,nsight compute图形界面的版本一定要更高,不然无法打开 二 使用 2.1 生成…...
【深度学习】03-神经网络01-4 神经网络的pytorch搭建和参数计算
# 计算模型参数,查看模型结构,我们要查看有多少参数,需要先安装包 pip install torchsummary import torch import torch.nn as nn from torchsummary import summary # 导入 summary 函数,用于计算模型参数和查看模型结构# 创建神经网络模型类 class Mo…...
我与Linux的爱恋:命令行参数|环境变量
🔥个人主页:guoguoqiang. 🔥专栏:Linux的学习 文章目录 一.命令行参数二.环境变量1.环境变量的基本概念2.查看环境变量的方法3.环境变量相关命令4.环境变量的组织方式以及获取环境变量的三种方法 环境变量具有全局属性 一…...
django drf 统一Response格式
场景 需要将响应体按照格式规范返回给前端。 例如: 响应体中包含以下字段: {"result": true,"data": {},"code": 200,"message": "ok","request_id": "20cadfe4-51cd-42f6-af81-0…...
SM2协同签名算法中随机数K的随机性对算法安全的影响
前面介绍过若持有私钥d的用户两次SM2签名过程中随机数k相同,在对手获得两次签名结果Sig1和Sig2的情况下,可破解私钥d。 具体见SM2签名算法中随机数K的随机性对算法安全的影响_sm2关闭随机数-CSDN博客 另关于SM2协同签名过程,具体见SM2协同签…...
解决setMouseTracking(true)后还是无法触发mouseMoveEvent的问题
如图,在给整体界面设置鼠标追踪且给ui界面的子控件也设置了鼠标追踪后,运行后的界面仍然有些地方移动鼠标无法触发 mouseMoveEvent函数,这就令人头痛。。。 我的解决方法是:重载event函数: 完美解决。。。...
基于深度学习的花卉智能分类识别系统
温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 传统的花卉分类方法通常依赖于专家的知识和经验,这种方法不仅耗时耗力,而且容易受到主观因素的影响。本系统利用 TensorFlow、Keras 等深度学习框架构建卷积神经网络&#…...
Springboot集成MongoDb快速入门
1. 什么是MongoDB 1.1. 基本概念 MongoDB是一个基于分布式文件存储 [1] 的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数…...
DERT目标检测—End-to-End Object Detection with Transformers
DERT:使用Transformer的端到端目标检测 论文题目:End-to-End Object Detection with Transformers 官方代码:https://github.com/facebookresearch/detr 论文题目中包括的一个创新点End to End(端到端的方法)简单的理解就是没有使…...
软件后端开发速度慢的科技公司老板有没有思考如何破局
最近接到两个科技公司咨询,说是他们公司后端开发速度太慢,前端程序员老等着,后端程序员拖了项目进度。 这种问题不只他们公司,在软件外包公司中,有一部分项目甲方客户要得急,以至于要求软件开发要快&#…...
开放原子超级链内核XuperCore可搭建区块链
区块链是一种分布式数据库技术,它以块的形式存储数据,并使用密码学方法保证数据的安全性和完整性。 每个块包含一定数量的交易信息,并通过加密链接到前一个块,形成一个不断增长的链条。 这种设计使得数据在网络中无法被篡改,因为任何尝试修改一个块的数据都会破坏整个链的…...
【Qualcomm】高通SNPE框架的使用 | 原始模型转换为量化的DLC文件 | 在Android的CPU端运行模型
目录 ① 激活snpe环境 ② 设置环境变量 ③ 模型转换 ④ run on Android 首先,默认SNPE工具已经下载并且Setup相关工作均已完成。同时,拥有原始模型文件,本文使用的模型文件为SNPE 框架示例的inception_v3_2016_08_28_frozen.pb文件。imag…...
C++map与set
文章目录 前言一、map和set基础知识二、set与map使用示例1.set去重操作2.map字典统计 总结 前言 本章主要介绍map和set的基本知识与用法。 一、map和set基础知识 map与set属于STL的一部分,他们底层都是是同红黑树来实现的。 ①set常见用途是去重 ,set不…...
随手记:前端一些定位bug的方法
有时候接到bug很烦躁,不管是任何环境的bug,看到都影响心情,随后记总结一下查看bug的思路,在摸不着头脑的时候或者焦虑的时候,可以静下心来顺着思路思考和排查bug可能产生的原因 1.接到bug,最重要的是&am…...
【深度学习】03-神经网络2-1损失函数
在神经网络中,不同任务类型(如多分类、二分类、回归)需要使用不同的损失函数来衡量模型预测和真实值之间的差异。选择合适的损失函数对于模型的性能至关重要。 这里的是API 的注意⚠️,但是在真实的公式中,目标值一定是…...
Python爬虫APP程序:构建智能化数据抓取工具
在信息爆炸的时代,数据的价值日益凸显。Python作为一种强大的编程语言,与其丰富的库一起,为爬虫程序的开发提供了得天独厚的优势。本文将探讨如何使用Python构建一个爬虫APP程序,以及其背后的思维逻辑。 什么是Python爬虫APP程序&…...
第五部分:2---中断与信号
目录 操作系统如何得知哪个外部资源就绪? 什么是中断机制? CPU引脚和中断号的关系: 中断向量表: 信号和中断的关系: 操作系统如何得知哪个外部资源就绪? 操作系统并不会主动轮询所有外设来查看哪些资源…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
