在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在linux世界里流行两种包管理方式,分别是redhat系的rpm和debian系的deb。其中rpm的使用更为广泛,我打算接下来分多章详细介绍一下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 强制替换现有版本 --noscripts 仅安装文件不执行附加脚本 下面演示一个强行安装的例子“ 复制代码 代码如下:[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的查询功能 复制代码 代码如下:[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 Description : Perl interface to Git. RPM包的依赖关系 复制代码 代码如下:[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的理解也就更深了一步。
复制代码 代码如下:[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包的升级而丢失。 |
请发表评论