使用RPM安装软件

673 查看

rpm -i 它做了什么

一说到rpm,人们第一时间想到的就是rpm能用来安装软件。正如我们前面提及到的,安装软件时一个复杂的,经常出错的事情,但在rpm眼中,安装软件只不过是一个命令的事。

rpm -i (等同于rpm --install) 命令能够安装已经被打包成rpm格式的软件,它主要做以下几件事:

  • 依赖检查.

  • 检测冲突

  • 做一些正式安装前必须做的准备工作

  • 根据配置文件确定如何安装软件

  • 解压包并把它们放在一个合适的路径下

  • 执行一些在安装后须要做的工作

  • 对它自身的所作所为进行跟踪

下面将逐个解释上述所述的几点:

依赖检查

有时候,一些安装包须要在它所依赖的安装包安装好了之后才能正常安装。RPM将会确认所需安装软件的依赖包已经安装好了,它也会保证安装软件包时不影响其它已经安装好的软件。

检测冲突

RPM在这个阶段将会进行一系列检测,如果试图安装一个已经安装过的软件,或者用旧版本覆盖新版本的软件,或者是非法改写某个已安装软件的软件。这些RPM都能检测出来并及时制止。

做一些正式安装前必须做的准备工作

一些命令必须在正式软件安装开始之前优先执行,RPM将会执行你所定义的这些命令,这样能够避免在安装时遇到很多问题。

根据配置文件确定如何安装软件

RPM与其他包管理软件不同的一点是,它会使用配置文件,尽管有时候改变配置文件只是为了个性化地安装软件,但这会激怒你的小伙伴,因为他们之前所做的一些个性化配置全都没了。而RPM会分析配置文件,并尝试去做正确的事,即使这些软件一开始并不是使用RPM安装的。

解压包并把它们放在一个合适的路径下

每个安装包都会包含许多待安装的文件,并且包含了每个文件需要被安装到哪个目录下,而且,文件的其他一些属性,例如权限和所有者,RPM都会进行正确的设置。

执行一些在安装后须要做的工作

有时候,需要在软件安装后执行一些命令。比如说,执行ldconfig命令来使一些库变成公用的。

对它自身的所作所为进行跟踪

每当RPM把软件安装到你的系统上后,它会在数据库中保留对文件的跟踪,数据库中存储了大量有用的信息,例如,当RPM检测冲突时,它就会使用到它存储在数据库中的信息。

RPM安装实战

让我们来看看一个例子,安装一个软件,你只需要使用命令rpm -i,命令后跟着rpm包文件就可以:
# rpm -i eject-1.2-2.i386.rpm

这时候,上文中所提到的几件事情在这个时候已经完成了。这个软件包已经被安装好了,需要注意的是,这里的安装包文件并不需要严格遵守rpm包的命名规范,例如:
# mv eject-1.2-2.i386.rpm baz.txt
# rpm -i baz.txt

在这个例子中,我们把rpm包的名字从eject-1.2-2.i386.rpm改为了baz.txt,安装结果将会和之前的安装结果的一样。rpm包的名字在RPM进行安装时,将不会被使用。RPM用的是包里的文件的内容,无论名字怎么改,RPM始终都能读取包里的文件来实现正确安装。

使用URL来指定包文件

如果你上网,你一定会注意到一个网页是这样被标识的:

http://www.redhat.com/support/docs/rpm/RPM-HOWTO/RPM-HOWTO.html

这叫做一个统一资源定位符(Uniform Resource Locator),或者叫URL,RPM也可以使用URL来安装软件,尽管URL看起来有些不一样,下面有另外一个例子:

# ftp://ftp.redhat.com/pub/redhat/code/rpm/rpm-2.3-1.i386.rpm

ftp标识着这个URL是基于文件传输协议的,正如名字所暗示的那样,这个类型的URL是用来传输文件的。

RPM对URL的支持使我们能够通过一个简单的命令来安装软件:

# rpm -i ftp://ftp.gnomovision.com/pub/rpms/foobar-1.0-1.i386.rpm

也许你会看到你从未见过的警告信息

依环境而定,当你在安装一个普通软件的时候,以下信息你可以从来没有见到过或者是经常见到过:

# rpm -i cdp-0.33-100.i386.rpm

warning: /etc/cdp-config saved as /etc/cdp-config.rpmorig

这是什么意思,这要从RPM处理配置文件说起,在上面的例子中,RPM找到了一个文件(/etc/cdp-config),这个文件不属于任何已经安装了的包,由于cdp-0.33-100包含了一个与该文件同名的包,并且该文件要安装在同一个目录下,就会遇到上面这个警告信息。

RPM将会有两个步骤来处理这个问题:

  1. 把原来的文件改名为cdp-config.rpmorig.
  2. 使用安装包中的cdp-config来安装软件。

接下来我们查看这个目录,我们会看到一切如我们所说的那样发生了:

    # ls -al /etc/cdp*
    -rw-r--r--   1 root     root      119 Jun 23 16:00 /etc/cdp-config
    -rw-rw-r--   1 root     root       56 Jun 14 21:44 /etc/cdp-config.rpmorig

两个有用的选项

有两个选项,能够帮助rpm -i 工作得更好,也很有用。你也许会意味它们是RPM的默认行为,但实际上不是,只不过要使用它们,你得多打一些字:

使用 -v 选项得到更多的反馈

尽管rpm -i 已经做了很多事情,但是还不够,不是吗? 当进行安装的时候,rpm表现得太安静了,除非安装过程中出了错。不过我们可以通过加上 -v 选项来让它输出更多的信息:

# rpm -iv eject-1.2-2.i386.rpm
Installing eject-1.2-2.i386.rpm

使用 -v 好处是很多的,特别是当你需要用一行命令来安装多个软件的时候:

# rpm -iv *.rpm
Installing eject-1.2-2.i386.rpm
Installing iBCS-1.2-3.i386.rpm
Installing logrotate-1.0-1.i386.rpm

无耐心者的福音 -h

有时候一个安装包可能非常大,除了呆呆地看着硬盘的灯在闪,你找不到其他方式知道RPM的工作进度,还要多久才能安装完。加上-h选项,RPM会打印出#来显示进度,50个#的出现意味着安装完成。

# rpm -ih eject-1.2-2.i386.rpm
##################################################

一旦50个#出先了,那么就代表软件已经完成,这一点在你安装多个软件时也很有用:

# rpm -ivh *.rpm
eject          ##################################################
iBCS           ##################################################
logrotate      ##################################################

更多rpm -i 的选项

  • -vv:得到更多的信息
  • --test:只进行安装测试
  • --replacepkgs:覆盖安装
  • --replacefiles:即使覆盖了其他软件的文件,也照常安装
  • --nodeps:安装前不做依赖检查
  • --force:无论怎样,都给老子安装
  • --excludedocs:不安装文档
  • --includedocs:安装文档
  • --prefix :重定向安装包路径为
  • --noscripts:不执行安装前后的脚本命令
  • --percent:显示安装进度的百分比
  • --rcfile :使用作为备选的rcfile
  • --root:使用作为备选的root
  • --dbpath :使用来访问数据库
  • --ftpport :使用所指定的端口来执行基于FTP协议的安装
  • --ftpproxy :使用所指定的地址作为FTP代理
  • --ignorearch:不校验安装包的格式
  • --ignoreos:不检查安装包的操作系统信息

参考资料

Maximum RPM