Linux的程序包管理器RPM

在早期我们使用源代码的方式来安装软件时,都需要先把源程序代码编译成可执行的二进制安装程序,然后进行安装。这就意味着每次安装软件都需要经过预处理-->编译-->汇编-->链接-->生成安装文件-->安装,这个复杂而艰辛的过程。为简化安装步骤,便于广大用户的安装部署程序,程序提供商就在特定的系统上面编译好相关程序的安装文件并进行打包,提供给大家下载,我们只需要根据自己的系统去下载相应的安装包进行安装即可,其类似Windows的安装方式,由程序开发者直接在已知的系统上面编译好,再将该程序直接给用户来安装,如此而已。但是,程序包该怎么管理呢,这就是我们程序包管理器的事啦!

什么是程序包管理器

用于管理Linux下软件包的软件,其主要功能为:将编译好的程序打包成一个文件或有限的几个文件,可用于实现安装、卸载、升级、查询等功能。

程序包管理器的两大主流

dpkg:最早是由DebianLinux社群所开发出来的,只要是衍生亍Debian的其他Linuxdistributions大多使用dpkg这个机制来管理软件的,包括B2D,Ubuntu等等,其前端工具有apt-get。

RPM:最早是由RedHat这家公司开发出来的,后来实在太好用,因此很多distributions就使用其来作为软件安装的管理方式。包括Fedora,CentOS,SUSE等等,其前端工具有yum。

程序包的组成格式与存放路径:

1、二进制程序

主要存放的路径:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin,/usr/local/APP/{bin,sbin}

注意:有些特殊的应用程序放置于libexec目录中;有些第三方应用默认安装于/opt目录。

2、库文件(开发库、运行库)

主要存放的路径:/lib64,/usr/lib64,/usr/local/lib64,/usr/local/APP/lib

3、配置文件

主要存放的路径:/etc,/usr/local/APP/etc或conf目录

4、帮助文件

主要存放的路径:/usr/share/man,/usr/local/share/man,/usr/local/APP/man

RPM程序包管理器使用详解

RPM包的命名格式:

Linux系统之程序包管理器-RPM

但对于一个程序来说,其可能具有很多功能,其中有些是常用功能,有些是特殊功能,有些是二次开发相关的功能,如果把所有的功能打包在一块,无疑程序包会增大很多,对一些普通用户无需使用的功能都需一并下载安装,无形间就造成了资源的浪费,特此在对程序包的打包就衍生出了分包机制,一般把程序分包成主包与子包。例如一个bash程序有20个功能:常用功能有10个,特殊A:4个,特殊B:3个,二次开发相关功能:3个,那么包的命名方式如下:

核心包,主包:命名与源程序一致

bash-4.2.3-3.centos7.x86_64.rpm

子包:

bash-a-4.2.3-3.centos7.x86_64.rpm

bash-b-4.2.3-3.centos7.x86_64.rpm

bash-devel-4.2.3-3.centos7.x86_64.rpm

RPM-安装程序包:

命令格式:rpm[option]/path/to/package_file...

常用选项说明:

-i:安装程序;

-v:显示安装执行过程;

-vv:详细显示安装执行过程;

-vvv:更详细的显示安装执行过程;

-h:用#来标记安装进度

常用组合选项:-ivh

--test:仅作测试,没有真正执行安装

--nodeps:忽略依赖关系,强制安装,能安装上,但有可能无法运行

--replacepkgs:重新安装,如果原有配置文件作了修改,很有可能不执行替换,而是将应该安装生成的配置文件重命名为.rpmnew

[root@CentOS6Packages]#rpm-ivhzsh-4.3.10-7.el6.i686.rpm--test

Preparing...###########################################[100%]

[root@CentOS6Packages]#rpm-ivhzsh-4.3.10-7.el6.i686.rpm

Preparing...###########################################[100%]

1:zsh###########################################[100%]

[注意]:该命令后面接的是RPM包文件,可以用空格做分割同时安装多个程序,如电脑可以上网的话,也可以直接指定网络上的RPM包,进行安装。

RPM-卸载程序包:

命令格式:rpm[option]package_name

常用选项说明:-e:卸载程序

--nodeps:忽略依赖关系,强行卸载,其他依赖于此包的程序可能无法正常运行

[root@CentOS6Packages]#rpm-ezsh

warning:/etc/zshrcsavedas/etc/zshrc.rpmsave#对/etc/zshrc做过修改,提示文件不会被删会被保存为/etc/zshrc.rpmsave

[root@CentOS6Packages]#rpm-ehttpd#卸载httpd,提示有其他程序依赖于该程序,无法卸载,如需卸载先卸载相依赖的程序

error:Faileddependencies:

httpd>=2.2.0isneededby(installed)gnome-user-share-2.28.2-3.el6.i686

[root@CentOS6Packages]#rpm-ehttpd--nodeps#忽略依赖关系,强行卸载

[root@CentOS6Packages]#

[注意]:如果包的配置文件安装后曾被改动过,卸载时,此文件将不会卸载,而是被重命名并保留,例如

warning:/etc/zshrcsavedas/etc/zshrc.rpmsave

RPM-升级程序包

命令格式:rrpm[-Uvh|-Fvh]/path/to/package_file

常用选项说明:-Uvh:升级或安装,后面的程序安装此电脑已安装则进行升级,如没有安装则现在安装;

-Fvh:升级,只对电脑上已安装的程序进行升级,如没有安装则不进行安装;

--force:强制升级

[注意]:为了保证系统的正常运行,不要对内核进行升级操作,而应该对内核进行安装,系统允许多个内核共存。

RPM-查询操作

命令格式:rpm[option]package_name|file

常用选项说明:

-q:查询某包是否安装,可以一次查询多个,彼此间用空格隔离;

[root@CentOS6cd]#rpm-qzsh

zsh-4.3.10-7.el6.i686

-qa:查询所有已经安装的包,可以通过管道按条件进行过滤(rpm-qa|grep'PATTERN')

[root@CentOS6cd]#rpm-qa

libaio-0.3.107-10.el6.i686

perl-URI-1.40-2.el6.noarch

kbd-1.15-11.el6.i686

gnome-speech-0.4.25-3.1.el6.i686

cas-0.15-1.el6.1.noarch

tzdata-2013g-1.el6.noarch

libsss_autofs-1.9.2-129.el6.i686

.........

[root@CentOS6cd]#rpm-qa|grep"zs.*"

zsh-4.3.10-7.el6.i686

-qi:查询包的描述信息(只能查询已经安装的包的描述信息);

[root@CentOS6cd]#rpm-qizsh

Name:zshRelocations:(notrelocatable)

Version:4.3.10Vendor:CentOS

Release:7.el6BuildDate:Sun24Nov201312:37:44PMEST

InstallDate:Tue21Apr201511:29:57AMEDTBuildHost:c6b9.bsys.dev.centos.org

Group:SystemEnvironment/ShellsSourceRPM:zsh-4.3.10-7.el6.src.rpm

Size:4777026License:BSD

Signature:RSA/SHA1,Sun24Nov201302:30:40PMEST,KeyID0946fca2c105b9de

Packager:CentOSBuildSystem<http://bugs.centos.org>

URL:http://zsh.sunsite.dk/

Summary:Apowerfulinteractiveshell

Description:

Thezshshellisacommandinterpreterusableasaninteractivelogin

shellandasashellscriptcommandprocessor.Zshresemblestheksh

shell(theKornshell),butincludesmanyenhancements.Zshsupports

commandlineediting,built-inspellingcorrection,programmable

commandcompletion,shellfunctions(withautoloading),ahistory

mechanism,andmore.

[root@CentOS6cd]#

-ql:查询某包安装生成了哪些文件(所有);

-qc:查询某包安装生成了哪些配置文件;

-qd:查询某包安装生成了哪些帮助文件;

--q--scriptspackage_name:查询程序包的相关脚本;

脚本有四类:

preinstall:安装前脚本,包安装之前就需安装的脚步

postinstall:安装后脚本

preuninstall:卸载前脚本

[root@CentOS6cd]#rpm-qczsh

/etc/skel/.zshrc

/etc/zlogin

/etc/zlogout

/etc/zprofile

/etc/zshenv

/etc/zshrc

[root@CentOS6cd]#rpm-qdzsh

/usr/share/doc/zsh-4.3.10/BUGS

.....

/usr/share/man/man1/zshall.1.gz

....

[root@CentOS6cd]#rpm-q--scriptszsh

postinstallscriptlet(using/bin/sh):

if[!-f/etc/shells];then

.....

[root@CentOS6cd]#

查询没有安装的包的相关信息,只需要在选项里加入-p即可,如下:

-qpi包的描述信息

-qpl包安装会生成的文件

-qpc包安装会生成的配置文件

-qpd包安装会生成的帮助文件

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

[root@CentOS6cd]#rpm-qf/bin/vi

vim-minimal-7.2.411-1.8.el6.i686#显示/bin/vi文件是由该安装包生成

[root@CentOS6cd]#

RPM-校验

用于检查包安装生成的文件属性是否发生变化

命令格式:rpm[option]package_name|file

常用选项说明:

-V:后面加的是程序名称,若该程序属有的文件发生改变就会显示;

-Va:显示目前系统上面所有可能被修改过的文件;

-Vp:后面加的是文件名,显示该程序内可能被更改过的文件;

-Vf:后面加的是文件名,显示某个文件是否被修改过。

[root@CentOS6cd]#rpm-Vzsh

S.5....T.c/etc/zshrc

[root@CentOS6cd]#

对应属性位说明:

SfileSizediffers表示文件大小发生改变

MModediffers(includespermissionsandfiletype)文件的权限或类型被修改

5digest(formerlyMD5sum)differs文件内容发生改变

DDevicemajor/minornumbermismatch主设备号、次设备号发生改变

LreadLink(2)pathmismatch路径改变

UUserownershipdiffers属主发生改变

GGroupownershipdiffers属组发生改变

TmTimediffers文件的修改时间发生改变

PcaPabilitiesdiffer包的能力发生改变

【注意】在文件属性发生某项属性变化时,对应属性位的标识才会显示,若属性无变化,则显示为.

RPM包的校验与数字签名说明:

RPM包的校验主要有来源合法性验证与包的完整性验证。

数字签名:包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特性码,附加原始数据后面。

验正过程:

前提:必须有可靠机制获取到包制作者的公钥;

1、使用制作者的公钥解密加密的特征码,能解密则意味着来源合法;

2、使用与制作者同样的意向加密算法提取原始数据的特征码,并与解密出来的特征作比对,相同,则意味着完整性没问题;

rpm包来源合法性及完整性检验:

在当前系统上导入包的制作者的公钥:

rpm--import/path/to/key_file

显示所有已经导入的gpg格式的公钥:

rpm-qagpg-pubkey*

[root@CentOS6cd]#rpm-qagpg-pubkey*

gpg-pubkey-c105b9de-4e0fd3a3

[root@CentOS6cd]#

显示密钥的详细信息

rpm-qigpg-pubkey-NAME

[root@CentOS6cd]#rpm-qigpg-pubkey-c105b9de-4e0fd3a3

Name:gpg-pubkeyRelocations:(notrelocatable)

Version:c105b9deVendor:(none)

......

-----ENDPGPPUBLICKEYBLOCK-----

【注意】安装过程中会自动用已经导入的的公钥,对程序包进行检验,一般无需进行手动校验。

手动检查:

rpm{-K|--checksig}[--nosignature][--nodigest]PACKAGE_FILE

选项说明:

-K:等同于--checksig,进行检查并显示结果;

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

--nosignature:不检查来源合法性。

[root@CentOS6cd]#cdPackages/

[root@CentOS6Packages]#rpm-Kzsh-4.3.10-7.el6.i686.rpm

zsh-4.3.10-7.el6.i686.rpm:rsasha1(md5)pgpmd5OK

[root@CentOS6Packages]#rpm--checksigzsh-4.3.10-7.el6.i686.rpm

zsh-4.3.10-7.el6.i686.rpm:rsasha1(md5)pgpmd5OK

[root@CentOS6Packages]#rpm-K--nodigestzsh-4.3.10-7.el6.i686.rpm

zsh-4.3.10-7.el6.i686.rpm:rsa(md5)pgpOK

[root@CentOS6Packages]#rpm-K--nosignaturezsh-4.3.10-7.el6.i686.rpm

zsh-4.3.10-7.el6.i686.rpm:sha1md5OK

RPM-数据库重建:

数据库目录:/var/lib/rpm

重建数据库:

rpm--initdb:初始化

如果事先没有库,会新建一个;如果有,则不新建;

rpm--rebuilddb:重建

直接重建,覆盖原有的数据库