软件包管理器的核心功能包括如下两个:

1、制作软件包,把二进制程序、库文件、配置文件、帮助文件等打包成一个文件;
2、实现安装、卸载、升级、查询、校验。
安装过软件包的人都知道,我们在安装软件包的时候,有些软件包彼此间是有依赖关系的,比方说:我安装软件包 X ,但安装 X 前必须先安装软件包 Y ,因为我需要 Y 提供的某些功能;安装软件包 Y ,又需要 Z ,因为 Y 又需要软件包 Z 提供的某些功能。最后我们安装软件包 X ,不得不安装软件包 Y Z 。最让人头疼的是几个软件包之间互相依赖。有些软件包管理器仅提示我们在安装该软件包的时候需要系统提供哪些功能,有什么样的依赖关系,假如系统上没有,则不会安装;而有些软件包管理器不仅提示我们在安装该软件包的时候需要系统提供哪些功能,还会告诉我们该软件包所依赖的软件包我们没有安装,自动为我们找到所依赖的软件包,然后一块安装。前者我们称其为后端工具,后者我们称其为前端工具。而前段工具依赖于后端工具。
今天介绍个大家的是一个后端软件包管理器,它就是 RPM rpm 包有二进制格式和源码格式两种。 rpm 可以实现安装、查询、卸载、升级、校验、数据库的重建以及校验数据包等工作。 它是 Redhat 推进并最终成为 linux 发行版标准的一个软件包管理工具。下面主要介绍下 rpm 的各个命令。
在介绍 rpm 之前,先来认识下各软件包包的组成部分及命名吧。
软件包包括主包和子包,包名格式如下:
name-version-release.arch.rpm
bind-major.minor.release-release.arch.rpm
各字段的含义为:主包名,版本号,发行版本号,运行平台,以及软件包的后缀 .rpm
有些软件包还有主版本号,次版本号,发行号等。其中,各版本号意义如下:
主版本号:重大改进
次版本号:某个子功能发生重大变化
发行号:修正部分 bug ,调整了一点功能
下面按 rpm 的为我们提供的各个工作来介绍 rpm 的各个命令。
 
1、安装
# rpm -i :表示安装软件包,其使用格式为: # rpm -i /PATH/TO/PACKAGE_FILE
     -h :以 # 显示进度,每个 # 表示 2%
     -v :显示详细过程
     -vv :更详细的过程
上边的几个选项还可以同时使用,格式为: # rpm -ivh /PATH/TO/PACKAGE_FILE
同时 rpm 还提供其他多余选项,比如:
--nodeps :表示忽略依赖关系
--replacepkgs :表示重新安装,替换原有安装
--force :强行安装,可以实现重装或降级
如:安装 zsh-4.2.6-6.el5.i386.rpm 软件包,并显示进度及详细过程。
安装命令及执行结果为:
   
   
   
   
  1. # rpm -ivh zsh-4.2.6-6.el5.i386.rpm 

假如我想重新安装该软件包怎么办呢?我们可以使用 --replacepkgs 选项,该命令及执行结果如下所示:
   
   
   
   
  1. # rpm -ivh --replacepkgs zsh-4.2.6-6.el5.i386.rpm 

我想安装软件包 php-mysql-5.1.6-32.el5.i386.rpm ,但进行到一半发现有依赖关系,无法安装,怎么办?可以使用 --nodeps 选项,忽略其依赖关系。但即使安装了该软件包我们也无法使用,因为它所依赖的某些软件包你没有安装。我们先来看看忽略依赖关系如何安装软件包吧。没有忽略依赖关系及忽略依赖关系的命令及执行结果如下所示:
   
   
   
   
  1. # rpm -ivh php-mysql-5.1.6-32.el5.i386.rpm 
  2. # rpm -ivh --nodeps php-mysql-5.1.6-32.el5.i386.rpm 

软件包管理器中RPM的使用_第1张图片

从上图我们也已看到,当我们没有忽略依赖关系时,是安装失败的,系统会提示我们安装该软件包之前需系统提供哪些功能、哪些库文件,但并没有告诉我们改库文件是由哪个软件包提供的;当我们忽略依赖关系时安装才可以正常进行,并安装成功,但因我们没有安装该软件包所需要的库文件,所以我们无法使用该软件包提供的功能。
 
 
2、查询

# rpm -q:表示查询指定的包是否已经安装,其格式为:# rpm -q PACKAGE_FILE

如:我们去看一下 zsh-4.2.6-6.el5.i386.rpm 软件包是否应安装。命令及执行结果如下所示:
   
   
   
   
  1. # rpm -q zsh 

可以看到,假如我们查询的软件包已经安装,会显示所安装的软件包。假如查询的软件包我们没有安装,系统会提示我们该软件包没有安装。我们在来看一下下面这个命令和执行结果:
   
   
   
   
  1. # rpm -q zsh-html 

rpm 提供的查询功能中,还有许多其他的选项我们可以一起使用,如:

# rpm -qa:表示查询已经安装的所有包,其使用格式为:rpm -qi PACKAGE_NAME

# rpm -qi:表示查询指定包的说明信息,其使用格式为# rpm -qi PACKAGE_NAME

#rpm -ql :表示查询指定包安装后生成的文件列表, 其使用格式为 rpm -ql PACKAGE_NAME

# rpm -qc:表示查询指定包安装的配置文件,其使用格式为# rpm -qc PACKAGE_NAME

# rpm -qd:表示查询指定包安装的帮助文件,其使用格式为# rpm -qd PACKAGE_NAME

# rpm -qf:表示查询指定的文件是由哪个rpm包安装生成的,其使用格式为# rpm -qf /path/to/somenfile

# rpm -q --scripts :表示查询指定包中包含的脚本, 其使用格式为 # rpm -q --scripts PACKAGE_NAME
下面就通过各个实例,来看一下以上各命令的执行效果吧。如:我们查询下 zsh-4.2.6-6.el5.i386.rpm 包的说明信息。命令及执行结果如下所示:
   
   
   
   
  1. # rpm -qi zsh 

软件包管理器中RPM的使用_第2张图片

查询下 zsh-4.2.6-6.el5.i386.rpm 包安装后生成的文件列表,可能会有很多文件列表,我们只截部分看下效果,命令及执行结果如下所示:
   
   
   
   
  1. # rpm -ql zsh 

软件包管理器中RPM的使用_第3张图片

查询下 zsh-4.2.6-6.el5.i386.rpm 包安装后的配置文件,命令及执行结果如下所示:
   
   
   
   
  1. # rpm -qc zsh 

软件包管理器中RPM的使用_第4张图片

我们再去看一下该包的帮助文件,命令及执行结果如下所示:
   
   
   
   
  1. # rpm -qd zsh 

软件包管理器中RPM的使用_第5张图片

查询下 /usr/share/zsh 是由哪个 rpm 包安装生成的,命令及执行结果如下所示:
   
   
   
   
  1. # rpm -qf /usr/share/zsh 

查询下 zsh-4.2.6-6.el5.rpm 包所包含的脚本,命令及执行结果如下所示:
   
   
   
   
  1. # rpm -q -scripts zsh 

软件包管理器中RPM的使用_第6张图片

有时候我们会有这样的需要,某个 rpm 包我没有安装,但我想查询下该包的说明信息,以及安装以后会生成的文件,该怎么办呢?我们可以使用如下命令:

# rpm -qpi:表示查询安装包信息,使用格式为:# rmp -qpi /PATH/TO/PACKAGE_FILE

# rpm -qpl:表示查询安装后会生成哪些文件,使用格式为:# rmp -qpl /PATH/TO/PACKAGE_FILE;其中i表示软件包的信息,l表示文件列表。

如:在未安装 php-mysql-5.1.6-32.el5.i386.rpm 包的情况下,查询其说明信息及安装后的文件列表,命令及执行结果如下所示:
   
   
   
   
  1. # rpm -qpi php-mysql-5.1.6-32.el5.i386.rpm 
  2. # rpm -qpl php-mysql-5.1.6-32.el5.i386.rpm 

软件包管理器中RPM的使用_第7张图片

 
3、升级

# rpm -Uvh:表示如果装有老版本的,则升级,否则,则安装,使用格式为:# rpm -Uvh /PATH/TO/NEW_PACKAGE_FILE

# rpm -Fvh:表示如果有老版本的,则升级,否则,退出,使用格式为:# rpm -Fvh /PATH/TO/NEW_PACKAGE_FILE

# rpm -Uvh --oldpackage:降级,使用格式为:# rpm -Fvh --oldpackage /PATH/TO/NEW_PACKAGE_FILE

如:我们先看下有没有安装 nano-1.3.12-1.1.i386.rpm 包,如果有则升级,否则安装。命令如下:
   
   
   
   
  1. # rpm -Uvh rpm nano-1.3.12-1.1.1.gls.i386.rpm 

软件包管理器中RPM的使用_第8张图片

从上图我们可以看到,当已安装过该低版本的软件包后,如果直接安装高版本的软件包,系统提示错误,不让安装,我们固然可以使用 --flush 命令强行安装,但这样就无法使用了,所以必须使用升级安装,使用升级安装,可以安装成功,并可以正常使用。
我们刚安装过 nano-1.3.12-1.1.1.gls.i386.rpm 包,现在我们把该软件包卸载,然后看一下下边这个命令的执行效果。命令及执行结果如下:
   
   
   
   
  1. # rpm -Fvh nano-1.3.12-1.1.1.gls.i386.rpm 
当我们升级过之后,发现新的软件包不稳定,功能还没有原软件包全面,这时候我们就需要降级了。这里只指出代码,不在给出截图,命令如下:
   
   
   
   
  1. # rpm -Uvh --oldpackage nano-1.3.12-1.1.i386.rpm 

 

4、卸载

# rpm -e :表示卸载,使用格式为: # rpm -e PACKAGE-NAME
其中 --nodeps 表示忽略依赖关系
如:我们去卸载 zsh-4.2.6-6.el5.rpm 包,命令及执行结果如下所示:
   
   
   
   
  1. # rpm -e zsh 
可以看到,当我们把指定的软件包删除后,在用 # rpm -q zsh-4.2.6-6.el5.rpm 命令,显示该软件包没有安装。我们再去卸载一个有依赖关系软件包,看效果如何。命令如下:
   
   
   
   
  1. # rpm -e --nodeps php-common 

软件包管理器中RPM的使用_第9张图片

从上图可以看到,当我们直接卸载有依赖关系的软件包(即该软件包被其它软件包依赖)时,系统提示我们无法卸载,要想卸载就必须忽略其依赖关系。
 
5、校验
# rpm -V :校验,使用格式为: # rpm -V PACKAGE_NAME
假如我们删除了其中的某个文件,校验时会显示该文件丢失;假如修改过校验包里的某个文件,则会显示八个字符组合而成的字段,各字段含义如下:

S file Size differs:文件大小不同

M Mode differs (includes permissions and file type):模式不同(包括权限和文件大小)

5 MD5 sum differs MD5 校验码不对

D Device major/minor number mismatch:设备主次设备号不匹配

L readLink(2) path mismatchreadlinkl路径不匹配

U User ownership differs:用户拥有不匹配

G Group ownership differs:组拥有不匹配

T mTime differs :最近一次的修改时间不同
如:校验下 zsh 软件包。命令及执行结果如下所示:
   
   
   
   
  1. # rpm -V zsh 
在校验前需先用-q命令看一下是否安装。有些人可能会问,为什么要先看一下该软件包有没有安装呢?因为假如我们没有安装该软件包,是无法校验的,在看下面的这个命令,你一看就明白了。假如我们现在去校验下 zsh-html 这个软件包,同样,在校验前确保其没有安装。命令及执行结果如下:
   
   
   
   
  1. # rpm -q zsh-html 
  2. # rpm -V zsh-html 
软件包管理器中RPM的使用_第10张图片
好,现在我们去删除 zsh 安装软件包列表中的一个文件,并修改某个文件的内容,再来校验下该软件包,看下效果如何。命令同上,我们只看修改后的执行结果,如下所示:

软件包管理器中RPM的使用_第11张图片

从上图可以看到,当我们删除了某个文件,并修改了另一个文件的某些内容,校验时,提示我们,有个文件丢失,另一个文件文件大小不同、 MD5 校验码不同、最近一次的修改时间不同。
 
6、重建数据库

# rpm --rebuilddb:重建数据库,一定会重新建立

# rpm --initdb:初始化数据库,没有才建立,有就不用建立

第一个命令因为一定会重新建立数据库,所以执行起来时间会比较长,而第二个如果已有数据库,则不会执行,否则也会执行,同样执行起来时间会比较长,因为是整个系统数据库。这里不再给出截图,有兴趣的话可以自行执行该命令。
 
7、检验来源合法性及软件包完整性
要说清楚这个问题比较麻烦,先扯点其他知识。我们知道在制作 rpm 包的时候我们都会对其进行加密,现在常用的加密的类型有对称加密、公钥加密和单向加密三种。对称加密:加密时使用同一个密钥;公钥加密:使用一对儿密钥,公钥和私钥,公钥隐含于私钥中,可以提取出来,并公布出去;单向加密:使用其加密时会产生 128 位的 MD5 码。
在制作 rpm 包时,会在 rpm 包后加入冗余信息,先用单向加密方式加密该 rpm 包并提取出 MD5 码,然后用公钥加密方式中自己的私钥对该 MD5 码加密并放在 rpm 中。当我们校验其合法性时,假如我们合法拥有其密钥,然后用同样的加密方式对该 rpm 包加密,并与我们解密出来的 MD5 码比较,看是否相同,相同则合法,否则不合法。 Redhat 自己制作并发行的 rpm 包,各公钥会随其提供的光盘一块提供。当我们安装完后, Redhat 会在 /etc/pki/rpm-gpg/ 文件中提供公钥,当我们需要验证某个 rpm 包的来源合法性时,只需将公钥导入即可。
下面介绍导入密钥和校验合法性来源及软件完整性的命令。

# rpm --import:导入密钥文件

# rpm -K :校验来源合法性,使用格式为: # rpm -K /PATH/TO/PACKAGE_FILE
因为之前已导入过密钥文件,这里不再执行给出截图,仅把执行命令告诉各位:
   
   
   
   
  1. # rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release 
接下来我们来验证下 php-mysql-5.1.6-32.el5.i386.rpm 包的来源合法性及软件包完整性。命令及执行结果如下所示:
   
   
   
   
  1. # rpm -K php-mysql-5.1.6-32.el5.i386.rpm 

软件包管理器中RPM的使用_第12张图片

上边各字段的含义如下:
dsa,gpg :验证来源合法性,也即验证签名:可以使用 --nosignature ,略过此项
sha1,md5 :验证软件包完整性:可以使用 --nodigest ,略过此项
这里不再给出略过某一项的截图,有兴趣的可以自己验证下。
 
至此,我们从 rpm 为我们提供的各个工作,即从安装,一直到如何校验来源合法性及软件完整性,都已介绍完毕,相信各位对 rpm 这个软件包管理器已经有所了解,不妨现在就动手去尝试一下吧。该博客还会持续更新软件包管理器中一个比 rpm 更好用的前段管理工具 yum ,敬请关注。
 
See you later!!!