在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的安装,基本的安装命令如下

复制代码代码如下:

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的查询功能接着介绍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

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

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

分析linux系统的rpm -qa,全面讲解RedHat系Linux中的rpm包管理系统相关推荐

  1. 详细讲解WIN7系统上Virtualbox4.2.8安装RedHat Enterprise Linux 6.4

    详细讲解WIN7系统上Virtualbox4.2.8安装RedHat Enterprise Linux 6.4(一) 最近RHEL6.4出来了,从别人的百度网盘转存后用网盘客户端同步了一晚上ISO文件 ...

  2. linux系统怎样写单片机程序,单片机知识是Linux驱动开发的基础之一以及如何学单片机...

    这是arm裸机1期加强版第1课第2.3节课程的wiki文字版. 为什么没前途也要学习单片机? 因为它是个很好的入口. 学习单片机可以让我们抛开复杂的软件结构,先掌握硬件操作,如:看原理图.芯片手册.写 ...

  3. linux系统可以装win10吗,如何在Win10专业版中安装Linux系统?

    如何在Win10专业版中安装Linux系统?在Windows10 第3个稳定版发布以后,支持内嵌的Linux系统,正如大家所知道的,大多数 Linux 上的命令行二进制程序现在可以原生地运行在 Win ...

  4. linux系统能做什么的,Linux系统适合日常使用吗?普通人学Linux能干什么

    Linux是多用户多任务系统,多个用户可以同时使用,计算机同时执行多个任务.但对于普通人来说,Linux系统适合日常使用吗?普通人学Linux能干什么?确实是值得深思. Linux是程序员的标配.Li ...

  5. linux系统下的打印机驱动下载,方法论:Linux下如何驱动主流品牌打印机

    薄荷站长浸淫 Linux 桌面领域十余年,一直致力于 Linux 桌面系统的推广.对于桌面用户办公中必需的打印功能,薄荷站长也是有所研究.为了使新手朋友们少走弯路,薄荷站长介绍一下常见品牌打印机的 L ...

  6. Linux系统适合日常使用吗?普通人学Linux能干什么

    Linux是多用户多任务系统,多个用户可以同时使用,计算机同时执行多个任务.但对于普通人来说,Linux系统适合日常使用吗?普通人学Linux能干什么?确实是值得深思. Linux是程序员的标配.Li ...

  7. Java File.getPath() File.getAbsolutePath()函数在Windows和Linux系统上存在区别!win正常而linux会报错!

    Java File.getPath() File.getAbsolutePath()函数在Windows和Linux系统上存在区别!win正常而linux会报错! 如下图: windows下的源代码和 ...

  8. u盘安装完linux系统没镜像,U盘刻录kali linux启动盘提示找不到镜像解决方案

    U盘刻录14.10镜像出问题的解决方法 从几个月前的14.10 daily 版本就有U盘刻录无法启动的现象,相关bug可参见:https://bugs.launchpad.net/ubunt ... ...

  9. RedHat系Linux通过yum安装MySQL

    提示: 本次安装的是MySQL最新的版本 使用的系统为CentOS7 每个页面的链接在文档中都有,可以直接点击跳转 文章目录 RPM安装太费劲了! 零.首先要通过yum安装如下命令工具 一.导入官方仓 ...

最新文章

  1. 荣获计算机视觉“奥斯卡”奖提名的年轻人!康奈尔大四学生林之秋的科研之道...
  2. oracle ogg双向通步,使用ogg的Oracle-Oracle的双向复制
  3. FSMC(STM32)
  4. C# 获取Excel版本
  5. LOL手游诺手对线技巧,上分率提高60%,战神玩家推荐玩法
  6. django 创建mysql失败_创建表时出现Django MySQL错误
  7. centos yum 安装python3.6+pip
  8. win10计算机优化技巧,让Win10系统运行更流畅的优化技巧
  9. kubernetes与web集群
  10. [Ext JS 4] Grid 组件
  11. mac sudo: /etc/sudoers is world writable
  12. Linux运维之路怎么走?
  13. xlsx文件打开乱码_xlsx文件怎么打开乱码
  14. MATLAB中Yalmip工具,yalmip工具箱使用问题
  15. Java与完成端口IOCP
  16. WEBMAX函数教程
  17. 谈谈我在创业公司的感悟
  18. 内存屏障(Memory Barrier)(一)什么是写屏障?
  19. 【金融123】ISDA协议
  20. python提取txt数据到excel

热门文章

  1. 苹果CMSv10粉色X大气H视频站模板源码
  2. oneui2正式版,三星全系OneUI正式版官方更新时间表曝光:最早明年二月
  3. 计算机应用基础知识.doc,计算机应用基础知识.doc
  4. 超出一般人的想象 十大终极黑客入侵事件
  5. Android studio线性布局用户界面设计
  6. linux c语 curl代码_termux基础入门:论如何在手机上学习linux
  7. 系统态和内核态的讲解
  8. 服务器 声音响 风扇转速调节
  9. configure: error: zlib library not found 解决方法
  10. macbook 关于微信突然打开白屏