软件包管理器RPM

目前linux界管理软件有2种方式,一是使用dpt来管理,二是使用RPM来管理

dpt使用Debian linxu社区开发的,目前使用dpt来管理的发行商包括:B2D,Ubuntu等。

而RPM是有Red Hat公司开发出来的,目前使用RPM来管理软件的发行商包括:Fedora、CentOS、SuSE等。

由于当前最主流的软件包管理大多使用RPM来管理的,因此在这里我们只介绍如何使用RPM来管理软件包


什么是RPM呢?

RPM:全名是RedHat Package Manager,简称RPM,他是以一种数据库记录的方式将你所需要的软件安装到你的linux系统上的一套管理机制。也就是安装某个软件时,该软件的信息全部写入到了RPM数据库中,以后关于该软件包的升级、卸载、以及校验等操作都是根据RPM数据库中的数据来进行的。


RPM软件包的命名规则:

name-version-release.arch.rpm

软件名称-版本号-发行次数.操作平台.rpm

其中版本号分为主版本号和次版本号

主版本号:当软件包的重大功能发生改进时,才用于修正主版本号

次版本号:某个子功能发生改变时,才会改变,才用于修正次版本号

发行次数就是编译的次数

操作平台主要由以下几种:

    i386:适用于所有的x86平台

    i586:针对586等级的计算机进行优化编译的

    x86_64:针对64位的CPU进行优化编译的

    noarch:表示没有任何硬件等级上的限制




软件包管理器的核心功能是:

1、制作软件包。

    我们知道RPM包是经过原始码编译而来的,所以RPM包是可以直接用来安装的,但是不同的发行商的RPM包是不用相互通用的,有的连相同发行商不同版本的RPM包也不可以使用。原因是编译这些RPM包的编译环境不一样所导致的。这些编译环境包括硬件平台、库文件等等。

    换句话说,只有编译环境和安装RPM的环境一致时,该软件包才可以使用。而软件包管理器就可以用来编译原始码,使其在特定的平台上使用。


2、软件包管理器可以来安装、查询、升级、卸载、校验软件包中文件的正确性、重建数据库等操作。


在这里我们先介绍如何使用RPM来安装软件的。

在linux系统中,许多软件在安装过程中,存在依赖关系,这里所谓的依赖关系就是说在安装A软件时,必须先安装B软件,才能在安装A软件。这就是软件的相依属性

 

 

RPM 的优点

由于RPM 是透过预先编译并打包成为 RPM 文件格式后,再加以安装的一种方式,并且还能够进行数据库的记载。 所以 RPM 有以下的优点:
RPM 内部已经编译过的程序和配置文件等数据,可以让用户克除重新编译的困扰;

RPM 包在被安装之前,会先检查系统的硬盘容量、操作系统版本等,可避免文件被错误安装;

RPM 包本身提供软件版本信息、相依属性软件名称、软件用途说明、软件所含文件等信息,便于了解软件;

RPM 管理的方式使用数据库记录 RPM 包的相关参数,便于升级、移除、查询和验证。

 

 

一、RPM包安装

语法格式:rpm [option] package_file(这个是软件的文件名,全称)

-i:install的意思

-v:显示安装过程中的详细信息

-vv:显示更加详细的信息

-h:以#号来显示安装进度,其中每个#表示2%的进度

其中ivh通常一起使用

--nodeps:在安装过程中,忽略依赖关系,这可能会导致安装的软件无法使用

--replacepkgs:重新安装,替换原有的安装

--replacefiles:在安装过程中,如果某个安装文件已经存在,可以使用此选项覆盖。

--force:强行安装,可以实现重新安装或者降级安装.

--prefix 安装路径:自定义安装路径。


二、RPM包查询

之前说过RPM包在安装的时候会生成一个数据库文件,这个文件是/var/lib/rpm/目录,RPM查询就是在这个目录下查找数据库文件的。

语法格式:rpm [option] [package_name]

-q:查询指定的包是否已经安装

-qa:查询已经安装的所有包,后面不接包名

-qi:查询指定包的说明信息

-qc:查询指定包的所有配置文件

-qd:查询指定包的帮助文件(与man相关)

-ql:查询指定包安装后生成的文件列表

-qR:列出与该软件有关的相依软件所含的文件

-q --scripts:查询指定包中所包含的脚本

软件包的管理(RPM)_rpm安装  查询  卸载  升级  验

-qf /path/to/somefile:查询指定的文件是由那个rpm包安装生成的。

软件包的管理(RPM)_rpm安装  查询  卸载  升级  验_02

如果某个软件包未安装,想要查询其相关信息,可以使用-qp来查询

语法格式:rpm -qp[ilcdR] package_name(未安装的软件包名,且安装包必须在本地已存在的)

其中-icldR意思和上面一样


三、RPM包升级

rpm -Uvh package_file :如果该软件包已安装,则升级;没有安装,则进行安装

rpm -Fvh package_file:如果该软件以安装,则升级;没有安装,则退出

其中选项--oldpackage用于降级安装


四、RPM包卸载

rpm -e package_name:卸载某个软件包

--nodeps:在卸载过程中忽略依赖关系。

在卸载过程中,最好从上层一次往下卸载,避免系统混乱。


五、验证RPM的完整性

RPM完整性验证可以用来检测某个文件是否被修改过,以及该文件是否被误删了等信息。它是通过对比/var/lib/rpm/下的数据库内容和当前系统上面的所有软件包的文件等机制来进行检测的。

语法格式:

rpm [option] [package_name]

-V :检测指定的软件包中的文件是否被修改过,只有被更动过的文件才会显示出来。

-Va:列出系统上所有被更动的文件。

-Vf:检测某个文件是否被更动过。

软件包的管理(RPM)_rpm安装  查询  卸载  升级  验_03

其中这上面的每一个点代表的是SM5DLUGT,只有改变的才会显示出来

S:文件的大小发生改变

M:文件的类型或者权限发生改变

5:MD5随机码不同

D:装置的主/次代号发生改变

L:Link路径发生改变

U:文件的属主发生改变

G:文件的属组发生改变

T:文件的修改时间发生改变


其中后面的字符表示文件类型

c:表示配置文件

d:数据文件

g:该文件不被某个软件所包含

l:许可证文件(license file)

r:自述文件(read me)


六、创建数据库

如果某个用户别不小心损毁了/var/lib/rpm/目录下的文件,那么可以使用rpm来重建数据库

语法格式:

rpm --rebuilddb:不管RPM数据库是否存在,使用该选项一定会重新创建数据库

rpm --initdb:初始化数据库,也就是说如果数据库不存在则创建数据库;存在则不用创建。



七、数字签名

数字签名用来验证rpm包的来源合法性。刚刚谈到的rpm验证功能,他只能验证软件包里的文件与/var/lib/rpm/目录下的数据库文件而已,如果软件本身就有问题,那么使用刚刚的那种验证方式是不行的。因此,为了验证rpm包的来源合法性,我们的软件开发商都推出了自己的一个数字签名系统,软件开发商利用数字签名系统生产一个专属的签章,并将这个签章中的公钥释放出来。因此,在安装一个软件包时:

1、首先需要安装软件开发商提供的公钥文件

2、实际安装原厂软件包时,rpm指令会读取其rpm软件包中的签章信息,并与本机内的签章信息进行对比。

3、若签章相同则予以安装;不相同,则给出警告并停止安装。

 

在我们的redhat和centos系统上,有一个专门的数字签名系统GPG,他可以利用哈希算法生产独一无二的专属秘钥系统或数字签名系统。

 

rpm包的来源合法性验证过程如下:

1、将GPG公钥文件导入到系统中。

GPG公钥文件默认位于/etc/pki/rpm-gpg/目录下。

使用rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

 

2、查看密钥是否已安装

生成的密钥通常以pubkey作为软件包的名称,因此,可以使用如下命令来查看:

# rpm -qa | grep pubkey


 

3、查看密钥软件的相关信息

使用rpm -qi 软件包名

软件包的管理(RPM)_rpm安装  查询  卸载  升级  验_04

 

4、验证软件包的来源合法性和完整性的命令

rpm [-K|--checksig] [--nosignature] [--nodigest]  Package

dsa,gpg:使用哪种算法来验证来源合法性,选项--nosignature:不验证rpm包来源合法性。

sha1,md5:使用哪种算法来验证rpm包的完整性,选项--nodigest:不验证rpm包的完整性。