Linux的程序包管理器(上)——rpm详解

    在使用Linux操作系统的过程中,我们需要的一些服务(例如Nginx)并没有提供,需要用户自行安装相应的程序包,才能使用相应的服务。本文以CentOS6.6为例,分三小节为读者朋友们尽可能详细的讲解rpm、yum以及程序包的编译安装三种程序包的管理方法。

    rpm

    rpm包管理工具是Red Hat公司贡献的一款rpm程序包管理器,在RHEL、CentOS、Fedora、SUSE等主流发行版本中,被广泛使用。

    rpm包管理工具可用于安装,升级,卸载,重新安装程序;也可以用于查询当前系统上安装了哪些程序,安装程序生成了哪些文件,或者查询一个文件是由哪个程序安装后生成的;也可以校验包的来源完整性和合法性。

    在讲解rpm使用之前,先了解一下rpm包。rpm包的命名方式:rpm包名-主版本号-次版本号-发行号-rpm包自己的发行号(注:与源代码的发行号无关)-平台类型.rpm。如:bash的rpm包名:bash-4.1.2-29.el6.x86_64。每个rpm包当中都有一份程序的组成清单,其中包含了安装、卸载时的脚本,公共数据库指向路径,以及安装之后该程序会生成的文件的清单。读者朋友们可以想想一下Windows下的安装程序,例如QQ,它在自动安装的过程中,也是运行其中的脚本文件进行安装,在注册表中注册(类似于Linux下的公共数据库)生成相应的文件在Windows系统中。rpm管理工具正是将包里的文件抽取出来安装,安装过程中,会检查安装的程序包的是否依赖于其他包,其他包是否已安装在系统中,反馈相应的信息给用户,例如,若安装的包依赖于其他包,会告诉用户安装该包要先安装那些包等(其实,在Windows下安装程序时也会出现这样的提示信息,安装英雄联盟的时候,如果没安装Directx的话,会提示用户安装该软件包)。

    rpm包的安装

    要安装rpm包,首先得先下载rpm包,巧妇难为无米之炊嘛!通常获取rpm的途径有以下几种:①优先选择系统发行光盘或者官方镜像站点;②程序项目的官方站点;③可靠的第三方组织:例如Fedora的EPEL社区:http://fedoraproject.org/wiki/EPEL/zh-cn;④良心rpm包专享搜索引擎:http://rpmfind.net 、http://rpm.pbone.net、http://pkgsorg。

    安装命令:rpm -ivh 程序包名(注意路径)

例如,安装Nginx程序包rpm -ivh nginx-1.4.7-1.el6.ngx.x86_64.rpm。

wKioL1R5ik7RHfGSAAH2TnnaX68748.jpg

常用安装选项:

--nodeps 忽略程序包的依赖关系。注:强烈不建议使用该选项。

--replacepkgs 替换原来的包重新安装,即重装该程序。例如,我们将Nginx程序重新安装:rpm -ivh nginx-1.4.7-1.el6.ngx.x86_64.rpm --replacepkgs

wKiom1R5ivLRsVGYAAFpOPD_8TA221.jpg

--test 仅作测试性安装而非真正安装,常用于检查包之间的依赖性关系

--prefix NEWPATH 将程序安装在自定义的路径下,前提是该包支持用户自定义安装路径。

    升级命令:rpm -Uvh 程序包名(注意路径):如果有旧版本的程序包,则升级安装,否则执行安装操作

              rpm -Fvh 程序包名(注意路径):如果有旧版本的程序包,则升级安装;否则不执行任何操作。

例如,将nginx从1.4.7-1升级到1.6.1-1:rpm -Uvh nginx-1.6.1-1.el6.ngx.x86_64.rpm

wKioL1R5meOSNiaZAAEAD02TtrQ299.jpg

常用的升级选项:

--force:强制升级忽略冲突过程

--oldpackage:降级安装,即用旧版本的程序替代现有程序。例如:我们将现在1.4.7-1版本的nginx降级为1.0.8-2版本。从nginx官网:http://nginx.org/packages/centos/6/x86_64/RPMS/下载相应的版面,执行命令:rpm -Uvh nginx-1.0.8-2.el6.ngx.x86_64.rpm --oldpackages

wKiom1R5l4GB_lK4AARfwlYlK1o172.jpg

--test测试升级过程

注:不要对内核包执行升级操作,Linux本身支持多版本的内核并存,因此,对新版本的内核包可以直接安装;如果原程序包的配置文件安装后被改动过,升级时,新版本的文件并不会直接覆盖老版本的文件而是把新版本的文件重命名(加后缀.rpmnew)保留。

    卸载命令:rpm -e 程序名(注:不是程序包名)

例如,卸载nginx:rpm -e nginx

常用选项:

            --nodeps 忽略依赖关系执行卸载

    --test 卸载测试

注:如果包的配置文件安装后曾被改动过,卸载时,此配置文件不会被删除而是被重命名(加后缀.rpmsave)保留。

    查询类命令

    查询是依赖于rpm的公共数据库,数据库当中包含了当前系统上安装的所有的程序名及版本、程序包间的依赖关系、程序包的功能说明、安装生成的各文件路径以及校验码信息。数据库是系统在不确定时间自动生成的,但千万不要忽视了这个公共数据库,生产环境中,rpm不能查询和安装大多跟这个数据库有关,这个时候就需要我们手动初始化数据库。有关公共数据库的两个常用命令:

初始化数据库:rpm --initdb 如果事先不存在数据,则会新之;否则,不执行任何操作

重新构建数据库:rpm --rebuilddb 无论当前是否已经存在数据库,都会直接重建并覆盖现有数据库

查询某程序是否已经安装:rpm -qa 程序名


wKiom1R5pguwWi4QAACmL_DwcPM652.jpg


查询某文件是由哪个包安装后生成的:rpm -qf /path/to/somefile


wKiom1R5pqmjmAKYAACcqeu7ItE358.jpg



查询尚未安装的程序包安装之后会生成哪些文件:rpm -qpl PACKAGE_FILE.rpm


wKioL1R5qCHyvdh-AAIuhXllRSg865.jpg


查询某程序的摘要信息 rpm -qi 程序名


wKioL1R5qzjSY724AAIwGu5_R3A453.jpg


查询某程序生成的文件列表:rpm -q 程序名

wKiom1R5qLuCyKsBAAGpYVuCiMA775.jpg

查询某程序生成的配置文件列表:rpm -qc 程序名   

[root@localhost ~]# rpm -qc bind 
/etc/logrotate.d/named
/etc/named.conf
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
/etc/rndc.conf
/etc/rndc.key
/etc/sysconfig/named
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost
/var/named/named.loopback

    生产环境中常用的rpm命令大致就这么多,想要了解更多rpm的命令说明,详见man手册。

    写在最后:使用rpm安装程序是无法自动解决依赖关系的,而另一款rpm包管理器yum帮用户解决了这一问题。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章