当前位置: 首页 > news >正文

征程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 步:

  1. 解压软件包:
  • dpkg 首先会解压 。deb 包的内容到一个临时目录。.deb 文件实际上是一个包含多个文件的归档,主要包括:
    • control.tar.gz:包含控制文件(如 control、postinst、prerm 等)。
    • data.tar.gz 或 data.tar.xz:包含实际的安装文件。
    • debian-binary:标识该包使用的 dpkg 版本。
  1. 检查控制文件:
  • dpkg 读取并解析 control 文件,该文件包含了包的元数据(如包名、版本、依赖关系等)。
  1. 执行预装脚本(preinst):
  • 如果存在 preinst 脚本,dpkg 会在正式安装文件之前执行该脚本。这个脚本通常用于在安装之前执行某些准备工作。
  1. 解压文件到目标目录:
  • dpkg 将 data.tar。* 解压到系统的根目录(/),覆盖或新建文件和目录。
  1. 设置文件权限和所有权:
  • 解压后,dpkg 会根据包中的元数据设置文件的权限和所有权。
  1. 执行配置脚本(postinst):
  • dpkg 接下来会执行 postinst 脚本。这个脚本通常用于执行安装后的配置工作,例如启动服务、注册系统组件等。
  1. 记录包信息:
  • dpkg 会在 /var/lib/dpkg/status 文件中记录已安装包的信息,方便系统和用户查询包的状态。

2.3 deb 包的卸载原理

.deb 包的卸载流程原理同安装流程原理。卸载流程也主要依赖 deb 包管理工具 和 辅助安装脚本。deb 包安装工具负责删除;辅助卸载脚本负责卸载前后的定制化操作。整个卸载流程可以总结为以下 4 步:

  1. 执行预卸载脚本(prerm):
  • 如果存在 prerm 脚本,dpkg 会在移除文件之前执行该脚本。这个脚本通常用于停止服务、解除系统注册等。
  1. 删除文件:
  • dpkg 会删除安装包中包含的文件和目录。
  1. 执行后卸载脚本(postrm):
  • dpkg 会执行 postrm 脚本。这个脚本通常用于清理卸载后的遗留文件或重置系统配置等。
  1. 更新包信息:
  • 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

如上,软件包完成安装,可启动软件正常运行。

相关文章:

  • c# 三元表达式
  • 基于python深度学习遥感影像地物分类与目标识别、分割实践技术
  • 数据采集使用动态代理被拦截的原因是什么?
  • 声波定位技术在地下管道中如何应用
  • 开箱即用的大模型应用跟踪与批量测试方案
  • 搜索插入位置
  • 小程序兼容问题
  • 再也不用担心内容重复!在线伪原创工具,让创作更自由!
  • 9月27日,每日信息差
  • 计算机毕业设计之:微信小程序的校园闲置物品交易平台(源码+文档+讲解)
  • AI视频技术:引领影视剧拍摄的未来
  • Java网络通信—UDP
  • 【CSS】字体文本
  • Android常用C++特性之std::optional
  • 镜像电流源与其应用(防倒灌电路)
  • Facebook AccountKit 接入的坑点
  • JavaScript学习总结——原型
  • Theano - 导数
  • Vultr 教程目录
  • 闭包--闭包之tab栏切换(四)
  • 关于extract.autodesk.io的一些说明
  • 记录一下第一次使用npm
  • 来,膜拜下android roadmap,强大的执行力
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 事件委托的小应用
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 想写好前端,先练好内功
  • 用简单代码看卷积组块发展
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 阿里云服务器如何修改远程端口?
  • ​Spring Boot 分片上传文件
  • !!Dom4j 学习笔记
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (07)Hive——窗口函数详解
  • (4)事件处理——(7)简单事件(Simple events)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (js)循环条件满足时终止循环
  • (笔试题)分解质因式
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (算法)大数的进制转换
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (原)Matlab的svmtrain和svmclassify
  • (转)Windows2003安全设置/维护
  • 、写入Shellcode到注册表上线
  • .Net 8.0 新的变化
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)