rpm包管理功能全解

 

前言:

程序包管理器功能:

将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作;

                           

           1、程序包的组成清单(每个程序包都单独实现)

                                文件清单

          安装或卸载时运行的脚本

                    2、数据库(公共)

                 程序包的名称和版本;

                 依赖关系;

                 功能说明;

             安装生成的各文件的文件路径及校验码信息;

             等等等..

                                    

           rpm包的数据库存放在/var/lib/rpm/CentOS中存储rpm包数据库的路径)如图:

  

 wKioL1Z6DWmS3jykAAAdAU36Pxc365.png

获取程序报包的各种途径:                           

                 (1)系统发行版的光盘或官方的文件服务器(或镜像站点):

                   http://mirrors.aliyun.com,

                   http://mirrors.sohu.com,

                   http://mirrors.163.com

                     ……..

                 (2)特定项目的官方站点

                    httpd.apache.org

                    www.zabbix.com

                 (3)第三方组织:

                        (a)  EPEL

                        (b)搜索引擎

                            http://pkgs.org

                            http://rpmfind.net

                            http://rpm.pbone.net

                 (4)自己动手制作       

                  

                 防止程序包有后门建议:检查其合法性

                       来源合法性;

                       程序包的完整性;

 

 



————rpm命令管理程序包的基本功能


     安装,卸载,查询,升级,校验,数据库维护。

 

 

    rpm命令:rpm [options] [package_file]

 

                                   [OPTIONS]:

                 安装:-I --install

                 升级:-U, --UPDATE, -F,--freshen

                 卸载:-e--erase

                 查询:-q--query

                 校验:-V --verify

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




安装

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

           GENERAL OPTIONS(通用选项):

-vverbose,详细信息

               -vv:更详细的输出

   [install-options](安装选项)

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

通常使用:rpm  -ivh  PACKAGE_FILE ...  如图:wKiom1Z6EXzAC0u7AAAeP2Ay4L4624.png      

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

                --nodeps:忽略依赖关系;不建议;(使用此选项虽然可以安装该程序包,但并不一定会运行,因为并没有安装有依赖的安装包。)

                                                       --replacepkgs:重新安装  如图:

  wKiom1Z6EamyP2aPAAAenesnnEs855.png

           

                  注:rpm包可以自带四类脚本

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

  2.              postinstall:安装过程完成后安装的脚本,%post

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

  4.              postuninstall:卸载过程完成之后执行的脚本,%postun

  •                     --noscripts:都不执行

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

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

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

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

   

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

不使用会有警告提示没有秘钥 如图:

wKiom1Z6EgKTR3QPAAALYcQtQiM893.png

使用后将不会检查签名信息,如图:

wKioL1Z6EjOhkxZbAAAVG5Obqk8121.png

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



升级

                   rpm {-U|--upgrade} [install-options] PACKAGE_FILE 

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

-U:升级或安装;(没有老版本直接安装)

       -F:只升级          

 rpm -Uvh PACKAGE_FILE ... rpm  -Fvh PACKAGE_FILE ..

       --oldpackages:降级                                                --force:强制升级(升级后可能会影响依赖关系);

                      zsh进行升级会显示升级版本和清除的版本,如图

wKiom1Z6EvqCfQbNAAAd6tXcQUg754.png



注意:

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

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


卸载

    rpm {-e|--erase}[--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME

                     (注:卸载时指定的是包名)

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

             --nodeps:忽略依赖关系

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

                                 卸载我们刚装的zsh只需指定安装包名称,不需要路径,如图

           wKioL1Z6E4vRAnmgAAAVL0j18So466.png


查询

     rpm {-q|--query}[select-options] [query-options]  

         [select-options]

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

  没有安装如图:

wKiom1Z6E8OTUqPhAAAIZ9X2N3w373.png

    安装过如图:

 wKiom1Z6E9Ww1xhVAAAIa6BXpbU017.png

            -a, --all:查询所有已经安装过的包:(通常后面跟上正则表达式查询

             如图:

          wKioL1Z6FBiShqr9AAAJdosF28M183.png

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

          查询/etc/issue文件是由那个安装包生成的,如图:

          wKiom1Z6FCyQKZwJAAAKtVFBN4w159.png               

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

      如图:wKiom1Z6FF3Q_cbZAAAZH5CsCXo195.png                    

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

              查询zsh是有那个程序包提供 如图: 

           wKioL1Z6FJqhBpK6AAALzDZSDt0690.png  

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

               查询bash由那些安装包依赖:如图

          wKioL1Z6FLnBEqCTAAAiV5Frzbo647.png      

       [query-options]

          --changelog:查询rpm包的changelog

               查询dashchangelog  如图:

wKioL1Z6FTmx5X7sAACIJHdEC7U896.png

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

            查询dash安装生成的所有文件列表,如图

        wKiom1Z6FUmjnFJgAAAMWh-ogII279.png 

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

           查询zsh程序包相关的信息版本号、大小、所属包租的信息  如图

wKioL1Z6FX2RQ9lrAABttZ81Svo167.png

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

              查询zsh程序包提供的配置文件,如图:

wKioL1Z6FZbybhXRAAAXTRFv6UA110.png

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

              查询zsh程序包提供的文档:如图

wKioL1Z6Fa_wTQCxAACXwPcjUcA672.png

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

           查询bash程序包提供的capability:如图

          wKiom1Z6FbSSHaVyAAAPy3_IotU995.png

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

            查询bash程序包的依赖关系:如图

     wKiom1Z6FdLyhNyMAABRhcZS8TE260.png

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

              查询bash程序包的脚本片段:如图

     wKiom1Z6Fe_yJTcaAAAu2APOwIw488.png 



查询用法总结:

    -qi PACKAGE(查询安装包信息) -qf FILE(查询指定的文件由那个安装包组成), -qc PACKAGE(查询指定的安装包的配置文件),-ql PACKAGE(查询指定的安装包生成的所有文件),-qd PACKAGE(查询指定的安装包提供的文档)

    -qpi PACKAGE_FILE(查询未安装的程序包的信息), -qpl PACKAGE_FILE(查询未安装的程序包可以生成的所有文件), -qpc PACKAGE_FILE,(查询未安装的程序包的配置文件). -qpd PACKAGE(查询未安装程序包提供的文档)



校验

校验程序包安装完之后有没有被更改过

rpm {-V|--verify} [select-options][verify-options]  

如果安装完成之后没有做出过更改则不会提示信息,当我更改zsh了生成的列表里面随意的一个文件之后再做出校验系统就会有所提示,如图:

wKioL1Z6Fn_jmjHsAAALhQJ-IA0393.png

 

左边的提示符显示的信息:每个字符表示一种属性,所表示的意义如下

S  file Sizediffers:大小

       M Mode differs (includes permissions andfile type):权限

       5 digest (formerly MD5 sum) differs:完整性内容

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

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

       U User ownership differs:属主更改

       G Group ownership differs:属组更改

       T mTime differs:最近的时间戳更改

       P  caPabilitiesdiffer:某些性能被更改

如图:wKiom1Z6FqGhN6MPAAABmMgkt6M441.png,S表示大小被改变,5表示数据指纹信息md5被更改,T表示时间戳被更改。


   同时也可以选择那些属性不查询

        [verify-options]              

        --nodeps:不校验依赖关系

        --nofiles:不检查文件

       --nodigest:不检查包完整性

       --noscripts:不检查脚本信息

       --nosignature:不检查签名信息      

       --nolinkto:不检查resdlink的路径是否匹配

                --nofiledigest (formerly --nomd5):不检查文件的完整性信息      

           --nosize:不检查大小的改变

           --nouser:不检查属主的变化

           --nogroup:不检查属组  

           --nomtime:不检查时间戳的改变

           --nomode;不检查权限的改变          

           --nordev不检查相应的文件属性

                                     

程序包来源合法性验证:

数字签名:

第一步:制作者进行单向加密定长输出包的特征码

第二步,再利用私钥加密特征码附加到程序包后面,附加到程序包后的加密过的特征码就是数                           字签名,用户拿到程序后利用公钥解密私钥验证来源是否合法。

 

            完整性验证:

                                用户用公钥解密后得到特征码进行比较验证该包的完整性。

            互联网通过CA获得公钥


CentOS发行版中程序包的公钥存放在/etc/pki/rpm-grp/RPM-GPG-KEY-CentOS-#

导入公钥:rpm  --import  /etc/pki/rpm-grp/RPM-GPG-KEY-CentOS-#

导入之后安装程序包时就不会出现警告NOKEY的信息:如图

   wKioL1Z6Fznz3vBGAAAJw-jpYU0546.png

   wKiom1Z6Fz3CRVg1AAAU3Ok_aXo199.png

验证:程序包安装时会自动验证。

如果要手动验证:rpm –K PACKAGE_FILE

如图

wKioL1Z6F2LzmZQfAAARX5hItRg984.png



rpm数据库/var/lib/rpm,rpm包安装后生成的所有信息都放在这里

 查询操作就是通过此处的数据库进行的。

所以数据库的完整性就非常重要

 

获取使用帮助:

         CentOS 6man rpm

         CentOS 7man rpmdb

 

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

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

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

 

总结:安装程序包在linux系统中有着至关重要的作用,其中的查询机制更是在各种环境中经常用到,所   以熟练掌握安装程序命令和查询命令是非常有必要的,需要不断的操作积累经验来增强记忆。