RPM包管理器最早是由Red Hat公司研发的一款Linux上的程序包管理器,文件包的后缀名为“.rpm”。目前是GNU/Linux下软件包资源最丰富的软件包类型之一。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

rpm包命名格式

name-VERSION-release.arch.rpm      

包的名字-版本号-发行号.架构平台.rpm


VERSION:major.minor.release 源码包的主版本号、次版本号、发行号

注意:rpm包事实上是将源代码编译制作成二进制格式的文件并打包成的rpm包,所以这里的VERSION是指的源代码的版本号


release:这里的release才是rpm包本身的发行号


archetecture:i386, x64(amd64), powerpc... 

适用于的操作系统平台,也有noarch适合于全平台的,这是因为有些程序是运行在例如Java虚拟机中的,所以无论底层操作系统是什么平台都适用


例如redis-3.0.2-2.e17.i686.rpm表示适用于redhat7的第二次制作的32位的rpm包


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

rpm包的拆包

    一般rpm包都可以拆分为:主包和支包包是将服务程序运行起来的核心包,支包是可以提供更多功能的包。拆包可以实现对rpm包按需安装

主包:name-VERSION-release.arch.rpm  主包跟程序包的命名格式相同

支包:name-function-VERSION-release.arch.rpm 

         function:devel(开发功能), utils(工具程序), libs(库文件), ...


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


依赖关系

包和包之间存在依赖关系,例如安装X包时需要安装X包依赖的Y包,利用程序包管理器前端工具(例如yum)可以实现在安装rpm包时自动安装所需要的依赖包。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


获取程序包的途径

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

    http://mirrors.aliyun.com, 

    http://mirrors.sohu.com,

    http://mirrors.163.com 

(2) 项目的官方站点

(3) 第三方组织:

    (a) EPEL

    (b) 搜索引擎

        http://pkgs.org

        http://rpmfind.net 

        http://rpm.pbone.net 

(4) 自己制作rpm包

建议:安装rpm包时应检查其来源合法性和程序包的完整性;


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


CentOS系统上rpm命令管理程序包

    安装、升级、卸载、查询和校验、数据库维护

rpm命令:rpm  [OPTIONS]  [PACKAGE_FILE]

    安装:-i, --install

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

    卸载:-e, --erase 清除

    查询:-q, --query

    校验:-V, --verify

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


    GENERAL OPTIONS:通用选项

        -v:verbose,详细信息

        -vv:更详细的过程输出信息


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


1、rpm包的安装


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


常用选项

rpm  -ivh  PACKAGE_FILE ...


[install-options]

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

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

--nodeps:忽略依赖关系;不建议;

--replacepkgs:重新安装,注意包的配置文件如果更改了,重新安装时并不会替换已更改的配置文件,所以如果包的配置文件更改了最好将其删除后重新安装

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

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


注意:rpm可以自带脚本; --noscripts 可以不执行所有脚本

脚本分为四类,在不同时刻被触发运行:

preinstall:安装过程开始之前运行的脚本,%pre , 不执行安装--nopre

postinstall:安装过程完成之后运行的脚本,%post , 不执行--nopost

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

postuninstall:卸载过程完成之后运行的脚本,%postun , 不执行--nopostun


例如

1、安装光盘中的zsh程序包,显示详细进度,注意安装rpm包时要输入包的全名

wKiom1Z7Na_w__xIAAAlY29uHZY398.png


2、安装zlib包,显示更加详细的安装进度信息

wKiom1Z7NcGD3WPqAAA0dgEH1tI420.png


3、测试安装php的common包,会显示需要需要依赖的包

wKioL1Z7Nevy0LINAAAoFpl9xnU136.png


4、安装php的common包,忽略依赖关系

wKioL1Z7NgORh7L7AAApjRRqrak022.png


5、重新安装zsh包

wKiom1Z7NgCQ-CqcAAAmKPtKcnM628.png


6、重新安装zsh包,不检查包的来源合法性,注意安装过程就不会显示警告信息了

wKiom1Z7Ng3Sp2OcAAAZ226vFEU272.png



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


2、rpm包的升级


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

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

升级rpm包时同样可以使用安装时的通用选项,例如忽略依赖关系,测试升级等等

-U:升级或安装;没有老版本就会安装

-F:升级;只能升级,如果没有老版本将不会安装

--oldpackage:降级;

--force:强制升级;


常用选项

rpm  -Uvh PACKAGE_FILE ...

rpm  -Fvh PACKAGE_FILE ...


注意

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

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


例如

1、未安装zsh包时,使用-Fvh选项将不会安装,使用-Uvh就会直接安装

wKioL1Z7NjWj4RUeAAAWh1HcwYM786.png

wKioL1Z7NkazhwjYAAAmAcNFRwI937.png


2、将zsh降级回原来的版本

wKiom1Z7Nkej17b4AAAxKWJdl7s201.png



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


3、rpm包的卸载


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

注意卸载是PACKAGE_NAME只输入包名就行了,安装时PACKAGE_FILE必须写包文件路径全名

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

--nodeps:忽略依赖关系

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


例如

1、卸载zsh程序包,卸载时选项后面只跟包名就可以了

wKioL1Z7Nm7zvP-GAAAF5sdXnGg375.png


2、测试卸载zsh程序包,没有输出信息即表示可以正常卸载

wKiom1Z7NmrDf-m4AAAF8aqOd5E613.png



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


4、rpm包的查询


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


[select-options] 包的挑选选项

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

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

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

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

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

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


[query-options] 查询包的相关信息

--changelog:查询rpm包的更新记录;注意是rpm包的changelog而不是源码包的changelog

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

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

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

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

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

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

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


常用选项

-qi  PACKAGE; -qf FILE; -qc PACKAGE; -ql PACKAGE; -qd PACKAGE

-qpi  PACKAGE_FILE; -qpl PACKAGE_FILE; -qpc PACKAGE_FILE; ...


例如

1、查询zsh包是否已经安装,如果已安装查看其版本

wKiom1Z7OVujoKvVAAA6JyosvOk677.png


2、在已安装的所有包里面查询安装了的yum包

wKioL1Z7OYTCFKT4AAAj6av0gyQ787.png


3、查询/etc/inittab文件由哪个程序包安装生成

wKiom1Z7OZOR9wodAAAL48q4CZw573.png


4、查询bash包的更新记录,可以使用less查看

wKioL1Z7Ob-jrRf2AAAHSoDAeWg718.pngwKioL1Z7Oc3BsGqpAAAg2GWa4nQ990.png


5、查询安装zsh包时生成了哪些文件

wKiom1Z7OcehxomvAAApWFi3eC4920.png


6、查询gzip程序包的相关信息,版本号、大小、所属的包组、签名信息、源码程序包、简要功能说明等

wKioL1aAe4XyIm0nAACDVuz8bkw473.png


7、查询bash程序包提供了哪些配置文件

wKioL1aAe5XBkjr6AAARThx4kVs336.png


8、查询bash程序包提供了哪些文档

wKiom1aAe9GAwAt9AAApDEYmdf0863.png


9、查询bash程序包提供的所有的CAPABILITY

wKioL1aAfAKDE3suAAAaIHrsXTU266.png


10、查询/bin/bash此CAPABILITY由哪个程序包提供

wKioL1aAfB2CA9THAAAMOP4xH-M945.png


11、查询/bin/sh此CAPABILITY被哪些包所依赖

wKiom1aAfBnAU9ecAAAfAAFUDMk965.png


12、查询bash程序包所依赖的CAPABILITY

wKioL1aAfELR1VU7AAArjsuJmvM133.png


13、查看bash程序包安装时生成了哪些脚本

wKiom1aAfDzgZHDmAABSyKGtTrk076.png


14、查询未安装的zsh程序包安装后会生成哪些配置文件

wKiom1aAfFCwF4ecAAAn2N1a5EU966.png


15、查询未安装的zsh程序包的相关信息

wKioL1aAfHugu1znAABWtey4OJY114.png



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


5、rpm包的校验


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

     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 readLink路径不匹配

     U User ownership differs 属主不同

     G Group ownership differs 属组不同

     T mTime differs 最近一次修改文件的时间戳发生改变

     P caPabilities differ CAPABILITY改变


例如:

1、校验zsh程序包,没有输出信息则表示zsh验证通过

wKioL1aAfK6z1yy_AAAGYNhU5Yw366.png


2、查询zsh程序包安装时生成的配置文件

wKiom1aAfKKSrUD9AAAWHdlQSCs857.png


3、在zsh的配置文件/etc/zprofile中加入内容为new line的新行

wKiom1aAfLaSXi4SAAAVHrYdLF4439.png


4、再次校验zsh程序就会显示文件的大小,md5值,最近一次修改时间发生改变;每个.号代表一种属性

wKioL1aAfOjRWd1cAAAKAgBWWJM540.png


5、校验zsh程序包时不检查文件,所以就不会提示属性改变了

wKioL1aAfPiyulLfAAAG6afDfzY361.png


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


6、rpm包的来源合法性验证和完整性验证


包来源合法性验正和完整性验正

     来源合法性验正

     完整性验正

          程序包的制作者首先用单项加密计算出程序包的定长特征码,然后再用自己的私钥加密这段特征码,加密后的结果这就是程序包的数字签名,并且将加密后的特征码附加在程序包的后面;

          使用者在得到程序包以后用合法获取的公钥进行解密,因为私钥只有制作者自己有,所以如果使用者能解密这段特征码,就意味着特征码是没有被篡改过的;

          使用者再用同样的单向加密算法计算出程序包的特征码和解密出的特征码进行比较,如果两者一致,即表示程序包的来源是合法的。

     wKiom1aAfPawMz2YAABM7qjClwU808.png

获取并导入信任的包制作者的密钥

     对于CentOS发行版来说:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7


验正方式

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

     (2) 手动验正:rpm -K PACKAGE_FILE


例如

1、未导入密钥时,安装程序包会有警告信息

wKiom1aAfUGTg2_QAAAl-kSVo_U932.png


2、导入光盘中的密钥,在/etc/pki-gpg中也有同样的密钥,任意导入其中一个即可

wKioL1aAfXvAie0oAAAK2whFPbY998.png


wKiom1aAfjGjW4isAAATVKUDzW4702.png


3、导入密钥后重新安装程序包,校验通过就不会提示警告信息了

wKioL1aAfwKTdjzzAAAZZHpdSJo589.png

4、手动验证程序包,前提是手动验证之前已经导入过公钥

wKiom1aAfY-wsIItAAARzSu1u3U611.png



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


7、rpm数据库重建


数据库重建

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

          查询操作:通过此处的数据库进行;


     获取帮助:

          CentOS 6:man rpm

          CentOS 7:man rpmdb


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

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

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


例如

1、创建/tmp/rpmdb目录,初始化数据库时指定数据库的位置为/tmp/rpmdb

wKiom1aAfqrg4J6nAAAohB8elLE971.png


2、在/tmp/rpmdb目录中重新构建rpm数据库
wKioL1aAftmBw-2JAAAcfvdDMm0630.png