RPM不仅在安装,升级,卸载方面工作出色,而且在查询方面比其它软件包管理工具更胜一筹。这从以下几种情况可以看出:
* 当你在浏览系统文件时,发现一个文件,想知道它来自哪个软件包时,可以用RPM来查询得知; * 当你的朋友给你发送来一个软件包,但你不知道这是个什么样的软件包,不知道它做些什么,安装些什么,来源是哪里。这时,你可以用RPM查询搞定; * 几个月前你安装了XFree86窗口软件,但现在你忘了它的版本号,也不知它的说明文档在哪里。这时,你可以用RPM查询一下这个软件包,得到这方面的信息。 RPM的查询还有一个高级功能,即定制输出功能。你可用——queryformat(或-qf)来定制一下输出格式,这样,RPM查询得到的信息将以你定制的格式输出,这样很是方便,尤适合于程序的自动处理。 命令格式 查询RPM格式的软件包,可使用如下命令格式:
注: 也可使用——query代替-q,效果相同。 选项列表 选项详解 指定用选项中ftp与http相关的四个选项(——ftpproxy,——ftpport,——httpproxy,——httpport)和通用选项的解释,请参见<<精通RPM之二——安装篇>>,本文不再赘述。下面对指定用选项做些解释: 指定用选项可分为如下几类: 一、软件包选择类 此类选项在一次只能选择一个,选择多个时RPM将提示错误: rpm: one type of query/verify may be performed at a time 从查询方面看,一个是查询那些已安装的软件包,一个是查询未安装的软件包。 1. 查询已安装的软件包,使用下列选项: (1) -a (或——all) : 查询所有已安装的软件包
注: 本例查找当前系统中安装的所有软件包,输出很多,仅列出几个,剩下的省略掉了(以......表示)。 (2) -g (或——group) : 查询有哪些软件包属于指定类别 RPM根据软件功用的不同,将软件分为以下若干类:(括号内为注释)
注意: 类别是大小写敏感的,这一点输入时要小心。如果用户想要查询当前系统安装了哪些游戏类的软件包,可这样做:
如果用户想查询若干类别的软件包时,可以把类别都列出来,一起查询,如:
注: 本例查询结果中前6个为"应用/编辑器"类别,后8个为"应用/文件"类别。 (3) -f (或——file) : 查询有哪些软件包拥有指定文件这个选项非常有用。当用户不清楚某个文件属于哪个软件包时,可试试这个选项。假如我记不清/usr/sbin/ftpd这个文件在哪个包中,现在用RPM查询:
现在知道了,它在inet6-apps-0.36-3包中。命令中-qf是-q -f的缩写,当选项仅带一个减号时,多个选项可以合并在一起,如-a -b -c三个选项可写作-abc,执行效果相同。 (4) ——whatrequires : 查询有哪些包需要指定功能 本选项指示RPM从所有已安装的软件包中,查询有哪些软件包提供了用户指定的功能,命令行上可输入一个或多个功能。
注: 本例从系统中查询哪些软件包需要/bin/ps和libc.so.6功能,通过管道输出前10行内容。 (5) ——whatprovides : 查询有哪些包提供指定功能 本选项指示RPM从所有已安装的软件包中,查询有哪些软件包提供了用户指定的功能。命令行上可输入一个或多个功能。
注: 本例从系统中查询有哪些软件包提供libc.so.6与/bin/ps功能,结果是glibc-2.1.2-12包提供了libc.so.6,而没有包提供/bin/ps功能。 (6) ——triggeredby : 查询有哪些包被指定的包触发本选项指示RPM从所有已安装的软件包中,查询有哪些包可被用户指定的包触发。指定的包可输入一个或多个。
注: 本例查询后得知,安装或卸载foo-8.0-1包,将会触发与file包相关的脚本程序执行。 2. 查询未安装的软件包: (仅有一个选项可用) (1) -p : 查询指定包裹文件的信息 使用本选项,通过指定一个或多个包裹文件名,RPM就可以获取相应包裹的有关信息。包裹文件可以是一般形式,也可是ftp/http形式。
注: 本例查询ftp形式的包裹,显示其文件列表(-l选项使然,下面要讲到)。ftp用户名zzz,密码为pass,远程机为linux,文件名为/zhsoft/file-3.26-6.i386.rpm,ftp使用2121端口。 二、信息显示类 本类选项可同时选择多个,以显示多种信息。 1. -i : 显示软件包信息 当用户需要了解软件包的头部信息时,要使用该选项。
上述输出中,包含多个域,各个域的含义为:
2. -l (或——list) : 显示软件包文件列表 当用户想知道软件包包含哪些文件时,要使用该选项。输出时,一行一个文件名,形成文 件列表。下例列出file包中文件:
注: 本例列文件时选用了通用选项-v,这样列出的格式同ls命令列出的格式,从中可以看到各个文件的权限,属主,属组,大小,最后修改时间及文件名等信息。 3. -d (或——docfiles) : 显示软件包说明文档RPM将软件包中的文件分为三类,一是配置文件,一是说明文档,再一是其它文件(包括可执行程序及数据文件等)。通过-d选项,可列出包中所有说明文档。下例列出file包中说明文档:
4. -c (或——configfiles) : 显示软件包配置文件使用本选项可列出包中所有配置文件。下例列出lze包中的配置文件:
5. -s (或——state) : 显示软件包文件状态RPM已安装的软件包中各个文件可拥有如下4种状态: * normal(正常): 这表明文件未被其它软件包修改过。 * replaced(已替换): 这表明文件已被其它软件包修改替换过了,不再是原先的文件了。* not installed(未安装): 这表明文件未安装。有一种原因可导致这种情况发生,这就是当安装软件包时使用了——excludedocs选项(或是通过设置%_excludedocs宏为1),说明文档未被安装到系统中。当用RPM查询此软件包状态时,所有说明文档均显示此状态。 * net shared(网络共享): 这表明文件处于网络共享状态。这一状态是RPM用来支持NFS(网络文件系统)的,用于避免一个NFS客户端系统删除一个正在共享的文件时,另一NFS客户端系统无法正常使用含此文件的软件包。有两种情况可使文件在此状态,一是文件安装在真实网络共享的目录里,二是文件安装在RPM资源配置文件中%_netsharedpath宏所确定的目录里。
注: 本例先安装file包裹文件,选用——excludedocs表明不安装说明文档。而后再查询file包文件的状态,可以看到其说明文档均为not installed(未安装),其它文件为normal(正常)状态。 6. -R (或——requires) : 显示软件包所需的功能 所谓功能,可以是软件包标识,可以是文件(如共享库libc.so.6等),也可以是虚拟的名字。软件包的依赖关系,就是依靠功能来实现的。RPM安装软件包时,如果所需功能不存在,则其依赖关系不满足,RPM将中断安装过程。
注: 本例查询lze包所需的功能。 7. ——provides : 显示软件包提供的功能 一个软件包,可以提供若干功能,这些功能可以是动态链接库等实际的文件,也可以是虚拟的名字(只要其它软件包可以用就行了)。如果想查询某个包提供了哪些功能,要用——provides 选项。 下面的例子查询一个包裹文件所提供的功能:
注: 本包裹文件提供的功能是libz.so.1动态链接库。 8. ——conflicts : 显示软件包冲突的功能 何谓冲突?冲突就是不同软件包之间不能共存的现象。RPM制作软件包时,可以记录下与本软件包不能共存的功能,这样安装该包时,若冲突的功能已然存在,则RPM将中止安装。 下面的例子查询at-3.1.7-8包是否有与其冲突的功能:
注: 本例显示at包与版本号小于1.5的crontabs包有冲突存在。 9. ——scripts : 显示软件包内置的脚本程序 scripts即脚本,指的是用SHELL语言编写的程序。选用本选项时,RPM将输出软件包所含的各类脚本程序的内容。总共有5类这样的脚本程序,即安装前脚本程序(preinstall),安装后脚本程序(postinstall),卸载前脚本程序(preuninstall),卸载后脚本程序(postuninstall)和校验脚本程序(verify)。 下面的例子列出zsh包的脚本程序:
注: 本例利用管道技术给查询的每行输出加上了行号,便于观察解释。 第2-8行: 为安装后脚本程序(postinstall)的源代码; 第10-13行: 为卸载前脚本程序(preuninstall)的源代码; 第15-23行: 为卸载后脚本程序(postuninstall)的源代码。 例中所有脚本程序均通过/bin/sh解释执行,本例没有安装前脚本程序(preinstall)和 校验脚本程序(verify)。 10. ——triggers : 显示软件包内置的触发脚本程序 触发脚本程序是scripts类脚本程序的扩展,它用于软件包之间的交互控制。触发脚本 程序有安装时触发脚本程序(triggerin),卸载前触发脚本程序(triggerun)和卸载后触发脚 本程序(triggerpostun)三种。 下面的例子列出zsh包中的触发脚本程序:
注: 输出的第1行说明脚本程序的类别(为卸载后触发脚本程序triggerpostun),用什么程序解释(一般为/bin/sh),和触发的条件(在——之后描述)。本例的触发条件为zsh的版本小于或等于3.0.7-2。如果条件成立,则此脚本程序将会执行。 输出的第2-6行为卸载后触发脚本程序的源代码。 11. ——changelog : 显示软件维护记录 changelog即软件维护记录,用它来记录什么人,什么时间,改动了软件的什么地方。通 过查看维护记录,开发者或用户可以了解软件的开发进展情况。 下面的例子查询lze包的维护情况:
注: 从本例中就可以看出来,维护记录的书写有一定的规范:以星号(*)开头的行记录维护时间,维护人及其电子邮箱,而以减号(-)开头的行则记录维护的具体内容。 12. ——dump : 显示软件包中所有文件的属性信息 如果用户想查看某个软件包内文件的属性信息,请用——dump选项。
现在根据例子的输出,解释一下RPM包中各个文件所拥有的属性信息:(以第1行为例) /usr/bin/file : 为文件名; 23948 : 指文件大小(字节数); 922138347 : 指文件最后修改时间(秒数); abaf6cfd51588ac7c484526fbdb84e5b : 指根据文件内容计算出的MD5检查和; 0100755 : 指文件存取权限; root : 指文件属主; root : 指文件属组; 0 : 配置文件标志,为0表示该文件非配置文件,为1表明该文件是配置文件; 0 : 说明文档标志,为0表示该文件非说明文档,为1表明该文件是说明文档; 0 : 指文件类型,为0表示普通文件,非0表示设备文件,包含主从设备号; X : 符号连接内容,如果文件不是符号连接,则此值为X。 三、定制输出类 定制输出是RPM一项强有力的功能,当用户想要RPM按自己的格式输出软件包信息时,可以通过使用——qf(或——queryformat)选项来实现定制。 定制输出要指定格式化的字符串(类似printf的格式串),该字符串以单引号‘或双引号"引住。格式串中可包括普通文本,含转义符的文本,功能标签和数组循环三种不同的组件。 * 普通文本 格式串中的普通文本将按原样输出。 * 含转义符的文本 RPM定义的转义符为\,称作反斜杠。当RPM遇到此字符时,会根据预先定义的转义序列,把后面的字符解释后输出。 转义序列如下:
* 功能标签 RPM内置了很多功能标签,如NAME表示软件名,VERSION表示版本号,RELEASE表示释出号等。输出功能标签所表示的内容时,需用这样一种格式: %[输出宽度]{功能标签} 注:输出宽度可选,正值表示右对齐输出,负值表示左对齐输出。 如格式串中使用%{NAME}时将输出软件名,使用%20{NAME}时则右对齐输出软件名,宽度为20,而使用%-20{NAME}时则按宽度为20左对齐输出软件名。看看下面的实际例子就会明白:
功能标签书写不区分大小写,即NAME也可输作name,Name等等。功能标签还可以带有选项,选项用":选项名"表示,选项名有大小写之分。如%{FILEMODES}默认以数字形式输出,如采用perms选项,即%{FILEMODES:perms},输出结果将采用rwx的形式。请看下面的例子:
注: %{filenames}表示包中的文件名。 RPM常用功能标签表 注: 可用rpm ——querytags命令查到RPM内置的所有功能标签。 * 数组循环 对于功能标签是数组的,可以用数组循环(用[与]括住的部分)来输出数组的全部内容。数组循环内部可包含功能标签,普通文本和含转义符的文本。RPM将根据循环内部一个或多个数组类型的功能标签所拥有的单元个数,取其最小值,循环同样次数,输出解释或转义后的数据。对于功能标签仅含一个单元的,若想输出多次,则需要在功能标签前面加个等号(=)。 下面的例子以数组循环的方式,输出file包所含的各个文件的文件名及权限,同时输出每一个文件时都要先输出软件包标识。
通过使用定制输出,我们可以很方便地查找出系统中占用空间最大的软件包。
注: -a项选择所有已安装的软件包,——qf项定制查询格式, 格式串中用功能标签NAME输出软件名,用SIZE输出软件大小,查询得到的数据通过管道送sort命令,对第2列降序排序后由head命令取第1行内容,这即是占用空间最大的软件包。 |
|