如何打一个RPM包

参考链接:RPM打包原理、示例、详解及备查

前言

本文只是一个RPM安装的例子,并没有对RPM做比较详尽的叙述,更为详尽的讲解,可以在上面的链接中找到。

RPM是啥?

RPM(Redhat Package Manager)是用于Redhat、CentOS、Fedora等Linux 分发版(distribution)的常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。

话不多说,让我们开始打RPM包!我们将以打Supervisor包为例。

安装rpmbuild

在开始之前,我们先做好准备工作:

RPM打包使用的是rpmbuild命令,这个命令来自rpm-build包。

$ yum install rpm-build
$ yum install rpmdevtools

打成的包要做什么?

接着,我们来看看如果手动安装Supervisor,我们可能要的步骤:

  • 将压缩包上传至: /tmp/
  • cd /tmp/
  • tar -C /opt/ -xzf supervisor-4.0.2.tar.gz
  • cd /opt/
  • mv supervisor-4.0.2 supervisor
  • cd supervisor
  • python setup.py install
  • echo_supervisord_conf > /etc/supervisord.conf
  • supervisord -c /etc/supervisord.conf

即解压 / 重命名文件夹 / 运行安装脚本 / 增加配置文件 / 启动进程

创建RPM文件

接下来,我们将上面的操作转为RPM操作,首先我们需要编写一个spec文件。我们可以通过spec文件来配置要生成的rpm包(有点类似Docker的Dockerfile)。

新建spec文档

我们不妨先找到rpmbuild所在目录,通过yum install安装,一般位置为

/用户名/rpmbuild

查看下面的目录

$ ll
total 0
drwxr-xr-x 6 root root 88 May 13 14:30 BUILD
drwxr-xr-x 5 root root 129 May 13 14:30 BUILDROOT
drwxr-xr-x 3 root root 20 May 10 17:04 RPMS
drwxr-xr-x 3 root root 150 May 13 10:29 SOURCES
drwxr-xr-x 2 root root 88 May 13 14:30 SPECS
drwxr-xr-x 2 root root 163 May 13 14:30 SRPMS

这些目录都是干嘛的呢?请看:

默认位置 宏代码 名称 用途
~/rpmbuild/SPECS %_specdir Spec 文件目录 保存 RPM 包配置(.spec)文件
~/rpmbuild/SOURCES %_sourcedir 源代码目录 保存源码包(如 .tar 包)和所有 patch 补丁
~/rpmbuild/BUILD %_builddir 构建目录 源码包被解压至此,并在该目录的子目录完成编译
~/rpmbuild/BUILDROOT %_buildrootdir 最终安装目 保存 %install 阶段安装的文件
~/rpmbuild/RPMS %_rpmdir 标准 RPM 包目录 生成/保存二进制 RPM 包
~/rpmbuild/SRPMS %_srcrpmdir 源代码 RPM 包目录 生成/保存源码 RPM 包(SRPM)

正如上文所说,我们不妨把编写的spec文件放在SPECS目录里面。

$ cd /root/rpmbuild/SPEC/
$ vim supervisor.spec

向spec文档添加内容

基于哪个代码包?

首先我们要知道rpm包生成基于哪个文件生成,一般都是压缩包格式的源代码软件包,比如

supervisor-4.0.2.tar.gz

添加下面的内容

# 软件包的名称
Name: supervisor
# 软件包的版本
Version: 4.0.2
# 源代码软件包的名字
Source0: %{name}-%{version}.tar.gz

上面的Source即指定了源代码软件包。我们同时需要将supervisor-4.0.2.tar.gz文件,放入

上面所说的SOURCES目录。

解压缩代码包

setup -q 命令会自动将上一步指定的压缩包解压,并将文件包内容放置到BUILD目录里;然后cd到解压后的目录中。

# 安装前的准备工作,一般用于解压源码包
%prep
# 解压并cd到相关目录
%setup -q

进行安装

这一步,按照我的感觉,是要把python setup.py install内容加进来的,但是实验后发现,这句命令在%install区内无法执行,需要放置到下一步的区域中。

# 源码安装,如:make install 命令
%install
mkdir -p %{buildroot}/opt/supervisor/
cp -rp %{_builddir}/%{name}-%{version}/* %{buildroot}/opt/supervisor/

安装后置操作

所有文件安装成功后,就可以执行剩下的操作了。%post区域里就是存放这些操作的。

## 安装后执行的脚本
%post
cd /opt/supervisor/
python setup.py install
echo_supervisord_conf > /etc/supervisord.conf
supervisord -c /etc/supervisord.conf

这样一来,spec的主要内容部分就都写好了,剩下的就补充一些细枝末节了。

完善spec内容

将剩余的字段完善后,得到的最终文件如下所示:

# 软件包的名称
Name: supervisor
# 软件包的版本
Version: 4.0.2
# 软件包发布序列号,1表示第几次打包
Release: 1%{?dist}
# 软件包的概要信息,不要超过50个
Summary: The supervisor is a client/server system.
# 软件授权方式
License: BSD-derived
# 软件分类
Group:System Environment/Daemons
# 源代码软件包的官方地址或源码包的下载地址
URL: https://pypi.org/project/supervisor/
# 源代码软件包的名字
Source0: %{name}-%{version}.tar.gz # install使用的虚拟目录,安装后就在该目录下打包
BuildRoot: %_topdir/BUILDROOT
#软件包详细描述信息
%description
The supervisor is a client/server system that allows its users to control a number of processes on UNIX-like operating systems. # 安装前的准备工作,一般用于解压源码包
%prep
#解压并cd到相关目录
%setup -q # 源码编译,如: ./configure && make命令
%build # 源码安装,如:make install 命令
%install
mkdir -p %{buildroot}/opt/supervisor/
cp -rp %{_builddir}/%{name}-%{version}/* %{buildroot}/opt/supervisor/ ## 安装后执行的脚本
%post
cd /opt/supervisor/
python setup.py install
echo_supervisord_conf > /etc/supervisord.conf
supervisord -c /etc/supervisord.conf # 清理临时文件
%clean
# rm -rf %{buildroot} # 定义那些文件或目录放入RPM当中 %file是在虚拟根目录(BuildRoot)下进行,千万不要写绝对路径,应该使用宏或者变量表示相对路径
%files
/ %doc
# RPM包软件的每次修改记录到这里 %changelog
* Fri May 13 2019 MG
- Initial Supervisor 4.0.2 RPM release

生成RPM包并安装

我们可以使用上面所编写的spec文件来生成RPM包。

生成rpm

$ rpmbuild -ba supervisor.spec

运行完上述命令后,我们可以进入RPMS目录。发现多了一个rpm文件。

$ ll RPMS/x86_64/supervisor-4.0.2-1.el7.centos.x86_64.rpm
-rw-r--r-- 1 root root 643728 May 13 14:16 RPMS/x86_64/supervisor-4.0.2-1.el7.centos.x86_64.rpm

安装RPM包

将生成的rpm文件复制到另外一台机器上,执行下面的命令,就可以发现rpm包可以正常安装了。

rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm

大功告成!

可能遇到的问题

问题1:rpm conflicts with file from package

安装的时候增加–replacefiles参数,例如

rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm --replacefiles

问题2:xxx is already installed

安装的时候增加--replacepkgs参数,例如

rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm --replacepkgs

问题3:如何查看当前系统发行版

$ cat /proc/version
Linux version 3.10.0-693.25.4.el7.x86_64 (mockbuild@x86-030.build.eng.bos.redhat.com) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Sat Apr 28 14:04:53 EDT 2018

如何打一个RPM包的更多相关文章

  1. C0302 将一个代码块中的内容保存在文件中, 查看一个rpm包是否可以安装

    #!/bin/bash # 这个脚本是用来描述和确认是否可以安装一个rpm包 # 在一个文件中保存输出 SUCCESS=0 E_NOARGS=65 if [ -z "$1" ] t ...

  2. 《Advanced Bash-scripting Guide》学习(七):描述、列表和确定是否可以安装一个rpm包

    本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 Example 3-2.将一个代码块的结果保存到文件 #!/bin/bash # ...

  3. RPM包制作教程

    一.RPM介绍 RPM 前是Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理:现在应为RPM Package M ...

  4. Centos下安装nginx rpm包

    1 在nginx官方网站下载一个rpm包,下载地址是:http://nginx.org/en/download.html wget http://nginx.org/packages/centos/6 ...

  5. 安装RPM包或者安装源码包

    本系列的博客来自于:http://www.92csz.com/study/linux/ 在此,感谢原作者提供的入门知识 这个系列的博客的目的在于将比较常用的liunx命令从作者的文章中摘录下来,供自己 ...

  6. 烂泥:Linux源码包制作RPM包之Apache

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 公司服务器比较多,需要把apache源码包制作成rpm包,然后放到公司内网yum源上进行下载安装.apache的rpm包安装方式比源码安装方式比较快,这能 ...

  7. 安装rpm包

    下载好一个rpm包怎样安装? [root@localhost ~]# ls anaconda-ks.cfg install.log install.log.syslog jboss-as-7.1.1- ...

  8. rpm包制作(待实验)

    作者:firefoxbug 时间:July 18, 2014 rpm包命名规范 对于rpm包的命名符合如下规范. %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm N ...

  9. 安装 RPM 包或者安装源码包

    安装 RPM 包或者安装源码包 在windows下安装一个软件很轻松,只要双击.exe的文件,安装提示连续“下一步”即可,然而linux系统下安装一个软件似乎并不那么轻松了,因为我们不是在图形界面下. ...

随机推荐

  1. Lniux上的tomcat部署web项目路径问题

    一.项目路径及部署.启动位置 1.在tomcat下部署应用,部署路径:一般直接部署在tomcat/webapps/ROOT下即可.2.默认访问路径:tomcat的默认访问路径为webapps/ROOT ...

  2. Windows10 64位解决无法使用Microsoft.Jet.OLEDB.4.0的方法

    本机软件环境:Windows10 64位+Office2003 (32位) ============================================= 1.下载 ACE2010的驱动, ...

  3. Python基础之用PyQt5界面代码分离以及自定义一个槽函数

    最近开发一个项目,需要用到界面,遇到界面不能实时更新的问题,看到网上很多用槽函数,但是大多都是些button的,并不是我需要的,要么就是整数的,后来自己进行尝试,写了一个自定义的槽函数处理treewi ...

  4. PWN——ret2dl_resolve

    PWN--ret2dl_resolve ret2dl_resolve是栈溢出中,底层且高级的一种利用手段,这里特此做一篇笔记学习一下. 个人认为,要掌握这种方法,自己去写demo来多次调试分析是不二法 ...

  5. Vulhub-DC-2靶场

    Vulhub-DC-2靶场 前言 最近一直忙于学习代码审计和内网渗透,所以靶场这方面的文章一直未更新,但是计划是更新完DC系列靶场的,这个不会鸽. DC-2的靶场是很简单的一共5个flag. 正文 f ...

  6. C++ 二进制文件 读 写文件

    1 #include <iostream> 2 #include <string> 3 #include<fstream> 4 using namespace st ...

  7. Solidity

    起因是Xenc师傅给我截了张图,我日 居然看不懂 ,一搜才知道,之前学的版本有些老了.. 这次学下新一点的记录下 HelloWorld pragma solidity ^0.6.0; // versi ...

  8. 《手把手教你》系列技巧篇(十六)-java+ selenium自动化测试-元素定位大法之By xpath下卷(详细教程)

    1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath.xpath 的定位方法, 非常强大.  使用这种方法几乎可以定位到页面上的任意元素. ...

  9. MySQL Replication Thread States

    1.主节点线程状态(Replication Master Thread States): Finished reading one binlog; switching to next binlog 线 ...

  10. 解决win10快速访问不能取消固定

    最近发现win10的快速访问不能取消固定,比如ftp和smb之类的都不能取消固定 最后百度了一下发现一个简易的方法: 在文件资源管理器地址栏输入:%APPDATA%\Microsoft\Windows ...