全面讲解RedHat系Linux中的rpm包管理系统

2020-01-30 14:53:52于海丽

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
Description :
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