RPM即RPM Package Manager,RPM软件包管理器。原来是Red Hat Package Manager的缩写,现在相当于一个递归缩写。

      所谓程序包管理器,就是将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作。RPM算是众多程序包管理器中的一种,现在众多Linux的发行版本都有采用,可以算是行业的标准了。现将RPM包管理功能做详细解说。

  CentOS系统上rpm命令可对程序包进行:安装、升级、卸载、查询、校验和数据库维护等管理。

  命令格式:rpm [OPTIONS] [PACKAGE_FILE]

    GENERAL OPTIONS:

     -i,--install:程序包安装

     -U,--update,-F,--freshen:程序包升级

     -e,--erase:程序包卸载

     -q,--query:程序包查询

     -V,--verify:程序包校验

     --builddb,--initdb:数据库维护

    其它常用选项:

     -v,verbose:显示详细信息

     -vv:输出更详细信息

    以下将针对各选项分别说明:

    安装:

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

       [install-options]:

        -h:hash marks输出进度条;每个#表示2%的进度;

          这是一个很常用的选项,安装过程一般与i和v一同使用。

            rpm  -ivh  PACKAGE_FILE ...

        --test:测试安装,检查并报告依赖关系及冲突消息等;

        --nodeps:忽略依赖关系安装;

          但一般不建议使用,忽略依赖关系安装可能会导致程序包无法正常使用。

        --replacepkgs:重新安装;

          注意:如果因修改某配置文件而导致程序无法正常使用的话,重新安装后修改过的配置文件

        还将修改过后的状态,程序还是一样无法正常使用。此时需要删除修改过的配置文件,再执行

        重新安装后,配置文件恢复原来配置,程序可正常使用。

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

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

        --noscripts:不执行rpm所有自带的脚本;

          rpm自带的脚本有:            

            preinstall:安装过程开始之前运行的脚本,%pre;

            postinstall:安装过程完成之后运行的脚本,%post;

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

            postuninstall:卸载过程完成之后运行的脚本,%postun;

        所以:

        --nopre:不执行安装过程开始之前运行的脚本;

        --nopost:不执行安装过程完成之后运行的脚本;

        --nopreun:不执行卸载过程真正开始执行之前运行的脚本;

        --nopostun:不执行卸载过程完成之后运行的脚本;

      例如:查找并安装光盘镜像下zsh-5.0.2-14.el7.x86_64.rpm程序包,并不检测来源合法性。

        1、需先挂载光盘,此处将光盘挂载至/media/cdrom目录下。具体操作如下:

wKiom1btWAnwhoUxAAAhXh6uIew551.png

      挂载成功;

      2、查看光盘镜像下是否有zsh-5.0.2-14.el7.x86_64.rpm程序包,操作如下:

wKiom1btWQ-AljMPAAAQVoz5G6I326.png

      经查找在/media/cdrom/Packages目录下有此程序包。

      3、安装程序包,操作如下:

wKiom1btWfeA1uRmAAAfQq2pPTQ160.png

      安装成功!

    升级:

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

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

       -U和-F区别:

        -U:表示升级或安装,即当系统内有安装老版本包时,则升级;没有安装老版本包时

       直接安装新版本。

        -F:表示系统内有安装老版本程序包,直接升级安装。

     升级其实和安装一样,升级只是替换老版本的安装,所以升级常用选项和安装相同

     可表示为:        

       rpm  -Uvh PACKAGE_FILE ...

       rpm  -Fvh PACKAGE_FILE ...

     安装中[install-options]同样也可以用于升级中。

     升级中其它常用[install-options]:

       --oldpackage:降级安装;

        当现有系统不兼容新安装版本时可阶级安装老版本;

       --force:强制升级;

        当新版本对系统中其它程序的依赖关系不支持时,可选择强制升级,相当于忽略依赖关系并安装。

       但不建议强制升级,可能会影响系统内其它程序正常使用。

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

          (2)如果某原程序包的配置文件安装后曾被修改过,升级时新版本的程序提供的同一个配置文件

       不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;

     例如:在CentOS 7.1系统中,查看所安装zch版本,并将升级为zsh-5.0.2-14.el7.x86_64.rpm,

     操作如下:

       1、查看系统中zch版本:查看命令随后会介绍

wKioL1bt-R3Tl0QgAAANUEIJiaU307.png

         查看现系统安装zch版本为:zsh-5.0.2-7.el7.x86_64.rpm

       2、挂载光盘镜像并升级安装:

wKiom1bt-bfSnGqRAABeioEUxzg776.png

       成功升级为zsh-5.0.2-14.el7.x86_64.rpm

   卸载:

     格式:rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...

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

          因为Liunx程序包在系统内可以并在,此选项可卸载所有匹配名称程序包的版本;

        --nodeps:忽略依赖关系;

           别的程序包可能对将卸载程序包程序有依赖关系,将无法卸载,此选项可忽略依赖关系卸载,

        但可能会导致依赖它的程序无法正常使用,谨慎使用。

    --test:测试卸载,dry run模式;

        --noscripts:不执行rpm自带脚本,同安装选项;

      例如:卸载刚才所安装的zsh-5.0.2-14.el7.x86_64.rpm程序包。

wKioL1buAEbR_7k9AAApNabrhoA766.png

        卸载完成,注意:卸载时后跟的是包名,而非包的路径,上面的安装与升级是在包自己的目录下直接

     安装或升级的,所以直接跟包名了,请大家注意!

    查询:

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

       [select-options]挑选选项

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

        上面已简单用过,例如:上面卸载的演示

wKiom1buB_OCz_0wAAApNabrhoA363.png

        可对比包自裁前后查看结果;

        -a, --all:查询所有已经安装过的包;

          此命令和grep命令联合使用,可以快速查找你想要找的安装包;

          例如:查询所有安装过的有关bash的包:

wKiom1buCPjh6YB_AAAPlw5nWdg623.png

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

           例如:查询/etc/fstab文件由哪个程序包安装生成:

wKioL1buCiCBhL7JAAALgtAezP8857.png

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

           通常配合[query-options]对未安装的包进行查询;[query-options]下面会介绍;

           例如:查询zsh-5.0.2-14.el7.x86_64.rpm相关信息:

wKiom1buC0PR6MA4AACeJCoplyY709.png

          对比用rpm -qi 和 rpm -qpi命令区别;

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

          例如:查询bash特性由哪个程序包提供:

wKiom1buDAexqtWYAAANBI3eDDE626.png

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

          例如:查询bash特性被哪个包所依赖

wKiom1buDGeQ6bLMAAAieZeaJpY558.png

      [query-options]查询选项

       --changelog:查询rpm包的changlog;

        即查询rpm包自第一版到目前版本日志变更,不再详述;

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

        例如:查看安装bash所生成所有文件

wKiom1buDl7SPDNoAAAPm8qGDUk150.png

        由于文件太多,不一一列举,只截了几个;

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

        例如:查看bash包详细信息

wKiom1buDtqz-Qk7AABzWLLXMWY604.png

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

        例如:查询bash包提供的配置文件:

wKioL1buD7aj6sYHAAAL-SyXKF8398.png

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

        例如:查询bash提供的文档:

wKioL1buEvzyVeTWAAARgQZNpjA942.png

        由于文档过多,不一一列举,只截了几个;

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

        可以跟 --whatprovides 对比一下

        例如:列出bash所提供的特性:

wKioL1buE5OjsTvFAAASr8lf4v0556.png

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

        可以比较 --whatrequires 不同

        例如:查询bash包依赖关系:

wKioL1buFKeQzjSwAAAvbZ_HwdY631.png

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

        例如:查询bash包自事的脚本片段:

wKioL1buFRyRPsIkAABFpJ_Dlhk135.png

     rpm查询功能在工作中是很常用的,一定要掌握。

     常用方法:      

       -qi PACKAGE:查询程序包相关信息;

       -qf FILE:查询指定文件由哪个程序包生成;

       -qc PACKAGE:查询指定程序包提供的配置文件;

       -ql PACKAGE:查询指定程序包安装生成所有文件列表;

       -qd PACKAGE:查询指定程序包提供的文档:

       -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE:查询未安装程序包一些信息;

    校验:

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

       [select-options]选项与查询[select-options]选项相同不再详述;

       [verify-options]选项都是以--no开头,表示不验证某选项,默认情况全部验证,不再一一列举;

       验证后显示选项含义如下:

        S:表示包文件大小发生改变;

        M:表示包权限发生改变;

        5:表示包MD5码发生改变;

        D:表示包的主次设备号不匹配;

        L:表示readLink路径不匹配;

        U:表示包属主发生改变;

        G:表示包属组发生改变;

        T:表示包最后一次修改的时间戳发生改变;

        P:表示caPabilities发生改变;

wKiom1buJpPDVOrLAAAHTun_kqQ351.png

        无输出则是最好的输出,验证无问题。

     程序包的验证既要验证包来源的合法性又要验证包的数据完整性,验证需要用对方公钥来解密验证。

     获取信任的包制作者公钥:

       1、光盘镜像中存有包制作者公钥;

       2、/etc/pki/rpm-gpg/公钥名 目录下存有;

       3、信任网站获取;

     导入信任的包制作者公钥:

       对于CentOS发行版来说:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7,以CentOS7为例。

     验证方法:

       1、安装此组织签名的程序时,会自动执行验正;

       2、手动验正:rpm -K PACKAGE_FILE

wKiom1buJcTxycGkAAAdL20hsvQ201.png

    数据库重建:

      格式:

       rpm {--initdb|--rebuilddb} [--dbpath=DIRECTORY] [--root DIRECTORY]

        --initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;

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

     rpm管理器数据库路径:/var/lib/rpm/

        查询操作(安装、升级、卸载、查询、验证):通过此处的数据库进行;

     当rpm数据库损坏时需重建数据库;

      例如:在/tmp目录下建立临时rmp数据库,并重建:

wKioL1buLEzjZ8qNAAA1-BmNuRY293.png

     对比--initdb和--rebuilddbu效果的不同。

  至此,RPM包管理功能介绍完成,希望对学习Linux的小伙伴们有用,rpm在日后工作中常会用到,希望大家日后可多多交流。