|
从一般意义上说,软件包的安装其实是文件的拷贝,RPM安装软件包,也无外乎此。但RPM要更进一步、更聪明一些就需要多做些工作了。 聪明的安装 命令格式 选项列表 1.典型的命名样式(常用): 格式为:软件名-版本号-释出号.体系号.rpm 2.URL形式的命名样式(较常用) 3 HTTP方式的命名:格式为:http://主机[:端口]/包裹文件 3.其它形式(很少使用): # rpm -i --hash MySQL-3.22.32-1.i386.rpm 从上看出,软件包安装顺利完成。 2.percent:以%(百分比)显示安装进度 # rpm -i --percent MySQL-3.22.32-1.i386.rpm 上例中省略了很多输出(......表示)。因为如果软件包很大,则用--percent时输出的内容会很多,所以用户最好用--hash选项,以#号来表示安装进度,这样简洁明了。 3.test:安装测试 # rpm -i --test autofs-3.1.3-2.i386.rpm 本例进行安装测试时发现了依赖方面的错误,autofs所需要的mktemp包不存在,安装中断。 下面先安装mktemp软件包,再进行autofs安装测试,看情况怎么样: # rpm -i mktemp-1.5-2.i386.rpm 由上看出,这次测试没有出现什么错误。 4.replacepkgs:替换软件包 # rpm -V file 注:本例先用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成功地替换了原软件包,校验一下该包,发现没有错误输出,所以现在的软件包是完整的。 5.replacefiles:替换文件 # rpm -i ff-4.0-2.i386.rpm 注:本例中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 6.allfiles:安装所有文件 # rpm -i foo-6.0-1.i386.rpm 注:本例中已预先知道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:强制执行 8.excludedocs:不安装说明文档 基于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 如果用户想让RPM默认不安装说明文档,则可以这么做:编辑~/.rpmmacros文件(用户主目录HOME下的RPM宏文件),加入下面一行: %_excludedocs 1 其作用是定义RPM内部的_excludedocs宏为1,确认不安装说明文档。 这样的话,就不用在命令行使用--excludedocs选项了。 # rpm -i file-3.26-6.i386.rpm 9.includedocs:安装说明文档 # rpm -i --includedocs file-3.26-6.i386.rpm 10.noscripts:不执行脚本程序 # rpm -i foo-6.0-1.i386.rpm 上面不禁止脚本程序的执行,下面不执行脚本程序,请看输出结果: # rpm -i --noscripts foo-6.0-1.i386.rpm 看,因为没有安装前与安装后脚本程序的执行,所以没有什么输出了。 注意:一般用户不要使用此选项。此选项主要提供给软件包制作者使用的。通过禁止执行脚本程序,可以防止因安装带有BUG的软件包而宕掉整个系统。当软件包去掉了BUG后,此选项就不必使用了。 11.nodeps:不检查依赖 # rpm -i autofs-3.1.3-2.i386.rpm 本例安装中出现了依赖方面的错误(autofs依赖mktemp,但mktemp不存在),安装过程中断了。如果要RPM不管依赖关系是否正常都安装,就要用--nodeps选项,指示RPM不检查依赖,这样就能正常安装了。 # rpm -i --nodeps autofs-3.1.3-2.i386.rpm 注:除非用户对软件包有足够了解,或只想看看软件,否则不要使用本选项,以维护软件间正常的依赖关系。 12.notriggers:不执行触发程序 13.ignorearch:忽略体系与ignoreos :忽略操作系统 14.ignoresize:不检查空间大小 15.relocate:重定位 本选项用于更换指定的重定位目录,如果一个包有多个重定位前缀,可以使用本选项多次。 # rpm -qpl file-3.26-6.i386.rpm 注:本例中先用rpm -qpl列出包裹文件file-3.26-6.i386.rpm当中的文件,可以看到其中的文件均是以/usr开头的。之后进行重定位安装,将/usr换作/tmp。最后从列出已安装的file包的文件列表可以看出,原来的/usr目录前缀换作指定的前缀/tmp了,这样实现了软件的重定位。(关于RPM查询命令,详见<<精通RPM之五--查询篇>>) 16.badreloc:强制重定位 如上例,采用并不存在的重定位前缀/usr/man进行安装: # rpm -i --relocate /usr/man=/tmp file-3.26-6.i386.rpm 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/man/man1/file.1定位成了/tmp/man1/file.1,而/usr/man/man4/magic.4则成了/tmp/man4/magic.4。怎么样?神奇吧! 17.excludepath:不安装指定目录下的文件 # rpm -i --excludepath /usr/man file-3.26-6.i386.rpm 注:例子中先安装file软件包,并用--excludepath禁止安装/usr/man下的文件,再用RPM查询命令rpm -qls列出file包的文件及状态,可以看到:/usr/man下的两个文件均未安装(not installed)。 18.justdb:仅更新数据库 # rpm -i --justdb file-3.26-6.i386.rpm 注:例子中安装file包但指明只更新数据库,结果是:虽然用查询命令查到该软件包中所有文件状态均正常(normal),但用ls命令列包中所含文件/usr/bin/file,该文件却不存在。这表明包中文件并未建立。 19.prefix:指定重定位前缀 # rpm -qpl file-3.26-6.i386.rpm 20.ftpproxy:指定FTP代理主机 21.ftpport:指定FTP端口 请看下面的例子: # rpm -iv --ftpport 8888 ftp://root@xwboc/tmp/file-3.26-6.i386.rpm 本例中用FTP方式安装file软件包,数据传输使用8888端口。执行中,RPM先提示输入root用户的密码两次,之后下载(retrieve)软件,最后成功安装。 22.httpproxy:指定HTTP代理主机 23.httpport:指定HTTP端口 # rpm -iv --httpport 80 http://24.109.164.55/rpms/autofs-3.1.3-2.i386.rpm 注:同FTP方式一样,RPM都是下载再安装。 二、通用选项 1.-v:显示附加信息 如不带此选项安装file包,没有输出: # rpm -i file-3.26-6.i386.rpm 而采用-v选项后安装时输出了包名: # rpm -i -v file-3.26-6.i386.rpm 2.-vv:显示调试信息 下面采用此选项安装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:指定根目录 看下面的例子: # rpm -i --root /usr file-3.26-6.i386.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使用用户指定的资源配置文件,就用--rcfile来设定,可同时设定多个文件,文件间以冒号(:)分隔,如/usr/lib/rpm/rpmrc:/etc/rpmrc:~/.rpmrc这种形式。 5.dbpath:指定RPM数据库目录 |
|
升级做什么 RPM的升级功能是它受到用户好评的原因之一。因为用户自己将一个软件包从旧版本升级到新版本,特别是大型软件,需要有经验的支持和技术的积累,比较复杂,而用RPM升级软件,只需一个rpm -U命令就可以了,极大方便了用户。 软件升级基本做两项工作,一是安装新版本,二是卸载旧版本。RPM还有一项重要的工作要做,这就是妥善处理配置文件(CONFIG FILE)。若直接采用安装方式,则用户已配置好的配置文件就会被覆盖,不符合用户要求。 配置文件处理 6. 当没有原检查和时: 升级命令格式 选项列表 选项说明
注: 命令执行后输出了软件包标识lze-6.0-1,表明升级到老版本成功了。
|
我们一起在风雨中前行
|
RPM不仅在安装,升级,卸载方面工作出色,而且在查询方面比其它软件包管理工具更胜一筹。这从以下几种情况可以看出: * 当你在浏览系统文件时,发现一个文件,想知道它来自哪个软件包时,可以用RPM来查询得知; * 当你的朋友给你发送来一个软件包,但你不知道这是个什么样的软件包,不知道它做些什么,安装些什么,来源是哪里。这时,你可以用RPM查询搞定; * 几个月前你安装了XFree86窗口软件,但现在你忘了它的版本号,也不知它的说明文档在哪里。这时,你可以用RPM查询一下这个软件包,得到这方面的信息。 RPM的查询还有一个高级功能,即定制输出功能。你可用--queryformat(或-qf)来定制一下输出格式,这样,RPM查询得到的信息将以你定制的格式输出,这样很是方便,尤适合于程序的自动处理。 命令格式 选项列表 指定用选项可分为如下几类: 注: 本例查询结果中前6个为"应用/编辑器"类别,后8个为"应用/文件"类别。 现在知道了,它在inet6-apps-0.36-3包中。命令中-qf是-q -f的缩写,当选项仅带一个减号时,多个选项可以合并在一起,如-a -b -c三个选项可写作-abc,执行效果相同。 注: 本例从系统中查询哪些软件包需要/bin/ps和libc.so.6功能,通过管道输出前10行内容。 注: 本例从系统中查询有哪些软件包提供libc.so.6与/bin/ps功能,结果是glibc-2.1.2-12包提供了libc.so.6,而没有包提供/bin/ps功能。 注: 本例查询后得知,安装或卸载foo-8.0-1包,将会触发与file包相关的脚本程序执行。 2. 查询未安装的软件包: (仅有一个选项可用) 注: 本例查询ftp形式的包裹,显示其文件列表(-l选项使然,下面要讲到)。ftp用户名zzz,密码为pass,远程机为linux,文件名为/zhsoft/file-3.26-6.i386.rpm,ftp使用2121端口。 You should install the file package, since the file command is such a 上述输出中,包含多个域,各个域的含义为: 2. -l (或--list) : 显示软件包文件列表
3. -d (或--docfiles) : 显示软件包说明文档RPM将软件包中的文件分为三类,一是配置文件,一是说明文档,再一是其它文件(包括可执行程序及数据文件等)。通过-d选项,可列出包中所有说明文档。下例列出file包中说明文档: 4. -c (或--configfiles) : 显示软件包配置文件使用本选项可列出包中所有配置文件。下例列出lze包中的配置文件: 5. -s (或--state) : 显示软件包文件状态RPM已安装的软件包中各个文件可拥有如下4种状态: 注: 本例先安装file包裹文件,选用--excludedocs表明不安装说明文档。而后再查询file包文件的状态,可以看到其说明文档均为not installed(未安装),其它文件为normal(正常)状态。 6. -R (或--requires) : 显示软件包所需的功能 注: 本例查询lze包所需的功能。 7. --provides : 显示软件包提供的功能 注: 本包裹文件提供的功能是libz.so.1动态链接库。 8. --conflicts : 显示软件包冲突的功能 注: 本例显示at包与版本号小于1.5的crontabs包有冲突存在。 9. --scripts : 显示软件包内置的脚本程序 # rpm -q --scripts zsh-3.0.7-4 | nl 注: 本例利用管道技术给查询的每行输出加上了行号,便于观察解释。 10. --triggers : 显示软件包内置的触发脚本程序 注: 输出的第1行说明脚本程序的类别(为卸载后触发脚本程序triggerpostun),用什么程序解释(一般为/bin/sh),和触发的条件(在--之后描述)。本例的触发条件为zsh的版本小于或等于3.0.7-2。如果条件成立,则此脚本程序将会执行。 输出的第2-6行为卸载后触发脚本程序的源代码。 11. --changelog : 显示软件维护记录 注: 从本例中就可以看出来,维护记录的书写有一定的规范:以星号(*)开头的行记录维护时间,维护人及其电子邮箱,而以减号(-)开头的行则记录维护的具体内容。 12. --dump : 显示软件包中所有文件的属性信息 现在根据例子的输出,解释一下RPM包中各个文件所拥有的属性信息:(以第1行为例) 三、定制输出类 定制输出要指定格式化的字符串(类似printf的格式串),该字符串以单引号'或双引号"引住。格式串中可包括普通文本,含转义符的文本,功能标签和数组循环三种不同的组件。 * 普通文本 * 含转义符的文本 转义序列如下:
%[输出宽度]{功能标签} 功能标签书写不区分大小写,即NAME也可输作name,Name等等。功能标签还可以带有选项,选项用":选项名"表示,选项名有大小写之分。如%{FILEMODES}默认以数字形式输出,如采用perms选项,即%{FILEMODES:perms},输出结果将采用rwx的形式。请看下面的例子: 注: %{filenames}表示包中的文件名。 RPM常用功能标签表 注: 可用rpm --querytags命令查到RPM内置的所有功能标签。 * 数组循环 下面的例子以数组循环的方式,输出file包所含的各个文件的文件名及权限,同时输出每一个文件时都要先输出软件包标识。
|