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将会有两个步骤来处理这个问题:
- 把原来的文件改名为cdp-config.rpmorig.
- 使用安装包中的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:不检查安装包的操作系统信息