rpm详解

关键词rpm                                          

用法: rpm [选项...]

查询选项 (参数 -q 或 --query):
-c, --configfiles           列出所有配置文件
-d, --docfiles             列出所有文档文件
--dump                   导出基本文件信息
-l, --list               列出包内的所有文件
--queryformat=QUERYFORMAT     使用紧跟的查询格式
-s, --state               显示文件列表的状态
-v, --verbose             显示详细的文件列表
-a, --all                 查询/校验所有包
-f, --file               查询/校验包的包含文件
-g, --group               查询/校验组内的包
-p, --package             查询/校验一个包文件(例如一个二进制的 *.rpm 文件)
--querytags               显示已知的查询标签
--specfile               查询规格文件
--whatrequires             查询/校验指定包的依赖关系
--whatprovides             查询/校验指定包的被依赖关系

校验选项 (参数 -V 或 --verify):
--nomd5[|=0x1]             不使用MD5分类校验文件
--nofiles[|=0x10000]         不校验包中的文件
--nodeps[|=0x20000]         不校验包的依赖关系
--noscript[|=0x40000]         不执行校验脚本(任何脚本)
-a, --all                 查询/校验所有包
-f, --file               查询/校验包所含的文件
-g, --group               查询/校验组内的包
-p, --package             查询/校验一个包文件(例如一个二进制的 *.rpm 文件)
--querytags               显示已知的查询标签
--specfile               查询规格文件
--whatrequires             查询/校验指定包的依赖关系
--whatprovides             查询/校验指定包的被依赖关系

签名选项:
--addsign                 往包内增加一个签名
--resign                 签名一个包(去除当前签名)
-K, --checksig             校验包的签名
--nogpg[&=~0x4]             忽略任何GPG的签名
--nomd5[&=~0x2]             不校验文件的MD5的校验数

数据库选项:
--initdb                 初始化数据库
--rebuilddb               从已安装包的头信息中重建数据库的反转列表

安装/升级/卸载选项:
--allfiles[|=0x40]           安装所有文件, 忽略找不到的配置项里面的部分
--allmatches[|=0x2]         卸载所有和项匹配的包。(如果中指定多个包则会产生一个错误信息)
--badreloc[|=0x8]           在非重定位包中重定位文件
-e, --erase=+       卸载包
--excludedocs[|=0x20]         不安装文档
--excludepath=         带引导组件的忽略文件 
--force[|=0x74]             --replacepkgs --replacefiles的快捷方式
-F, --freshen=+   在已安装的情况下升级包
-h, --hash[|=0x2]           为安装包打上哈希标记(最好带-v选项)
--ignorearch[|=0x2]         不校验包的体系
--ignoreos[|=0x1]           不校验包的操作系统
--ignoresize[|=0x180]         安装之前不检查磁盘空间
--includedocs             安装文档
--install=+       安装包
--justdb[|=0x8]             升级数据库,但是不修改文件系统
--nodeps                 不校验包的依赖关系
--noorder[|=0x8]           不重新记录包的安装信息到依赖性中
--noscripts[|=0xff0000]       不执行包的脚本
--notriggers[|=0x990000]       不执行被该安装包触发的任何脚本
--oldpackage[|=0x40]         升级到该包的一个旧版本
                      (--force 升级的时候,该操作自动执行)
--percent[|=0x1]           打印包的安装进度
--prefix=                 如果允许重定位,则重定位包到

--relocate==       从路径到重定位文件
--repackage[|=0x400]         重新打包保存下来的卸载包的文件
--replacefiles[|=0x30]       安装时用包文件替换已安装文件
--replacepkgs[|=0x4]         如果包已经存在,那么重新安装
--test[|=0x1]             不安装包,但是要检测能否正常运行
-U, --upgrade=+   升级包

所有rpm模式的通用选项:
--version                 打印所使用的rpm的版本信息
--quiet                 提供少量详细信息输出
-v, --verbose             提供更多的详细信息输出
--define=' '       使用值来定义宏
--eval=+             打印+的宏扩展
-r, --root=       使用作为顶层目录(默认: "/")
--macros=<...>         读入<...>来代替默认的宏文件
--rcfile=<...>         读入<...>来代替默认的rpmrc文件
--showrc                 显示最终的rpmrc和macro配置

通过popt alias/exec 实现的选项:
--scripts                 列出包中的所有安装/卸载脚本
--setperms               在包中设置文件的权限
--setugids               在包中设置文件的用户/组关系
--conflicts               列出此包的兼容性
--obsoletes   &nsp;           列出安装此包需要卸载的别的包
--provides               列出此包提供的兼容性
--requires               列出此包所需要的兼容性
--info                   列出包中的叙述信息
--changelog               列出该包的变更日志
--triggers               列出包中的触发脚本
--last                   根据安装时间列出包,最近时间的优先
--filesbypkg               列出每个包的所有文件
--redhatprovides           根据所包含的提供的兼容性查找包名(需要安装包rpmdb-redhat)
--redhatrequires           根据所依赖的包的兼容性查找包名(需要安装包rpmdb-redhat)
--buildpolicy=       设置包的根目录(例如,压缩man手册)
--with=             打开打包的<选项>配置
--without=           关闭打包的<选项>配置

帮助选项:
-?, --help               显示该帮助信息
--usage                 显示用法摘要 

******************************************************
1.如何不安装但是获取rpm包中的文件 
使用工具rpm2cpio和cpio 
rpm2cpio xxx.rpm | cpio -vi 
rpm2cpio xxx.rpm | cpio -idmv 
rpm2cpio xxx.rpm | cpio --extract --make-directories 
参数i和extract相同,表示提取文件。v表示指示执行进程 
d和make-directory相同,表示根据包中文件原来的路径建立目录 
m表示保持文件的更新时间。 


2.如何查看与rpm包相关的文件和其他信息 
下面所有的例子都假设使用软件包mysql-3.23.54a-11 
1.我的系统中安装了那些rpm软件包 
rpm -qa 讲列出所有安装过的包 
如果要查找所有安装过的包含某个字符串sql的软件包 
rpm -qa |grep sql 

3.如何获得某个软件包的文件全名 
rpm -q mysql 可以获得系统中安装的mysql软件包全名,从中可以获得 
当前软件包的版本等信息。这个例子中可以得到信息mysql-3.23.54a-11 

4.一个rpm包中的文件安装到那里去了? 
rpm -ql 包名 
注意这里的是不包括.rpm后缀的软件包的名称 
也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm。 
如果只是想知道可执行程序放到那里去了,也可以用which,比如 
which mysql 

5.一个rpm包中包含那些文件 
一个没有安装过的软件包,使用rpm -qlp ****.rpm 
一个已经安装过的软件包,还可以使用rpm -ql ****.rpm 

6.如何获取关于一个软件包的版本,用途等相关信息? 
一个没有安装过的软件包,使用rpm -qip ****.rpm 
一个已经安装过的软件包,还可以使用rpm -qi ****.rpm 


6.某个程序是哪个软件包安装的,或者哪个软件包包含这个程序 
rpm -qf `which 程序名` 返回软件包的全名 
rpm -qif `which 程序名` 返回软件包的有关信息 
rpm -qlf `which 程序名` 返回软件包的文件列表 
注意,这里不是引号,而是`,就是键盘左上角的那个键。 
也可以使用rpm -qilf,同时输出软件包信息和文件列表 


7.某个文件是哪个软件包安装的,或者哪个软件包包含这个文件 
注意,前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以 
用于可执行程序,也可以用于普通的任何文件。前提是知道这个文件名。 
首先获得这个程序的完整路径,可以用whereis或者which,然后使用rpm -qf例如: 
# whereis ftptop 
ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz 
# rpm -qf /usr/bin/ftptop 
proftpd-1.2.8-1 
# rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt 
proftpd-1.2.8-1 

总结: 
获得软件包相关的信息用rpm -q,q表示查询query,后面可以跟其他选项,比如 
i 表示info,获得软件包的信息; 
l 表示list,获得文件列表; 
a 表示all,在所有包中执行查询; 
f 表示file,根据文件进行相关的查询; 
p 表示package,根据软件包进行查询 
需要的查询条件可以使用grep产生,或者从"` `"中的命令行产生 


7.关于rpm软件包的一些相关知识 
1.什么是rpm 
rpm 即RedHat Package Management,是RedHat的发明之一 

8.为什么需要rpm 
在一个操作系统下,需要安装实现各种功能的软件包。这些软件包一般都有各自的 
程序,但是同时也有错综复杂的依赖关系。同时还需要解决软件包的版本,以及安装, 
配置,卸载的自动化问题。为了解决这些问题,RedHat针对自己的系统提出了一个 
较好的办法来管理成千上百的软件。这就是RPM管理系统。在系统中安装了rpm管理系统 
以后,只要是符合rpm文件标准的打包的程序都可以方便的安装,升级,卸载 

9.是不是所有的linux都使用rpm 
任何系统都需要包管理系统,因此很多linux都使用rpm系统。但rpm系统是为RH专门 
但是TL,Mandrake等系统也都使用rpm。由于rpm的源程序可以在别的系统上进行编译, 
所以有可能在别的系统上也使用rpm 
除了rpm,其他一些系统也有自己的软件包管理程序,例如debian的deb包, 
slakware也都有自己的包管理系统 

10.rpm包的文件名为什么那么长 
rpm包的文件名中包含了这个软件包的版本信息,操作系统信息,硬件要求等等。 
比如mypackage-1.1-2TL.i386.rpm,其中mypackage是在系统中登记的软件包的名字 
1.1是软件的版本号,2是发行号,TL表示用于TL操作系统,还可能是RH等。i386表示 
用于intel x86平台,还可能是sparc等。 

11.软件包文件名中的i386,i686是什么意思 
rpm软件包的文件名中,不仅包含了软件名称,版本信息,还包括了适用的硬件架构 
的信息。 
i386指这个软件包适用于intel 80386以上的x86架构的计算机(AI32) 
i686指这个软件包适用于intel 80686以上(奔腾pro以上)的x86架构的计算机(IA32) 
noarch指这个软件包于硬件架构无关,可以通用。 
i686软件包的程序通常针对CPU进行了优化,所以,向后兼容比较用以,i386的包在 
x86机器上都可以用。向前一般不兼容。不过现在的计算机,奔腾pro以下的CPU已经很少 
用,通常配置的机器都可以使用i686软件包 


12.不同操作系统发行的rpm包可否混用? 
对于已经编译成二进制的rpm包,由于操作系统环境不同,一般不能混用。 
对于以src.rpm发行的软件包,由于需要安装时进行本地编译,所以通常可以在不同 
系统下安装。 


13.使用rpm时遇到的一些特殊问题 
Q 我用rpm -e **.rpm无法删除rpm包 
A 包名不要包括rpm, 
rpm -e 包名,可以包含版本号等信息,但是不可以有后缀.rpm 

Q 在MS的系统下有没有读RPM文件的工具? 
A wincmd with rpm plugins..... 

Q 是否可以通过ftp安装安装升级rpm包? 
A 可以。rpm -ivh ftp://xxxxxxxx/PATH2SomeRPM 


Q rpm安装时已有的包版本过高怎么办? 
A 有时由于安装的软件包太老,而系统中相关的软件包版本比较新,所以可能需要 
安装的包依赖的一些文件会找不到。这时有两种解决办法, 
第一是在系统文件中找到和需要的文件功能相同或相似的文件,做一个符号链接到 
需要的目录下。 
第二是下载安装新版本的软件包。

******************************************************


从一般意义上说,软件包的安装其实是文件的拷贝,RPM安装软件包,也无外乎此。但RPM要更进一步、更聪明一些就需要多做些工作了。 

聪明的安装 
从一般意义上说,软件包的安装其实是文件的拷贝,即把软件所用的各个文件拷贝到特定目录。RPM安装软件包,无外乎此。但RPM要更进一步,更聪明一些。在安装前,它通常要执行以下操作: 

1.检查软件包的依赖(Dependency) 

RPM格式的软件包中可包含有依赖关系的描述,如软件执行时需要什么动态链接库,需要什么程序存在及版本号要求等。当RPM检查时发现所依赖的链接库或程序等不存在或不符合要求时,默认的做法是中止软件包安装。 

2.检查软件包的冲突(Conflicts) 

有的软件与某些软件不能共存,软件包制作者会将这种冲突记录到RPM软件包中。安装时,若RPM发现有冲突存在,将会中止安装。 

3.执行安装前脚本程序(Preinstall) 

此类程序由软件包制作者设定,需要在安装前执行。通常是检测操作环境,建立有关目录,清理多余文件等等,为顺利安装作准备。 

4.处理配置文件(Configfiles) 

RPM对配置文件(Configfiles)有着特别的处理。因为用户常常需要根据实际情况,对软件的配置文件做相应的修改。如果安装时简单地覆盖了此类文件,则用户又得重新手工设置,很麻烦。这种情况下,RPM做得比较明智:它将原配置文件换个名字保存了起来(原文件名后缀加上.rpmorig),用户可根据需要再恢复,避免重新设置的尴尬。 

5.解压软件包并存放到应位置 

这是最重要的部分,也是软件包安装的关键所在。在这一步,RPM将软件包解压缩,将其中的文件一个个存放到正确的位置,同时,文件的操作权限等属性相应设置正确。 

6.执行安装后脚本程序(Postinstall) 

此类程序为软件的正确执行设定相关资源,如修改inetd.conf、运行ldconfig程序以利新的动态链接库生效等等。 

7.更新RPM数据库 

安装后,RPM将所安装的软件及相关信息记录到其数据库中,便于以后升级、查询、校验和卸载。 

8.执行安装时触发脚本程序(Triggerin) 

触发脚本程序是指软件包满足某种条件(如已安装软件包sendmail,或file版本大于3.0)时才触发执行的脚本程序,它用于软件包之间的交互控制。触发脚本程序有三类:一是软件包安装时才触发的,称为安装时触发脚本程序(triggerin);二是软件包卸载前触发的,叫作卸载前触发脚本程序(triggerun);三是软件包卸载后才触发执行的,称作卸载后触发脚本程序(triggerpostun)。这些触发脚本程序,大大扩展了RPM软件包管理的功能。 

命令格式 
安装RPM格式的软件包,可使用如下命令格式: 

rpm -i [安装选项1 安装选项2…] 包裹文件1 包裹文件2… 

注:可用–install代替-i,效果相同。 

选项列表 

包裹文件 
对于要安装的RPM格式的包裹文件,RPM对其名字不作强制要求。用户可以使用以下三种方式的命名样式: 

1.典型的命名样式(常用): 

格式为:软件名-版本号-释出号.体系号.rpm 

注:体系号指的是执行程序适用的处理器体系,如i386体系,sparc体系等。体系号为src时表明为源代码包,否则为执行程序包。 

如abc-3.2-1.i386.rpm为执行程序包,软件名为abc,版本号为3.2,释出号为1,适用体系为i386,而abc-3.2-1.src.rpm则为源代码包。 

2.URL形式的命名样式(较常用): 

* FTP方式的命名格式:ftp://[用户名[:密码]@]主机[:端口]/包裹文件 

注:[]括住的内容表示可选。主机可以是主机名,也可是IP地址。包裹文件可含目录信息。如未指定用户名,则RPM采用匿名方式传输数据(用户名为anonymous)。如未指定密码,则RPM会根据实际情况提示用户输入密码。如未指定端口,则RPM使用默认端口(一般为21)。 

ftp://ftp.xxx.com/yyy.rpm(使用匿名传输,主机ftp.xxx.com,包裹文件yyy.rpm);
ftp://24.109.164.55:1024/pub/yyy.rpm(匿名FTP传输,主机IP:24.109.164.55,使用1024端口,包裹文件在/pub目录下);
ftp://zhsoft@ftp.xxx.com/yyy.rpm(主机ftp.xxx.com,FTP用户名zhsoft,如有密码,RPM将会自动提示输入);
ftp://zhsoft:password@ftp.xxx.com/yyy.rpm(主机ftp.xxx.com,FTP用户名zhsoft,密码password)。 

* HTTP方式的命名:http://主机[:端口]/包裹文件 

注:[]括住的内容可选。主机可以是主机名,也可是IP地址。包裹文件可含目录信息。如未指定端口,则RPM默认使用80端口。 

http://www.xxx.com/yyy.rpm(用HTTP获取www.xxx.com主机上的yyy.rpm文件);
又如http://www.xxx.com:8080/pub/yyy.rpm(用HTTP获取www.xxx.com主机上/pub目录下的yyy.rpm文件,使用端口8080)。 

3.其它形式(很少使用): 

命名格式:任意 

如将abc-3.2-1.i386.rpm改名为abc.txt,用RPM安装也会安装成功,其根本原因是RPM判定一个文件是否RPM格式,不是看名字,而是看内容,看其是否符合特定的格式。 

选项详解 
一、安装指定用选项 
1.hash(或-h):以#显示安装进度 

如果一个软件包很大、安装费时时,用户若想及时了解安装进度,必须用此选项。该选项以显示#号表示进度,每个#号表示2%的进度,总共要显示50个#号。下面安装MySQL软件包,如下所示: 

# rpm -i –hash MySQL-3.22.32-1.i386.rpm
##################################################


从上看出,软件包安装顺利完成。 

2.percent:以%(百分比)显示安装进度 

percent的含义是百分比,而此选项的作用就是以百分比(%)来显示安装进度的。同样是安装MySQL软件包,下面的输出就不一样: 

# rpm -i –percent MySQL-3.22.32-1.i386.rpm
%% 0.000000
%% 0.002600
%% 0.020586
……
%% 100.000000


上例中省略了很多输出(……表示)。因为如果软件包很大,则用–percent时输出的内容会很多,所以用户最好用–hash选项,以#号来表示安装进度,这样简洁明了。 

3.test:安装测试 

所谓安装测试,意即并非真正的安装,它不拷贝和建立任何文件。使用本选项的目的在于:检测软件包的依赖关系是否满足,是否存在潜在的冲突等等。 

# rpm -i –test autofs-3.1.3-2.i386.rpm
error: failed dependencies:
mktemp is needed by autofs-3.1.3-2


本例进行安装测试时发现了依赖方面的错误,autofs所需要的mktemp包不存在,安装中断。 

下面先安装mktemp软件包,再进行autofs安装测试,看情况怎么样: 

# rpm -i mktemp-1.5-2.i386.rpm
# rpm -i –test autofs-3.1.3-2.i386.rpm


由上看出,这次测试没有出现什么错误。 

4.replacepkgs:替换软件包 

为什么要替换软件包?原因可能是系统中的软件包已经破坏了,其中一个或多个文件丢失或损毁。如果用户想修复这个软件包,用直接安装的方法,RPM将报错退出: 

# rpm -V file
missing/usr/man/man1/file.1
# rpm -i file-3.26-6.i386.rpm
package file-3.26-6 is already installed


注:本例先用RPM校验命令校验一下file软件包,发现/usr/man/man1/file.1文件丢失。之后用安装命令安装,RPM提示软件包file-3.26-6已经安装了。(有关RPM校验命令,<<精通RPM之六--校验篇>>中将会有详细的介绍) 

如果采用–replacepkgs选项,结果又怎样呢? 

# rpm -i –replacepkgs file-3.26-6.i386.rpm
# rpm -V file


看来,RPM成功地替换了原软件包,校验一下该包,发现没有错误输出,所以现在的软件包是完整的。 

5.replacefiles:替换文件 

RPM是聪明的软件包管理器,它维护着每个已安装软件包的文件信息。如果在安装一个新的软件包时,RPM发现其中某个文件和已安装的某个软件包中的文件名字相同但内容不同,那么RPM就会认为这是一个文件冲突,会报错退出: 

# rpm -i ff-4.0-2.i386.rpm
file /root/my.a from install of ff-4.0-2 conflicts with file from package zoo-6.0-1


注:本例中RPM发现要安装的软件包ff-4.0-2与已安装的软件包zoo-6.0-1中,含有相同的一个文件/root/my.a,但其内容并不相同,所以提示了文件冲突的错误。 

如果用户想忽略这个错误,可使用–replacefiles选项,指示RPM发现文件冲突时,直接替换掉原文件即可。注意:除非用户对所冲突的文件有很深的了解,不要轻易替换文件,以免破坏已安装软件包的完整性,确保其能正常运行。 

# rpm -i –replacefiles ff-4.0-2.i386.rpm


采用该选项后,软件包能顺利安装了。 

另外,说到替换文件,若要安装的软件包中的文件已存在,但此文件并不属于任何软件包,RPM的做法是将文件换名保存(文件名后缀加.rpmorig),并且以警告信息提醒用户。如下所示: 

# rpm -i foo-6.0-1.i386.rpm
warning: /etc/foo.conf saved as /etc/foo.conf.rpmorig


6.allfiles:安装所有文件 

读者看到此选项,也许要问:难道RPM安装软件包不是安装其中所有的文件吗? 

我的回答是:如果是初次安装的话,RPM确是将包中所有文件全部安装。但是,如果是修复软件包(用–replacepkgs选项),那结果就不一定了。个中原因是:RPM包中有些配置文件可标识为missingok属性(missingok指的是即使丢失,照样OK),这样的包安装后,若这种类型的配置文件被删除,则修复时RPM默认的做法是不再安装这种类型的文件,除非采用–allfiles选项。下面看个实际的例子: 

# rpm -i foo-6.0-1.i386.rpm
# ls -l /etc/foo.conf
-rw-r–r– 1 root root9 Oct 11 09:50 /etc/foo.conf
# rm -f /etc/foo.conf
# rpm -i –replacepkgs foo-6.0-1.i386.rpm
# ls -l /etc/foo.conf
ls: /etc/foo.conf: 文件或目录不存在
# rpm -i –replacepkgs –allfiles foo-6.0-1.i386.rpm
# ls -l /etc/foo.conf
-rw-r–r– 1 root root9 Oct 11 09:50 /etc/foo.conf 

注:本例中已预先知道foo包中的配置文件/etc/foo.conf带有missingok属性。 

(1)用rpm -i命令安装foo包; 
(2)用ls命令列一下属于该包的配置文件/etc/foo.conf(能列出来,表明文件存在); 

(3)用rm命令删除了这个文件; 

(4)用rpm -i –replacepkgs命令修复foo软件包; 

(5)因为修复时未用–allfiles选项,所以用ls命令列文件/etc/foo.conf时出错了:文件不存在,没有安装上; 

(6)用rpm -i –replacepkgs –allfiles命令安装修复foo软件包; 

(7)再度用ls命令列文件,列了出来,表明这次安装上了。 

由本例看出,若用户确实想安全恢复(修复)某个软件包,最好使用–allfiles选项。一般情况下则不必这么做,因为带有missingok属性的配置文件本来就是可以丢失的嘛,不必太在意了。 

7.force:强制执行 

force的含义是强制。–force选项的作用就是强制安装软件包,不考虑软件包是否已安装,也不考虑有没有文件冲突。其效果相当于同时选用–replacepkgs与–replacefiles选项进行安装。 

8.excludedocs:不安装说明文档 

RPM有多个好功能,其中之一就是:它将文件分为配置文件,说明文档和其它文件三种,这样便于区别对待,灵活处理。 

基于RPM安装的LINUX发行版中包括5000多个说明文档,有50M字节,占用的空间不小。如果想节省空间,可使用–excludedocs选项以排除安装说明文档。 

如软件包file中包含/usr/man/man1/file.1和/usr/man/man4/magic.4两个说明文档。安装时若使用–excludedocs选项,这两个文档就不会被安装。 

# rpm -i –excludedocs file-3.26-6.i386.rpm
# ls -l /usr/man/man1/file.1
ls: /usr/man/man1/file.1: 文件或目录不存在
# ls -l /usr/man/man4/magic.4
ls: /usr/man/man4/magic.4: 文件或目录不存在


如果用户想让RPM默认不安装说明文档,则可以这么做:编辑~/.rpmmacros文件(用户主目录HOME下的RPM宏文件),加入下面一行: 

%_excludedocs 1 

其作用是定义RPM内部的_excludedocs宏为1,确认不安装说明文档。 

这样的话,就不用在命令行使用–excludedocs选项了。 

# rpm -i file-3.26-6.i386.rpm
# ls -l /usr/man/man1/file.1
ls: /usr/man/man1/file.1: 文件或目录不存在
# ls -l /usr/man/man4/magic.4
ls: /usr/man/man4/magic.4: 文件或目录不存在


9.includedocs:安装说明文档 

RPM一般情况下是安装说明文档的,但是如果用户自行修改了设定(象上面的例子),则RPM就不再安装说明文档了,除非特别指定,这就用到–includedocs选项。这种情况下,只有用此选项才能确保安装说明文档。 

# rpm -i –includedocs file-3.26-6.i386.rpm
# ls -l /usr/man/man1/file.1
-rwxr-xr-x 1 root root12023 Mar 23 1999 /usr/man/man1/file.1
# ls -l /usr/man/man4/magic.4
-rwxr-xr-x 1 root root 6625 Mar 23 1999 /usr/man/man4/magic.4


10.noscripts:不执行脚本程序 

一个RPM软件包中可包含五种脚本程序,即:安装前脚本程序,安装后脚本程序,卸载前脚本程序,卸载后脚本程序和校验脚本程序。安装时使用–noscripts选项,可禁止安装前与安装后脚本程序的执行。 

# rpm -i foo-6.0-1.i386.rpm
preinstall is running … done
postinstall is running … done


上面不禁止脚本程序的执行,下面不执行脚本程序,请看输出结果: 

# rpm -i –noscripts foo-6.0-1.i386.rpm


看,因为没有安装前与安装后脚本程序的执行,所以没有什么输出了。 

注意:一般用户不要使用此选项。此选项主要提供给软件包制作者使用的。通过禁止执行脚本程序,可以防止因安装带有BUG的软件包而宕掉整个系统。当软件包去掉了BUG后,此选项就不必使用了。 

11.nodeps:不检查依赖 

RPM管理软件包,不仅管理包中的所有文件,还同时管理着软件包之间的依赖关系。如A依赖于B运行,若B不存在了,则A也就运行不了了。RPM维护着这种关系,尽量避免破坏,以保证软件的正常运行。 

# rpm -i autofs-3.1.3-2.i386.rpm
error: failed dependencies:
mktemp is needed by autofs-3.1.3-2


本例安装中出现了依赖方面的错误(autofs依赖mktemp,但mktemp不存在),安装过程中断了。如果要RPM不管依赖关系是否正常都安装,就要用–nodeps选项,指示RPM不检查依赖,这样就能正常安装了。 

# rpm -i –nodeps autofs-3.1.3-2.i386.rpm


注:除非用户对软件包有足够了解,或只想看看软件,否则不要使用本选项,以维护软件间正常的依赖关系。 

12.notriggers:不执行触发程序 

为了软件包间的交互控制,RPM设计了三种触发程序:安装时触发程序,卸载前触发程序和卸载后触发程序。为了防止因某一软件包的安装而引发安装时触发程序的执行,可以使用–notriggers选项。 

13.ignorearch:忽略体系与ignoreos :忽略操作系统 

何谓体系?体系就是CPU的类别,有Intel的x86(如i386,i486系列)体系,有Sun的sparc体系等等。当一个软件包建立时,RPM就为其指定了所适用的CPU体系,也为其指定了所适用的操作系统。这样做的好处就是,RPM容易知道为一台计算机所建立的软件包是否适用于兼容于另一台计算机。RPM的资源配置文件(默认为/usr/lib/rpm/rpmrc)中,就定义了体系的兼容关系(arch_compat表达)和操作系统的兼容关系(os_compat表达)。RPM安装一个包裹文件时,要做这样一个兼容方面的检查。如果用户想忽略体系,不管其是否兼容,请用–ignorearch选项安装。如果也不管操作系统是否兼容,可用–ignoreos选项。需要指出的是,若非知道自己这样的目的,否则不要试图这样做。

14.ignoresize:不检查空间大小 

RPM安装软件包前,首先要检查当前系统是否有足够的剩余空间,如果空间不足的话,安装将无法完成。使用本选项的目的,在于指示RPM不做空间大小方面的检查,意即不管系统是否有容纳要安装的软件包的空间,照直安装就行了。 

15.relocate:重定位 

RPM软件包在制作过程中,可以定义一个或多个重定位前缀,以此方便软件的重定位(即把软件包中的文件放到自定义的目录下面),从而增加软件包安装的灵活性。 

本选项用于更换指定的重定位目录,如果一个包有多个重定位前缀,可以使用本选项多次。 

# rpm -qpl file-3.26-6.i386.rpm
/usr/bin/file
/usr/man/man1/file.1
/usr/man/man4/magic.4
/usr/share/magic
# rpm -i –relocate /usr=/tmp file-3.26-6.i386.rpm
# rpm -ql file
/tmp/bin/file
/tmp/man/man1/file.1
/tmp/man/man4/magic.4
/tmp/share/magic


注:本例中先用rpm -qpl列出包裹文件file-3.26-6.i386.rpm当中的文件,可以看到其中的文件均是以/usr开头的。之后进行重定位安装,将/usr换作/tmp。最后从列出已安装的file包的文件列表可以看出,原来的/usr目录前缀换作指定的前缀/tmp了,这样实现了软件的重定位。(关于RPM查询命令,详见<<精通RPM之五--查询篇>>) 

16.badreloc:强制重定位 

RPM软件包的重定位,依赖于制作时重定位前缀的定义。如果没有定义重定位前缀,或者用户安装时所指定的重定位前缀不存在,则RPM会报错退出,中断安装。此时,若用本选项,则RPM会不管这些错误,进行强制的重定位安装。注:本选项和–relocate选项同时使用时才有意义。 

如上例,采用并不存在的重定位前缀/usr/man进行安装: 

# rpm -i –relocate /usr/man=/tmp file-3.26-6.i386.rpm
path /usr/man is not relocateable for package file-3.26-6


RPM提示了错误:/usr/man目录在file-3.26-6包中是不可重定位的。 

如加上–badreloc选项,结果怎么样: 

# rpm -i –relocate /usr/man=/tmp –badreloc file-3.26-6.i386.rpm
# rpm -ql file
/usr/bin/file
/tmp/man1/file.1
/tmp/man4/magic.4
/usr/share/magic


由上可以看到,这样的强制重定位获得通过,之后再用查询命令rpm -ql列一下file包的文件,就会发现原来的/usr/man/man1/file.1定位成了/tmp/man1/file.1,而/usr/man/man4/magic.4则成了/tmp/man4/magic.4。怎么样?神奇吧! 

17.excludepath:不安装指定目录下的文件 

利用此选项,可以禁止RPM安装某些指定目录下的文件。如不想安装file软件包中的说明文档,除了可使用–excludedocs选项外,还可使用本选项。因为file的说明文档均在目录/usr/man下面。 

# rpm -i –excludepath /usr/man file-3.26-6.i386.rpm
# rpm -qls file
normal/usr/bin/file
not installed /usr/man/man1/file.1
not installed /usr/man/man4/magic.4
normal/usr/share/magic


注:例子中先安装file软件包,并用–excludepath禁止安装/usr/man下的文件,再用RPM查询命令rpm -qls列出file包的文件及状态,可以看到:/usr/man下的两个文件均未安装(not installed)。 

18.justdb:仅更新数据库 

安装软件包使用此选项后,RPM将只更新其数据库数据,文件系统不更新,意即并不拷贝和建立包中的文件。 

# rpm -i –justdb file-3.26-6.i386.rpm
# rpm -qls file
normal/usr/bin/file
normal/usr/man/man1/file.1
normal/usr/man/man4/magic.4
normal/usr/share/magic
# ls -l /usr/bin/file
ls: /usr/bin/file: 文件或目录不存在


注:例子中安装file包但指明只更新据库,结果是:虽然用查询命令查到该软件包中所有文件状态均正常(normal),但用ls命令列包中所含文件/usr/bin/file,该文件却不存在。这表明包中文件并未建立。 

19.prefix:指定重定位前缀 

如前所述,可重定位的软件包可含一个或多个重定位前缀,可用–relocate选项来改变某个重定位前缀之值。–prefix选项仅能用来改变默认的重定位前缀(默认是第一个重定位前缀),它不需要说明原重定位前缀。下面的例子同样将file包安装到/tmp目录: 

# rpm -qpl file-3.26-6.i386.rpm
/usr/bin/file
/usr/man/man1/file.1
/usr/man/man4/magic.4
/usr/share/magic
# rpm -i –prefix /tmp file-3.26-6.i386.rpm
# rpm -ql file
/tmp/bin/file
/tmp/man/man1/file.1
/tmp/man/man4/magic.4
/tmp/share/magic


20.ftpproxy:指定FTP代理主机 

本选项指定FTP代理主机,主机可以是主机名,也可以是IP地址。 

21.ftpport:指定FTP端口 

本选项指定FTP协议使用的TCP端口,系统默认是21。 

请看下面的例子: 

# rpm -iv –ftpport 8888 ftp://root@xwboc/tmp/file-3.26-6.i386.rpm
Password for root@xwboc: 
Password for root@xwboc: 
Retrieving ftp://root@xwboc/tmp/file-3.26-6.i386.rpm
file-3.26-6


本例中用FTP方式安装file软件包,数据传输使用8888端口。执行中,RPM先提示输入root用户的密码两次,之后下载(retrieve)软件,最后成功安装。 

22.httpproxy:指定HTTP代理主机 

本选项指定HTTP代理主机,主机可以是主机名,也可以是IP地址。 

23.httpport:指定HTTP端口 

本选项指定HTTP协议使用的TCP端口,系统默认是80。 

下面的例子就指定了80端口来安装autofs软件,当然不指定也行,因为系统默认的就是这个端口。 

# rpm -iv –httpport 80 http://24.109.164.55/rpms/autofs-3.1.3-2.i386.rpm
Retrieving http://24.109.164.55/rpms/autofs-3.1.3-2.i386.rpm
autofs-3.1.3-2


注:同FTP方式一样,RPM都是下载再安装。 

二、通用选项 
所谓通用选项,就是不管是安装,升级,卸载还是其它软件包操作,统统适用的选项。 

这样的选项主要以下几个: 

1.-v:显示附加信息 

一般情况下,RPM和不少LINUX命令(如cp,rm,mv等)一样,都本着尽可能少输出信息的原则(除非必要,否则不要输出),这样做是为了避免浪费CPU资源。所以,当用户使用某个命令后没有什么输出,这就意味着命令执行成功了。如果有什么错误,程序会提示的。RPM也是这个样子。为了使RPM输出多一点的信息,可以使用-v选项。 

如不带此选项安装file包,没有输出: 

# rpm -i file-3.26-6.i386.rpm


而采用-v选项后安装时输出了包名: 

# rpm -i -v file-3.26-6.i386.rpm
file-3.26-6


2.-vv:显示调试信息 

选用-vv选项,可以使RPM输出更多的信息。这些信息,主要供RPM软件开发者研究使用的,一般用户也可以看看,从中可以知道RPM究竟干些什么。 

下面采用此选项安装file包,同时使用管道线(|)将输出数据送nl命令,以带行号输出每行数据。 


从执行结果看,输出的信息很多,其中以D:开头的行均是调试信息。现在逐行解释: 

第1行:统计要安装的软件包个数; 

第2行:RPM找到1个包; 

第3行:查看哪些包需要下载(这些要下载的包,都是以FTP或HTTP形式书写的包名); 

第4行:下载了0个包; 

第5-10行:取包裹文件的文件头信息,算出软件包占用的空间68019(字节),以利检查 

系统是否有足够空间。 

第11行:打开RPM数据库; 

第12行:找到0个源代码包,1个执行代码包; 

第13-18行:检查软件包的依赖关系。其依赖(requires)的东西均得到满足(satisfied)。 

第19行:准备安装执行代码包; 

第20行:取得已安装文件系统的列表; 

第21-26行:再度取包裹文件头信息,算出软件包占用空间; 

第27-31行:列出包中文件及要执行的操作,第27行的test=0表示不是进行安装测试, 

file包中的文件均要执行创建操作(create)。 

第32行:如果有安装前执行脚本程序的话,执行它; 

第33行:安装软件包file-3.26-6; 

第34行:如果有安装后执行脚本程序的话,执行它。 

3.root:指定根目录 

指定根目录ROOT,其作用在于将系统所有操作限定在指定的目录下面,这样RPM操作的数据库位置变了,软件包的安装位置也变了。它是通过chroot系统调用实现的。RPM默认的数据库目录是/var/lib/rpm,如果指定根目录为/usr,则RPM的数据库目录将变为/usr/var/lib/rpm。同样,如果包中有个文件为/etc/zhsoft.txt,则安装后为/usr/etc/zhsoft.txt。 

看下面的例子: 

# rpm -i –root /usr file-3.26-6.i386.rpm
failed to open /usr/var/lib/rpm/packages.rpm

error: 不能打开 /usr/var/lib/rpm/packages.rpm


注:指定RPM根目录为/usr安装file出现错误,RPM打不开/usr/var/lib/rpm/packages.rpm文件,这是因为实际上在/usr/var/lib/rpm目录下没有任何RPM数据库。如果想成功安装,可用初始化RPM数据库命令来建立RPM数据库,命令是rpm –initdb –root /usr(这些功能将在以后讲到)。 

4.rcfile:指定RPM资源配置文件 

RPM的资源配置文件里,存放着RPM的默认设置,有编译选项optflags,体系定义arch_canon,兼容定义arch_compat,宏文件定义macrofiles等。RPM默认的资源配置文件(按读取顺序)为:/usr/lib/rpm/rpmrc,/etc/rpmrc,~/.rpmrc。(后两个文件现在意义不大了,如今一般换作RPM宏文件了。较之资源配置文件,宏文件有更大的灵活性。) 

如果想让RPM使用用户指定的资源配置文件,就用–rcfile来设定,可同时设定多个文件,文件间以冒号(:)分隔,如/usr/lib/rpm/rpmrc:/etc/rpmrc:~/.rpmrc这种形式。 

5.dbpath:指定RPM数据库目录 

本选项不同于–root选项,它仅仅是指定RPM数据库的目录,并不改变安装文件的位置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值