rpm打包新手入门

rpm介绍

RPM(Red Hat Package Manager)是一种软件包管理工具,主要用于Red Hat及其衍生发行版如Fedora、CentOS等。RPM可以帮助用户方便地安装、升级、删除软件包。RPM包主要由以下几部分组成:

  • 包名:软件包的名称,如httpd。
  • 版本:软件的版本号,如2.4.6。
  • 发行号:针对特定版本的软件制作的RPM包的版本,如1.el7。
  • 架构:软件包适用的硬件架构,如x86_64、i386等。 一个完整的RPM包名示例:httpd-2.4.6-1.el7.x86_64.rpm

通过学习rpm包的相关知识,我们可以将自己的软件打包成rpm包,以便于在基于Red Hat的Linux发行版(如Fedora、CentOS等)上进行分发和安装。将软件打包成RPM包有以下优点:

  • 管理依赖关系:RPM包可以包含构建和运行时所需的依赖信息,这有助于确保在安装过程中自动满足所有必要的依赖关系。
  • 一致性和可重复性:RPM包提供了一种标准化的方法来构建和安装软件,从而确保在不同的系统上具有一致性和可重复性。
  • 方便的安装和升级:用户可以通过rpm命令或者包管理工具(如yum或dnf)轻松地安装、升级或删除RPM包,而无需手动下载和解压源代码或二进制文件。
  • 软件包的元数据和文档:RPM包包含了软件的元数据(如名称、版本、许可证等)以及描述、变更日志等信息,这有助于用户了解软件包的内容和历史。

rpm打包

为了将我们的软件打包成rpm包,我们需要使用rpm-build工具:

sudo yum install rpm-build

在使用rpm-build工具构建RPM包时,需要按照一定的目录结构组织软件。这些目录通常位于~/rpmbuild(用户的主目录下的rpmbuild文件夹),包含BUILD,RPMS,SOURCES,SPECS,SRPMS子目录。

  • SPECS:这个目录用于存储.spec(SPECifications)文件,即RPM包的规范文件。.spec文件包含了软件包的元数据、描述、变更日志以及在各个构建阶段需要执行的命令。rpmbuild命令会读取这个目录中的.spec文件以执行构建过程。一个.spec文件主要包括以下两部分内容:
    a. 软件包的元信息:这部分包括软件包的名称、版本、发行号、许可证等元数据,以及构建和运行时所需的依赖。这些信息用于描述软件包的基本属性,以及在安装和构建过程中需要满足的依赖关系。
    b.详细信息和构建命令:这部分通过不同的标签(如%description、%changelog、%prep、%build、%install 和 %files)记录了软件包的详细描述、变更日志以及在各个构建阶段需要执行的操作。这些标签定义了软件包的构建过程,并提供了有关软件包内容和历史的详细信息。通过组合这两部分内容,.spec文件为RPM包提供了完整的描述和构建指南。这使得RPM包可以在不同的系统上进行一致的构建和安装。

    • %description:这个标签用于提供软件包的详细描述。在这个标签下的文本会被视为软件包的描述信息,通常用于向用户介绍软件包的功能、用途等。这部分信息会在查询软件包信息时显示,例如使用 rpm -qi 命令。
    • %changelog:这个标签用于记录软件包的变更历史。在这个标签下,你需要按照特定的格式添加每个版本的变更记录,包括日期、维护者的姓名和电子邮件地址、软件包的版本和发行号以及变更描述。这部分信息对于跟踪软件包的发展和了解各个版本之间的差异非常有用。
    • %prep:准备阶段,通常用于解压源代码文件并应用任何补丁。在这个阶段可以执行一些准备工作,例如清理目录、检查环境等。
    • %build:构建阶段,用于编译源代码并生成可执行文件、库文件等。在这个阶段可以执行编译命令,如make,以及其他与构建过程相关的命令。
    • %install:安装阶段,用于将编译好的文件安装到构建根目录(%{buildroot})下的相应位置。在这个阶段可以执行安装命令,如make install,以及其他与安装过程相关的命令。
    • %files:文件列表阶段,用于指定RPM包中包含的文件。在这个阶段需要列出所有要包含在最终RPM包中的文件和目录。
  • SOURCES:这个目录用于存储软件包的源代码文件,例如源代码的压缩文件(如hello-rpm-1.0.tar.gz)、补丁文件等。在构建过程中,%prep阶段会从这个目录中提取源代码文件。

  • BUILD:这个目录用于存储在构建过程中产生的临时文件。当执行%prep和%build阶段时,源代码会被解压并编译在这个目录下。完成构建过程后,这个目录下的文件通常会被丢弃,因为它们不会包含在最终的RPM包中。

  • RPMS:这个目录用于存储构建完成后的二进制RPM包。在%install和%files阶段完成后,生成的RPM包会被放入这个目录。RPMS目录下通常还会根据不同的硬件架构分成子目录,例如x86_64、i386等。

  • SRPMS:这个目录用于存储源代码RPM包(Source RPM)。源代码RPM包包含了软件的源代码以及构建该软件所需的.spec文件。与二进制RPM包相比,源代码RPM包允许用户在本地环境中自行构建和安装软件,有时这对于定制软件或解决特定问题是很有帮助的。

在打包完成得到rpm包后,用户可以通过rpm命令或者包管理工具(如yum或dnf)轻松地安装、升级或删除RPM包

打包示例
下面将会用一个简单的示例向大家具体地展示如何进行rpm打包。

假定我们有一个C++程序,使用cmake进行构建:

hello-rpm-1.0
├── CMakeLists.txt
└── hello-rpm.cpp

hello-rpm.cpp

#include <iostream>using namespace std;int main() {cout << "Hello RPM!" << endl;return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(hello-rpm)set(CMAKE_CXX_STANDARD 11)add_executable(hello-rpm hello-rpm.cpp)install(TARGETS hello-rpm DESTINATION /usr/bin)

将程序源码进行压缩:

tar -zcvf hello-rpm-1.0.tar.gz hello-rpm-1.0/

创建rpmbuild目录结构:

mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

在使用rpm-build工具构建RPM包时,一般会要求在用户的/(用户主目录)下创建rpmbuild目录。这是因为rpmbuild工具默认会在/rpmbuild目录下查找源代码、构建规范文件和构建结果等文件。

将源代码压缩文件复制到~/rpmbuild/SOURCES目录下:

cp hello-rpm-1.0.tar.gz ~/rpmbuild/SOURCES/

在~/rpmbuild/SPECS目录下创建hello-rpm.spec文件:除了%description这些阶段标签,其他以%开头的都是一些rpm-build提供的宏,辅助完成打包工作

# 软件包名称
Name:           hello-rpm     
# 版本号
Version:        1.0           
# 发行版本号,是一个宏用来获取系统发行版本号
Release:        1%{?dist}     
# 简短描述
Summary:        A simple C++ program built with cmake# 许可证类型
License:        GPLv3+        
# 软件包的官方网址
URL:            https://www.example.com/  
# 定义了源代码文件的位置
# %{name}和%{version}分别对应之前定义的软件包名称和版本号,即"hello-rpm-1.0.tar.gz"
# rpmbuild工具通常期望源代码文件夹的名称也符合%{name}-%{version}格式。
Source0:        %{name}-%{version}.tar.gz # 构建时依赖
BuildRequires:  gcc-c++, cmake, make   # 详细描述
%description    
This is a simple C++ program built with cmake, as an example of creating an RPM package.# 准备阶段
%prep    
# 解压缩源代码文件,并将当前工作目录切换到解压后的源代码目录       
%setup -q       # 构建阶段
%build          
# 运行cmake命令,自动处理一些常见的构建参数
%cmake          
# 运行make工具,根据之前生成的Makefile来编译源代码。%{?_smp_mflags}宏会根据系统的可用处理器核心数自动设置make命令的-j选项,以便在编译过程中充分利用系统资源,加快编译速度。
make %{?_smp_mflags}  # 安装阶段
%install        
# 将编译好的文件安装到%{buildroot}目录下
# %{buildroot}表示构建过程中的临时安装目录
make install DESTDIR=%{buildroot} # 文件列表阶段
%files          
%{_bindir}/hello-rpm
# 指定与软件包相关的文档文件,允许用户仅安装软件包的文档,而不是整个软件包。这可以通过在安装时使用rpm命令的--excludedocs选项来实现。
%doc       %changelog
* Wed Oct 11 2023 Your Name <your.email@example.com> - 1.0-1
- Initial release

在%files部分,%{_bindir}/hello-rpm表示应该将名为hello-rpm的文件包含在最终的RPM包中。这个文件在%install阶段已经被安装到了构建根目录(%{buildroot})下的%{_bindir}目录中。%{_bindir}宏通常会被替换为/usr/bin。

因此,在RPM包被安装到系统时,hello文件将从构建根目录(%{buildroot})下的/usr/bin目录被复制到系统的/usr/bin目录下。这样,用户就可以在命令行中直接运行hello-rpm命令。
在完成上面的工作后,使用rpmbuild工具进行打包:

rpmbuild -ba ~/rpmbuild/SPECS/hello-rpm.spec

在RPMS和SRPMS目录下查看打包完成的rpm二进制包和源码包:

$ tree RPMS/
RPMS/
└── x86_64├── hello-rpm-1.0-1.el7.x86_64.rpm└── hello-rpm-debuginfo-1.0-1.el7.x86_64.rpm1 directory, 2 filestree SRPMS/
SRPMS/
└── hello-rpm-1.0-1.el7.src.rpm0 directories, 1 file

然后我们就可以使用rpm命令或者yum/dnf包管理工具进行安装:

$ sudo yum install ~/rpmbuild/RPMS/x86_64/hello-rpm-1.0-1.el7.x86_64.rpm
Loaded plugins: fastestmirror, langpacks
Examining /home/edward/rpmbuild/RPMS/x86_64/hello-rpm-1.0-1.el7.x86_64.rpm: hello-rpm-1.0-1.el7.x86_64
Marking /home/edward/rpmbuild/RPMS/x86_64/hello-rpm-1.0-1.el7.x86_64.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package hello-rpm.x86_64 0:1.0-1.el7 will be installed
--> Finished Dependency ResolutionDependencies Resolved===========================================================================================================================================Package                      Arch                      Version                       Repository                                      Size
===========================================================================================================================================
Installing:hello-rpm                    x86_64                    1.0-1.el7                     /hello-rpm-1.0-1.el7.x86_64                    7.0 kTransaction Summary
===========================================================================================================================================
Install  1 PackageTotal size: 7.0 k
Installed size: 7.0 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transactionInstalling : hello-rpm-1.0-1.el7.x86_64                                                                                              1/1 Verifying  : hello-rpm-1.0-1.el7.x86_64                                                                                              1/1 Installed:hello-rpm.x86_64 0:1.0-1.el7                                                                                                             Complete!

运行hello-rpm:

$ hello-rpm 
Hello RPM!

运行成功!!!
我们也可以再使用yum卸载:

$ sudo yum remove hello-rpm.x86_64 
Loaded plugins: fastestmirror, langpacks
Resolving Dependencies
--> Running transaction check
---> Package hello-rpm.x86_64 0:1.0-1.el7 will be erased
--> Finished Dependency ResolutionDependencies Resolved===========================================================================================================================================Package                      Arch                      Version                      Repository                                       Size
===========================================================================================================================================
Removing:hello-rpm                    x86_64                    1.0-1.el7                    @/hello-rpm-1.0-1.el7.x86_64                    7.0 kTransaction Summary
===========================================================================================================================================
Remove  1 PackageInstalled size: 7.0 k
Is this ok [y/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transactionErasing    : hello-rpm-1.0-1.el7.x86_64                                                                                              1/1 Verifying  : hello-rpm-1.0-1.el7.x86_64                                                                                              1/1 Removed:hello-rpm.x86_64 0:1.0-1.el7                                                                                                             Complete!
$ hello-rpm
bash: hello-rpm: command not found...

大功告成!

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

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

相关文章

过滤器的实现及其原理责任链设计模式

Filter过滤器 过滤器的应用 DeptServlet,EmpServlet,OrderServlet三个业务类的业务方法执行之前都需要编写判断用户是否登录和解决的中文乱码的代码,代码没有得到重复利用 Filter是过滤器可以用来编写请求的过滤规则和多个Servlet都会执行的公共代码,Filter中的业务代码既可…

JVM的内存模型

一、JVM的内存模型 1.1、目标 内存模型是用来描述JVM内部的内存结构和内存管理的模型。它定义了JVM在运行Java程序时所需要的各种内存区域&#xff0c;以及每个内存区域的作用和特点。 1.2、结构划分 1.2.1、栈 每个线程在执行Java方法时会创建一个栈帧&#xff08;Stack …

Chrome自动播放限制策略

原文链接&#xff1a;Chrome 自动播放限制策略 Web浏览器正在朝着更严格的自动播放策略发展&#xff0c;以便改善用户体验&#xff0c;最大限度地降低安装广告拦截器的积极性并减少昂贵和/或受限网络上的数据消耗。这些更改旨在为用户提供更大的播放控制权&#xff0c;并使开发…

elasticsearch索引的数据类型以及别名的使用

在上篇文章写了关于elasticsearch索引的数据类型&#xff0c;这里就详细说下索引的增删改查以及其他的一些操作吧。 1、索引的增、删、改、查 先新建一个索引结构&#xff0c;代码如下 PUT test-3-2-1 {"mappings": {"properties": {"id": {&…

如何看待Unity新的收费模式?(InsCode AI 创作助手)

Unity引擎是目前全球最受欢迎的3D游戏和应用开发引擎之一&#xff0c;按照Unity公司自己的说法&#xff0c;全球1000款畅销移动游戏中70%以上都使用了Unity引擎。如果统计全平台&#xff08;包括PC、主机和移动设备&#xff09;的情况&#xff0c;非官方数据是&#xff0c;超过…

[sqoop]hive导入mysql,其中mysql的列存在默认值列

一、思路 直接在hive表中去掉有默认值的了列&#xff0c;在sqoop导入时,指定非默认值列即可&#xff0c; 二、具体 mysql的表 hive的表 create table dwd.dwd_hk_rcp_literature(id string,literature_no string,authors string,article_title string,source_title string…

RabbitMQ开启消息发送确认和消费手动确认

开启RabbitMQ的生产者发送消息到RabbitMQ服务端的接收确认&#xff08;ACK&#xff09;和消费者通过手动确认或者丢弃消费的消息。 通过配置 publisher-confirm-type: correlated 和publisher-returns: true开启生产者确认消息。 server:port: 8014spring:rabbitmq:username: …

项目创建 Vue3 + Ts + vite + pinia

vite官网 项目初始化 准备安装工作(按步骤创建) npm init vuelatest创建完成后再次安装对应插件 然后百度配置main.ts里面引入 npm i pinia --save //安装pinia npm i vue-router --save //安装router npm i axios --save //安装axios //安装sass或less npm add -D scss npm…

Hadoop----Hive的使用

1.数据库的安装&#xff0c;通过网上教程&#xff0c;使用yum进行安装即可&#xff0c;一定删除干净&#xff0c;下载与Hive版本对应的MySQL。 2.Hive的安装&#xff0c;在官网下载.tar.gz包解压至对应目录&#xff08;/export/server&#xff09;&#xff0c;可以根据网上教程…

Python 函数参数传递

Python 函数参数传递 我们都知道&#xff0c;在C中&#xff0c;函数参数的传递包括&#xff0c;值传递、引用传递、地址传递&#xff0c;这三种参数传递方式&#xff0c;并且可以在定义函数时显式的指明传递方式&#xff0c;而Python并非如此。 Python 的函数参数传递是基于对…

uniapp-vue3微信小程序实现全局分享

uniapp-vue3微信小程序实现全局分享 文章目录 uniapp-vue3微信小程序实现全局分享微信小程序官方文档的分享说明onShareAppMessage(Object object)onShareTimeline() uniapp 官方文档的分享说明onShareAppMessage(OBJECT) 实现全局分享代码结构如下share.js文件内容main.js注意…

聊聊身边的嵌入式:用了七八年的电动牙刷,突然罢工了!!!

家里用了七八年的电动牙刷&#xff0c;前两天突然罢工。先尝试一下野蛮的修复方法(摔摔打打)&#xff0c;这种独家绝技屡试不爽&#xff0c;曾经修好过收音机&#xff0c;电视机&#xff0c;电子手表… 等等。不过这次&#xff0c;没有成功&#xff01;这周末终于有点儿时间&am…

数据库Mysql三大引擎(InnoDB、MyISAM、 Memory)与逻辑架构

MySQL数据库及其分支版本主要的存储引擎有InnoDB、MyISAM、 Memory等。简单地理解&#xff0c;存储引擎就是指表的类型以及表在计算机上的存储方式。存储引擎的概念是MySQL的特色&#xff0c;使用的是一个可插拔存储引擎架构&#xff0c;能够在运行的时候动态加载或者卸载这些存…

PostgreSQL limit 语法

PostgreSQL limit 语法 LIMIT 是 PostgreSQL 中用于限制查询结果数量的关键字。其语法如下&#xff1a; SELECT column1, column2, ... FROM table_name LIMIT number_of_rows;其中&#xff0c;SELECT 语句用于指定要查询的列和数据表&#xff0c;LIMIT 用于指定查询结果的行…

奥威BI系统:做数据可视化大屏,又快又简单

数据可视化大屏的制作难吗&#xff1f;会很花时间精力吗&#xff1f;这就要看用的是什么软件了。如果用的是BI系统&#xff0c;特别是奥威BI系统这类BI商业智能软件&#xff0c;那就是又快又简单。 奥威BI系统介绍&#xff1a; 奥威BI系统是一款高效的数据可视化大屏工具&…

Xilisoft Video Converter Ultimate for Mac:让音视频转换变得更简单

无论是在工作还是娱乐中&#xff0c;我们都会遇到音视频格式不兼容的问题。这时候&#xff0c;一个好用的音视频格式转换工具就显得尤为重要。Xilisoft Video Converter Ultimate for Mac&#xff08;曦力音视频转换&#xff09;就是这样一款让您的音视频转换变得更简单的工具。…

linux的管道命令|

有时候&#xff0c;我们可能需要”递归地“执行多条命令&#xff0c;将命令一的结果作为命令二的输入&#xff0c;这时候就需要使用管道命令| 管道命令|可以将多条命令连接起来&#xff0c;每一个命令单独执行&#xff0c;并作为下一个命令的输入 格式&#xff1a; cmd1|cmd2…

萝卜刀玩具上架亚马逊CPC认证测试标准

含铅或含铅涂料儿童产品的要求 分阶段限制儿童产品所有部件的铅含量&#xff0c;要求在3年内将产品任何可接触部件的铅含量限制从不超过重量的600ppm&#xff08;0.06%&#xff09;降至不超过重量的100ppm&#xff08;0.01%&#xff09;。 铅含量限值&#xff08;总铅含量占重…

Pushgateway的场景使用

1,Pushgateway简介 Pushgateway为Prometheus整体监控方案的功能组件之一,并做为一个独立的工具存在。它主要用于Prometheus无法直接拿到监控指标的场景,如监控源位于防火墙之后,Prometheus无法穿透防火墙;目标服务没有可抓取监控数据的端点等多种情况。在类似场景中,可通…

element树形控件单选

需求功能&#xff1a; 1&#xff0c;element树形控件单选 2&#xff0c;双击节点编辑 <div style"height: calc(100% - 48px)"><el-scrollbar class"scrollbar-wrapper"><el-tree :data"treesObj" show-checkbox default-expan…