您好,欢迎来到思海网络,我们将竭诚为您提供优质的服务! 诚征网络推广 | 网站备案 | 帮助中心 | 软件下载 | 购买流程 | 付款方式 | 联系我们 [ 会员登录/注册 ]
促销推广
客服中心
业务咨询
有事点击这里…  531199185
有事点击这里…  61352289
点击这里给我发消息  81721488
有事点击这里…  376585780
有事点击这里…  872642803
有事点击这里…  459248018
有事点击这里…  61352288
有事点击这里…  380791050
技术支持
有事点击这里…  714236853
有事点击这里…  719304487
有事点击这里…  1208894568
有事点击这里…  61352289
在线客服
有事点击这里…  531199185
有事点击这里…  61352288
有事点击这里…  983054746
有事点击这里…  893984210
当前位置:首页 >> 技术文章 >> 文章浏览
技术文章

RedHat系Linux中的rpm包管理系统

添加时间:2016-6-9 19:36:29  添加: 思海网络 
在linux世界里流行两种包管理方式,分别是redhat系的rpm和debian系的deb。其中rpm的使用更为广泛,包管理是操作系统用来维护各组件版本的一种方式,对于软件发行者来说,将自己的程序制作成标准的rpm格式也会使得程序的安装、升级和卸载变得非常容易。因此linux下几乎所有流行的程序都有rpm格式的包,有些是发行者自己打包,也有些第三方提供rpm包,例如redhat发行版里的rpm都是redhat自己打包,他们定期打patch,升级并且维护包之间的依赖关系,他们制作的rpm包是最可以信任的。除此之外,http://dag.wieers.com/rpm/这个网站也提供很多较新的rpm包,在redhat官方找不到的包很多在这里都可以找到。
在网上搜索rpm包最常用的方式是通过rpmfind.net进行搜索,它会提供各个发行版下的各个版本的包下载。注意一定要找到正确的发行版下对应的包,由于依赖底层库和库版本的不同,不同版本的发行版的包最好不要混装。

RPM的安装功能
先介绍rpm的安装,基本的安装命令如下

代码如下:
rpm -ivh xxxxxxx.rpm

i代表安装,e代表卸载,v代表显示安装过程,h代表显示#号样式的进度
下面看一个简单的例子:


代码如下:
[leconte@localhost soft]$ sudo rpm -ivh enca-1.9-4.el5.rf.i386.rpm
warning: enca-1.9-4.el5.rf.i386.rpm: Header V3 DSA signature: NOKEY, key ID 6b8d79e6
Preparing... ########################################### [100%]
1:enca ########################################### [100%]

rpm包这样就装上了,但是很多时候没有这么顺利,由于rpm包之间可能存在依赖关系,在依赖关系无法满足的情况下默认是没法继续安装的;再比如某个包已经安装过,如果想再装一次,也是无法继续的。这种情况下可以通过一些参数来强制执行,但是强制执行的后果可能是装的程序无法正常使用,因为它依赖的包你系统并没有提供。
安装时常用的参数如下:
--test 测试安装,并不真实安装而仅仅是测试能否安装。
--nodeps 忽略依赖关系强行安装
--force 强制替换现有版本
--nos 仅安装文件不执行附加脚本
下面演示一个强行安装的例子“


代码如下:
[leconte@localhost soft]$ sudo rpm -ivh awstats-6.9-1.noarch.rpm
error: Failed dependencies:
perl(LWP::UserAgent) is needed by awstats-6.9-1.noarch
[leconte@localhost soft]$ sudo rpm -ivh awstats-6.9-1.noarch.rpm --nodeps
Preparing... ########################################### [100%]
1:awstats ########################################### [100%]

awstats依赖的PERL模块LWP::UserAgent并没有装,因此默认是无法安装的,但是通过nodeps可以强制安装,而LWP::UserAgent可以通过cpan去后续安装。也就是说,如果你明白你在做什么,那么强制安装并不可怕。
需要注意的是,rpm包的安装和卸载都需要在系统的rpm数据库里保存信息,因此需要root权限。

RPM的查询功能
接着介绍rpm的查询功能,查询是我们最常用的功能,例如查询一个包里包含哪些文件、一个文件属于哪个包、以及包之间的依赖关系等等。
rpm的-q参数是用来进行查询的,需要明确的是rpm既可以对安装在系统上的包进行查询,也可以对一个未安装的rpm包进行查询。当一个rpm包安装到系统上之后,安装信息通常会保存在本地的/var/lib/rpm/目录下,数据会以berkeley DB的方式保存。查看/var/lib/rpm/Packages文件的类型可以验证这一点。



代码如下:
[leconte@localhost rpm]$ file /var/lib/rpm/Packages
/var/lib/rpm/Packages: Berkeley DB (Hash, version 8, native byte-order)

这种情况下的查询其实就是对bdb的读访问。而对一个未安装的rpm包进行查询,则是通过解读rpm包本身而获取信息,这一点是首先需要明确的。
下面我就简单罗列一下rpm最常用的几个查询功能
1.rpm -qa 用来查询系统安装的所有包,a代表all
2.rpm -ql [包名] 用来查询某个包里的文件列表,例如查询包passwd里包含的内容


代码如下:
[leconte@localhost rpm]$ rpm -ql passwd
/etc/pam.d/passwd
/usr/bin/passwd
/usr/share/man/man1/passwd.1.gz

3.rpm -qi [包名] 用来查询包信息,其中包含包的介绍,作者,打包日期等重要信息。
4.rpm -qf [文件名] 用来查询一个文件所属的rpm包,例如:


代码如下:
[leconte@localhost rpm]$ rpm -qf /etc/passwd
setup-2.5.58-4.el5

系统配置文件/etc/passwd是属于setup这个包的。
5.rpm -qV [包名] 用来验证某个包中安装的各文件的状态,如果当前文件的大小、md5和安装时数据库里保存的信息不一致,该命令则会将不一致的文件列出来。该命令对于系统出问题的情况下的故障排查很有帮助。
上面是几个最常用的查询命令,都是针对查询系统rpm包情况的。如果要查询未安装的rpm包则只需要加上p参数和包路径即可。例如查询包perl-Git-1.5.5.6-4.el5.i386.rpm的信息:


代码如下:
[leconte@localhost soft]$ rpm -qip perl-Git-1.5.5.6-4.el5.i386.rpm
warning: perl-Git-1.5.5.6-4.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 217521f6
Name : perl-Git Relocations: (not relocatable)
Version : 1.5.5.6 Vendor: Fedora Project
Release : 4.el5 Build Date: 2009年06月19日 星期五 21时28分05秒
Install Date: (not installed) Build Host: xenbuilder2.fedora.redhat.com
Group : Development/Libraries Source RPM: git-1.5.5.6-4.el5.src.rpm
Size : 24878 License: GPL
Signature : DSA/SHA1, 2009年06月20日 星期六 04时07分18秒, Key ID 119cc036217521f6
Packager : Fedora Project
URL : http://kernel.org/pub/software/scm/git/
Summary : Perl interface to Git
Deion :
Perl interface to Git.

RPM包的依赖关系
rpm包之间会维持依赖关系,这是包管理系统的特色。我们都经历过安装一个包而因为依赖缺失而装不上的情况。后来yum的出现能一定程度解决这个问题,但我们仍然有必要了解rpm依赖关系背后的细节。
自己打过rpm包的人都知道,在包的spec配置文件往往要明确写出此包所依赖的包名或文件名,同时也可能需要明确写出此包所提供的内容。这个内容可能是动态库也可能是其他一些名字,并不一定是文件名。各个包之间正是依靠这些内容来建立依赖关系的,每个包都提供一些内容同时依赖一些别的内容,整个系统就在这样一种相互依赖中形成了。
在看具体的例子之前先介绍几个指令:
rpm -qR [包名] 可以用来查询指定包所依赖的内容
rpm -q –provides [包名] 可以用来查询指定包所提供的内容
rpm -q –whatprovides [内容] 可以用来查询哪个包提供了指定内容
rpm -q –whatrequires [内容] 可以用来查看哪些包依赖于指定内容
例如我们以time这个包为例进行查询,结果如下:



代码如下:
[leconte@localhost soft]$ rpm -qR time
/bin/sh
/bin/sh
/sbin/install-info
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
libc.so.6(GLIBC_2.3.4)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)

可见,time这个包如果要安装,上述内容必须已经存在,否则将会提示依赖缺失而无法安装。我们以列表中的/bin/sh为例进行反查,可以看到系统中哪个包提供了/bin/sh


代码如下:
[leconte@localhost soft]$ rpm -q --whatprovides "/bin/sh"
bash-3.2-24.el5

很明显,bash这个包提供了/bin/sh,正是由于bash的安装才满足了time的安装需求。
time依赖于bash等包,同时它也提供了一些内容,有可能被别的包依赖:


代码如下:
[leconte@localhost soft]$ rpm -q --provides time
time = 1.7-27.2.2
[leconte@localhost soft]$ rpm -q --whatrequires 'time'
no package requires time

不幸的是系统中并没有包依赖于time,因为它本身属于较上层的包。
对于一些底层内容就会有很多包依赖它,例如之前碰到的/bin/sh:


代码如下:
[leconte@localhost soft]$ rpm -q --whatrequires '/bin/sh'
bash-3.2-24.el5
bash-3.2-24.el5
info-4.8-14.el5
ncurses-5.5-24.20060715
libxml2-2.6.26-2.1.2.7
readline-5.1-1.1

......................省略n行
由于篇幅所限就不全列举出来了,这种依赖关系应该可以一目了然了。
和上节类似,rpm -qR和rpm -q –provides这两个查询指令同样可以加上-p参数应用到一个未安装的rpm包,例如


代码如下:
[leconte@localhost soft]$ rpm -qp --provides enca-1.9-4.el5.rf.i386.rpm
warning: enca-1.9-4.el5.rf.i386.rpm: Header V3 DSA signature: NOKEY, key ID 6b8d79e6
libenca.so.0
enca = 1.9-4.el5.rf

可以看到,enca这个rpm包提供了动态库libenca.so.0和enca本身。
通过使用本节这四条依赖关系查询指令基本可以了解到系统上众多rpm包之间的耦合关系,明确了这一点,我们对rpm的理解也就更深了一步。


RPM包的卸载和升级
rpm包的卸载和升级的指令如下:
rpm -e [包名] 用来卸载一个rpm包
rpm -U [包文件] 用来升级一个现有的rpm
需要注意的是,如果要卸载的rpm包中的内容被别的rpm包依赖,那么则无法卸载,例如



代码如下:
[leconte@localhost ~]$ rpm -e php-common
error: Failed dependencies:
php-common = 5.2.9-4 is needed by (installed) php-pdo-5.2.9-4.i386
php-common = 5.2.9-4 is needed by (installed) php-bcmath-5.2.9-4.i386
php-common = 5.2.9-4 is needed by (installed) php-curl-5.2.9-4.i386
php-common = 5.2.9-4 is needed by (installed) php-dba-5.2.9-4.i386
        
php-common由于被 php-pdo等包依赖而无法单独卸载,php-pdo和php-common可以利用上节介绍过的依赖关系查询指令查到:


代码如下:
[leconte@localhost ~]$ rpm -qR php-pdo
config(php-pdo) = 5.2.9-4
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1.3)
libc.so.6(GLIBC_2.3)
libc.so.6(GLIBC_2.4)
librt.so.1
libsqlite3.so.0
php-common = 5.2.9-4
..............
[leconte@localhost ~]$ rpm -q --whatrequires php-common
php-pdo-5.2.9-4
php-bcmath-5.2.9-4
php-curl-5.2.9-4
php-dba-5.2.9-4
php-gd-5.2.9-4
...............

这种情况下想要卸载php-common,只能将它依赖的所有包全部卸载掉。更暴力的方式是指定-nodeps忽略依赖关系限制,但是这样造成的后果就是php-pdo等包将无法正常使用,因此这种方式一般不推荐。
rpm包的升级指的是rpm包的版本升级,这种情况下实际内部执行的动作分两步,即先安装新版本然后卸载老版本。此外,rpm也可以进行包的降级,只需要指定–oldpackages参数即可。
值得注意的是在卸载和升级的过程中,包中的配置文件会被妥善处理,rpm会根据一系列规则决定配置文件是否保留,即使被替换,旧的配置文件也会被重命名后保存起来,你之前对配置文件做过的修改不会因为rpm包的升级而丢失。

关键字:RedHat、Linux、rpm、包管理系统
分享到:

顶部 】 【 关闭
版权所有:佛山思海电脑网络有限公司 ©1998-2024 All Rights Reserved.
联系电话:(0757)22630313、22633833
中华人民共和国增值电信业务经营许可证: 粤B1.B2-20030321 备案号:粤B2-20030321-1
网站公安备案编号:44060602000007 交互式栏目专项备案编号:200303DD003  
察察 工商 网安 举报有奖  警警  手机打开网站