yum与rpm的相关知识

yum与rpm的相关知识

yum下载临时目录
/var/cache/yum

设置
修改yum的配置文件,不然的话,不会保存下载的rpm文件。
配置文件:/etc/yum.conf

keepcache=0
改成
keepcache=1



列出所有可更新包
#yum list

更新全部
yum update

安装指定的包
yum install 包

检查有哪些可更新的rpm包
yum check-update

系统更新(更新所有可以升级的rpm包,包括kernel)
#yum -y update

大规模的版本升级,与yum update不同的是,连旧的淘汰的包也升级
#yum upgrade




rpm包管理详解(结合rpm,rpm2cpio,cpio提取rpm包的特定文件)

 

 

在linux世界里流行两种包管理方式,分别是redhat系的rpm和debian系的deb。其中rpm的使用更为广泛,我打算接下来分多章详细介绍一下rpm的包管理机制。

包管理是操作系统用来维护各组件版本的一种方式,对于软件发行者来说,将自己的程序制作成标准的rpm格式也会使得程序的安装、升级和卸载变得非常容易。因此linux下几乎所有流行的程序都有rpm格式的包,有些是发行者自己打包,也有些第三方提供rpm包,例如redhat发行版里的rpm都是redhat自己打包,他们定期打patch,升级并且维护包之间的依赖关系,他们制作的rpm包是最可以信任的。除此之外,http://dag.wieers.com/rpm/这个网站也提供很多较新的rpm包,在redhat官方找不到的包很多在这里都可以找到。

在网上搜索rpm包最常用的方式是通过rpmfind.net进行搜索,它会提供各个发行版下的各个版本的包下载。注意一定要找到正确的发行版下对应的包,由于依赖底层库和库版本的不同,不同版本的发行版的包最好不要混装。

今天先介绍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 仅安装文件不执行附加脚本

--whatprovides <x> 查询系统中某个文件,某个目录,某个模块是由哪个包提供的.

--whatrequires <x> 查询系统中某个文件,某个目录,某个模块是哪个包需要的

-p <file>;(or ``-'') 查询软件包的文件
-f <file>;           查询<file>;属于哪个软件包
-a                  查询所有安装的软件包
--whatprovides <x>;  查询提供了 <x>;功能的软件包  
-g <group>;          查询属于<group>; 组的软件包
--whatrequires <x>; 查询所有需要 <x>; 功能的软件包



 

下面演示一个强行安装的例子

[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的-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日 星期五 2128分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包之间会维持依赖关系,这是包管理系统的特色。我们都经历过安装一个包而因为依赖缺失而装不上的情况。后来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.6libc.so.6 (GLIBC_2.0 )  libc.so.6 (GLIBC_2.1 )  libc.so.6 (GLIBC_2.3.4 )  rpmlib (CompressedFileNames ) &lt;= 3.0.4- 1  rpmlib (PayloadFilesHavePrefix ) &lt;= 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 -qRrpm -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包的“增删改查”就都涉及到了。

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包的升级而丢失。

 

案例:

[root@teacher Packages]# rpm -qf $(which system-config-selinux)

policycoreutils-gui-2.0.83-19.1.el6.i686

[root@teacher Packages]# rpm -qi policycoreutils-gui-2.0.83-19.1.el6.i686

 

Name        : policycoreutils-gui          Relocations: (not relocatable)

Version     : 2.0.83                            Vendor: Red Hat, Inc.

Release     : 19.1.el6                      Build Date: 2010???08???25?—? ????????‰ 20?—?51???33?§’

Install Date: 2011???04???02?—? ???????…? 23?—?36???36?§’      Build Host: ls20-bc2-13.build.redhat.com

Group       : System Environment/Base       Source RPM: policycoreutils-2.0.83-19.1.el6.src.rpm

Size        : 828672                           License: GPLv2+

Signature   : RSA/8, 2010???08???25?—? ????????‰ 22?—?59???33?§’, Key ID 199e2f91fd431d51

Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>

URL         : http://www.selinuxproject.org

Summary     : SELinux configuration GUI

Description :

system-config-selinux is a utility for managing the SELinux environment


[root@teacher Packages]# rpm -qg “System Environment/Base”

setup-2.8.14-10.el6.noarch

filesystem-2.4.30-2.1.el6.i686

............................

createrepo-0.9.8-4.el6.noarch

system-config-kickstart-2.8.6.2-1.el6.noarch

setools-console-3.3.7-4.el6.i686

policycoreutils-python-2.0.83-19.1.el6.i686

policycoreutils-newrole-2.0.83-19.1.el6.i686

policycoreutils-gui-2.0.83-19.1.el6.i686

policycoreutils-sandbox-2.0.83-19.1.el6.i686

----------------------------------------------------------------------------------------
结合rpm,rpm2cpio,cpio提取rpm包的特定文件
首先,要确定/etc/mail/sendmail.mc属于哪个rpm包:
[root@pps tmp]# rpm -qf /etc/mail/sendmail.mc
sendmail-8.13.8-2.el5
 
然后从iso安装光碟中提取出sendmail-8.13.8-2.el5.i386.rpm(或者其它方式取得),确认一下sendmail.mc的路径:
[root@pps tmp]# rpm -qlp sendmail-8.13.8-2.el5.i386.rpm | grep sendmail.mc
warning: sendmail-8.13.8-2.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
/etc/mail/sendmail.mc
 
在提取sendmail.mc之前,有必要确认一下它的相对路径:
[
root@pps tmp]# rpm2cpio sendmail-8.13.8-2.el5.i386.rpm | cpio -t | grep sendmail.mc
2570 blocks
./etc/mail/sendmail.mc
 
好,现在可以放心提取sendmail.mc了:
[root@pps tmp]# rpm2cpio sendmail-8.13.8-2.el5.i386.rpm | cpio -idv ./etc/mail/sendmail.mc
./etc/mail/sendmail.mc
2570 blocks
 
【注意】cpio参数后的文件路径"./etc/mail/sendmail.mc"必须和前面查询的相对路径一样,否则提取不成功。
 
cpio参数说明:
-t  列出的意思,和"--list"等同,注意,此时列出的是“相对路径”
-i  抽取的意思,和"--extract"等同
-d  建立目录,和"--make-directories"等同
-v  冗余信息输出,和"--verbose"等同
 
rpm参数说明:
-q  --query 查询
-l  --list 列出
-f  --file 指定文件
-p --package 指定rpm包
 
 
rpm2cpio ../kernel-ntfs-2.4.20-8.i686.rpm | cpio -idmv

不想把目录弄乱的话,就建个新的子目录 然后在子目录里用这个就 KO 了!!

 


你可能感兴趣的:(yum)