本文主要参考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 文件 |