rpm为CentOS中的默认程序包管理器,以下对rpm如何对rpm包的程序安装,升级,卸载,查询,校验以及其依赖的数据库的维护做出比较详细的说明:

    做为示例的安装包,我选择了从centos7.1的iso镜像中的zsh-5.0.2-7.el7.x86_64.rpm,和centos7.2镜像中的zsh-5.0.2-14.el7.x86_64.rpm。

    一、rpm命令安装程序包:

        命令格式:

            rpm {-i|--install} [install-options] PACKAGE_FILE ...

        常用的方法:

            rpm -ivh PACKAGE_FILE ...

            如:rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm

wKiom1Z-HdCBn33KAADQ9qTVsZw825.jpg

                rpm -ivvh zsh-5.0.2.el7.x86_64.rpmwKiom1Z-HmPzLhp_AAOKDNRRTSg352.jpg

            注意:此图只为部分截图,因为只拿zsh的rpm包做示例,所以此图为现将执行-ivh选项安装后的包卸载后重新用-ivvh命令安装

            参数解释:

                -i或--install:安装

                -v:为通用选项,此处为显示安装rpm包时的详细信息;

                -vv:也为通用选项,由上边两个图也可以看出,显示出的信息更为详细;

                -h:此选项为输出进度条,每个#表示2%的进度,共50个#;

                --test:测试安装,检查并报告依赖关系及冲突消息,由下图可以看出,此参数只是测试不会实际安装rpm包;

wKioL1Z-Hsaj5jHAAAChRq8fDA0033.jpg

                --nodeps:忽略依赖关系安装,不建议加此选项安装,如果程序所依赖的关系为程序运行必要的文件,则将导致rpm包成功安装也无法正常运行;

                --replacepkgs:重新安装;

wKiom1Z-Huizx6_pAADwiPP5CHk754.jpg

                --nosignature:不检查包签名信息,不检查来源合法性;

                --nodigest:不检查包完整性信息;

二、rpm命令更新升级程序包:

       命令格式:rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

                        rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

        常使用的方法:

                    rpm  -Uvh PACKAGE_FILE ...

                如:rpm -Uvh zsh-5.0.2-14.el7.x86_64.rpmwKioL1Z-H0TBpSbAAAEaUFiv_rQ322.jpg

                我们将刚安装的zsh卸载后使用-F选项再进行安装升级

                    rpm -Fvh  PACKAGE_FILE ...

                如:rpm -Fvh zsh-5.0.2-7.el7.x86_64.rpm

    wKiom1Z-H1KBmue2AACF6wYgQRo043.jpg

                可以看到使用-F选项对于未安装的rpm包只是输出rpm包的头跟密钥信息,并未安装rpm,此时使用-U选项:

wKioL1Z-H5GhE6iQAADncYTYaYI556.jpg

                使用-U选项后对于没有安装的rpm包进行了安装,安装后使用-F选项:

wKiom1Z-H6HgoXYHAAEVr8tDotU707.jpg

                可以看到对于已安装的rpm包,使用-F选项对其进行了升级

        由此,我们可以总结出,-U选项可以对rpm程序包进行安装或升级,而-F选项只可以用来升级已安装过的程序。

        其他选项:

wKioL1Z-H9LxI6q2AAF6CGKREUQ381.jpg

            由上可以看出-U选项后跟--oldpackage可以对当前已经安装的高版本的rpm程序包进行降级安装为低版本的程序

            我们还可以使用--force选项对程序进行强制升级,由下可以看出,也是在-U选项前提下生效

wKiom1Z-H9LQl62oAAH2QhVJUWU751.jpg

            注意:(1) 不要对内核做升级操作,Linux支持多内核版本并存,因此,直接安装新版本内核;

                        (2) 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供

三、rpm命令卸载程序包:

        命令格式:rpm -e [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...

        常用方法:rpm -e PACKAGE_NAME ...

                如:rpm -e zsh            

                    注意:此处为rpm程序的名字,而不是rpm包文件;

        spacer.gifwKiom1Z-ICHBVqB_AACwvu70w2E851.jpg

        选项说明:

                --allmatches:卸载所匹配指定名称程序的包的各版本;

                --nodeps:忽略依赖关系;

                --test:测试卸载,并没有真正卸载;

        spacer.gifwKioL1Z-IFfwRMtcAAB9RonwSGI430.jpg

四、rpm命令查询程序包:

        命令格式:rpm {-q|--query} [select-options] [query-options]

        rpm命令的查询功能比较常用,所以对其做出比较详细的说明

        [select-options]选项常用参数说明:

            )PACKAGE_NAME:查询指定的程序包是否已经安装,显示其版本;

            spacer.gifwKioL1Z-IGyCbNtfAABTYVWw5lM135.jpg

            )-a,--all:查询所有已经安装过的包,以下只为部分截图;

            spacer.gifwKioL1Z-IHjyjNn_AAGtKY4H7GQ330.jpg

            ) -f FILE:查询指定的文件由哪个程序包安装生成;

            spacer.gifwKioL1Z-IKPQAtOIAABTRvp2cj4237.jpg

            )-p,--package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;

wKioL1Z-IMKwxfcgAAC4zRcuow4070.jpg

            )--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;

            )--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;

         [query-options]选项常用参数说明:

            )--changelog:查询rpm包的changelog;

wKioL1Z-INyy-shIAAHapUZMYpk024.jpg

            )-l,--list:程序安装生成的所有文件列表;

            spacer.gifwKiom1Z-IPKirmkqAAGKRcVcUcw357.jpg

            )-i,--info:程序包相关的信息,版本号,大小,所属的包组等;

            spacer.gifwKioL1Z-ISCBtUOAAAKTcXj7qms324.jpg

            )-c,--configfiles:查询指定程序包提供的配置文件;

            spacer.gifwKiom1Z-IRnw5_woAACD8K3eexU987.jpg

            )-d,--docfiles:查询指定的程序包提供的文档;

wKiom1Z-ITTBoXZXAAG5LPKkRvU521.jpg

            )--provides:列出指定的程序包提供的所有的CAPABILITY;

            spacer.gifwKiom1Z-IU3hr39HAACBBd0uLaI857.jpg

            )-R,--requires:查询指定的程序包的依赖关系;

            spacer.gifwKiom1Z-IWbBrGelAAD_RTiBEUc713.jpg

            )--scripts:查看程序包自带的脚本片段;

wKiom1Z-IZHRDwvdAAImmNSNVcY709.jpg

            注意:rpm可以自带脚本;

                        四类:

                            preinstall:安装过程开始之前运行的脚本

                            postinstall:安装过程完成之后运行的脚本

                            preuninstall:卸载过程真正开始执行之前运行的脚本

                            postuninstall:卸载过程完成之后运行的脚本

五、rpm命令校验:

        命令格式:rpm {-V|--verify} [select-options] [verify-options]

        常用方法:

                rpm -V PACKAGE_NAME ...

        如:我们对安装的zsh的配置文件/etc/zshrc文件的第五行加入一个注释的#,保存退出,然后执行:

                rpm -V zsh

wKiom1Z-Ib6RUGUtAABwas5CguE745.jpg

                从S.5....T.可以看出这个文件跟rpm包中的文件的差别;

                下边对各项差别的意义做出解释:

                S file Size differs:文件大小不同

                M Mode differs (includes permissions and file type):权限不同

                5 digest (formerly MD5 sum) differs:MD5值不同

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

                L readLink(2) path mismatch :符号连接路径不同

                U User ownership differs:属主不同

                G Group ownership differs:属组不同

                T mTime differs:文件元数据被改动的时间变更

                P caPabilities differ:能力不同

六、rpm包来源合法性和完整性验证:

        出于对rpm包安全性的考虑,我们需要对rpm包的来源合法性和完整性进行验证,一般情况下,rpm包的制作者会将程序打包后用通用单向加密算法得出一个定长的特征码,再将这个特征码用他的私钥进行加密,然后将加密后的数据连同封装好的rpm包一同发布,下载者下载rpm包后利用制作者公布在互联网的公钥对rpm包进行进行解密,解密后的数据与其提供相同,则说明来源合法,然后用与制作者相同的方法对rpm包进行提取特征码,如与制作者提供的数据相同,则说明其完整性验证通过,包内容未曾被篡改过。

        rpm验证方法主要有两种:

        (1)安装rpm包制作者签名的程序时,自动验证;

        (2)手动验证:rpm -K PACKAGE_FILE;

        spacer.gifwKioL1Z-Ieqh0m26AAB3eD4T6jE537.jpg

        spacer.gifwKiom1Z-Id6Q2j32AADa8Yfn2uk699.jpg

        由上两图可以看出rpm包都没有进行验证,手动导入CentOS官方的发行版密钥

        rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7,可以看到验证都变为确定:

        spacer.gifwKioL1Z-IhrA0VIDAAFV9Lv1sac435.jpg

七、rpm包管理器数据库:

        rpm包管理器的数据库路径为/var/lib/rpm/,rpm命令的所有查询操作都是基于此处的数据库进行的。

        命令格式:

                centos6中为:rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]        需要man rpm

                centos7中为:rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY   需要man rpmdb

        参数说明:

                --initdb:此为初始化数据库参数,当前无任何数据库可初始化创建一个新的,当前已存在数据库是不做任何操作;

                --rebuildb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;

        注意,该项操作不到必需时不要随意操作,容易造成不必要的麻烦。