RPM构建-介绍

 

本文主要参考https://blog.csdn.net/younger_china/article/details/53131071

1. RPM是什么

RPM 以前是RedHat Package Manager的缩写,本意是RedHat 软件包管理,顾名思义是RedHat 贡献出来的软件包管理;现在应为RPM Package Manager的缩写。在Fedora、RedHat、Mandriva、SUSE、YellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版采用; RPM包中除了包括程序运行时所需要的文件,也有其它的文件;一个RPM包中的应用程序,有时除了自身所带的附加文件保证其正常以外,还需要其它特定版本文件,这就是软件包的依赖关系。

rpm分为两大类:

1 二进制类包,包括rpm安装包(一般分为i386和x86等几种)和调式信息包等

2 源码类包,源码包和开发包应该归位此类。

2. RPM能做什么

RPM可以让用户直接以binary方式安装软件包,并且可替用户查询是否已经安装了有关的库文件;在用RPM删除程序时,它又会聪明地询问用户是否要删除有关的程序。如果使用RPM来升级软件,RPM会保留原先的配置文件,这样用户就不用重新配置新的软件了。RPM保留一个数据库,这个数据库中包含了所有的软件包的资料,通过这个数据库,用户可以进行软件包的查询。RPM虽然是为Linux而设计的,但是它已经移值到SunOS、Solaris、AIX、Irix等其它UNIX系统上了。RPM遵循GPL版权协议,用户可以在符合GPL协议的条件下自由使用及传播RPM。

RPM有五种基本的操作功能:安装、卸载、升级、查询和验证。

这五种基本功能的实现仅仅需要用rpm + 选项 + rpm包就能轻易地实现。这五个功能常用的方式如下(以python为例):

安装:
rpm -ivh python-2.7.5-48.el7.x86_64.rpm
查询:

查询python相关的rpm包

[zht@zht-dev ~]$ rpm -qa python
python-2.7.5-48.el7.x86_64

列出python安装包相关的文件列表(适用于已安装的rpm包)

[zht@zht-dev ~]$ rpm -ql python
/usr/bin/pydoc
/usr/bin/python
/usr/bin/python2
/usr/bin/python2.7
/usr/share/doc/python-2.7.5
/usr/share/doc/python-2.7.5/LICENSE
/usr/share/doc/python-2.7.5/README
/usr/share/man/man1/python.1.gz
/usr/share/man/man1/python2.1.gz
/usr/share/man/man1/python2.7.1.gz

列出rpm包文件内的文件列表(适用于rpm包文件)

[root@zht-dev x86_64]# rpm -qlp dhcp-common-4.2.5-68.el7.centos.1.x86_64.rpm 
/etc/dhcp
/usr/share/doc/dhcp-common-4.2.5
/usr/share/doc/dhcp-common-4.2.5/LICENSE
/usr/share/doc/dhcp-common-4.2.5/README
/usr/share/doc/dhcp-common-4.2.5/RELNOTES
/usr/share/doc/dhcp-common-4.2.5/References.txt
/usr/share/man/man5/dhcp-eval.5.gz
/usr/share/man/man5/dhcp-options.5.gz

列出rpm包的依赖

[fh@stx3-builder-zht RPMS]$ rpm -qpR openstack-nova-16.1.7-1.tis.1.noarch.rpm 
openstack-nova-compute = 1:16.1.7-1.tis.1
openstack-nova-scheduler = 1:16.1.7-1.tis.1
openstack-nova-api = 1:16.1.7-1.tis.1
openstack-nova-network = 1:16.1.7-1.tis.1
openstack-nova-conductor = 1:16.1.7-1.tis.1
openstack-nova-console = 1:16.1.7-1.tis.1
openstack-nova-cells = 1:16.1.7-1.tis.1
openstack-nova-novncproxy = 1:16.1.7-1.tis.1
openstack-nova-placement-api = 1:16.1.7-1.tis.1
openstack-nova-migration = 1:16.1.7-1.tis.1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadIsXz) <= 5.2-1

查询文件所属的rpm包

[zht@zht-dev ~]$ rpm -qf /usr/bin/python2
python-2.7.5-48.el7.x86_64

删除
rpm -e python-2.7.5-48.el7.x86_64

一般的话都会先通过查询已经安装好的包,然后执行删除命令,上述命令,即可卸载掉系统安装好的rpm包。

升级
rpm -Uvh python-2.7.5-48.el7.x86_64.rpm
验证
[zht@zht-dev ~]$ rpm -V python-2.7.5-76.el7.x86_64.rpm
package python-2.7.5-76.el7.x86_64.rpm is not installed
解压rpm源码包
[zht@zht-dev tmp]$ rpm2cpio systemd-219-62.el7_6.5.src.rpm | cpio -id
16579 blocks

3. 了解RPM包名

{name}-{version}-{release}.{architecture}.rpm

例如:python-2.7.5-76.el7.x86_64.rpm

name —— 软件的名字:python;

version ——软件的版本:2.7.5;

release ——软件包的发行版本:76;

architecture ——架构:el7.x86_64;

4. 如何创建RPM包

要构建 RPM,需要三步:

第一步:依照 rpmbuild 规范设定一个目录结构:

目录与文件介绍:

目录或文件名 描述
BUILD 用作实际编译软件的暂存空间
RPMS 包含 rpmbuild 所编译的二进制 RPM
SOURCES 存储源代码
SPECS 存放spec文件,每个RPM 对应一个spec文件
SRPMS 包含在这个过程中构建的源 RPM
.rpmmacos RPM构建配置文件(可选)

注:

构建RPM包,至少需要 SOURCES 中的源代码和SPEC中的一个spec文件。

第二步:将源代码和附带文件放在目录中合适的位置

将源代码(理想情况下应为一个 tar.gz压缩文件)复制到 SOURCES 目录中。如果有必要,重命名 tar压缩文件,以包含应用程序的版本号,便于与其他文件区分开。约定的命名格式为包-版本.tar.gz。

第三步:创建 spec 文件

需要详细介绍spec文件;

在SPEC目录通过以下命令初始化spec文件,然后根据具体情况进行修改。

rpmdev-newspec <软件名>.spec

第四步:编译 RPM

rpmbuild <选项> <软件名>.spec

选项说明:

选项 说明
-ba 建立一个 rpm 以及一个.src.rpm
-bb 只建立二进制的 rpm
-bc 编译但不构建软件包,停止在%build 区段
-bp 只做到%prep 区段
-bi 在%install 后停止
-bl 列出 rpm 中的文件列表
-bs 只建立 src.rpm 文件