RPM 第二篇

来源:互联网 发布:路由器mac ip地址绑定 编辑:程序博客网 时间:2024/05/16 05:53

包的名称(Package Names)

RPM 包的全名包含三部分:归档(archive)名称、归档版本号和包(package)的版本号。
所以‘mc-4.5.51-7mdk.rpm’表明:归档名是‘mc’,版本号是 4.5.51 ,这是该包的第七个修正版。‘mdk’是 Mandrake 的缩写,而不是 mandatory(命令的)

为何需要一个额外的包版本号(package version)呢?打包是个复杂的过程。有时打包者可能忽视了某些细节,所以只能再发布后继包,也可能是打包者发现了改进包的办法。因此,包版本号可以升级含有相同版本的归档(same version of an archive)的包。注意到包版本号可以有两部分,以点号(a full stop)作分割,如 gcc-2.96-0.76mdk ,这表示该包是由于安全原因升级。

您会碰到这样的包名:mc-4.5.51-7mdk.src.rpm,这是 RPM 源码包。除非您知道其用途和处理方法,否则这类包对您来说没有用处。

归档名还是文件名?

RPM 区分已安装和未安装的包。
对未安装包的操作需要完整的文件名作为 RPM 命令的参数,比如

rpm -i mc-4.5.51-7mdk.rpm

此命令在本地系统中安装‘mc-4.5.51-7mdk.rpm’包。

如果您想对一个安装的包进行操作,这时要用归档名(archive name)

rpm -e mc

此命令将从系统中删除包含‘mc’归档的包。这个办法之所以有效,是由于在同一系统中,您无法安装两个含相同归档名的 RPM 包。
如果您试试下面的命令:

rpm -e mc-4.5.51-7mdk.rpm

会有如下信息:

error: package mc-4.5.51-7mdk.rpm is not installed

事实上,您可能已经安装了这个包。

* section index * top

* 一般操作

RPM有许多可选参数,幸好很容易从名称中联想到相应的用途。
大多数参数都有两种名称(flavor):长名和短名。长名是两个连字符(hyphen),后跟参数的全名;短名只有一个连字符,后带一个字符(一般是全名的首字母)。当然,应用时您只需一种格式就够了,比如:rpm --install packagerpm -i package

如果RPM参数是文件名,您可以用 匹配模式 ,来指定多个文件,例如:

rpm -i bla*

该命令将安装所有当前目录下以字符串‘bla’开头的包。模糊格式对要求归档名作参数的操作无效,例如:

rpm -e *gtk*
error: package *gtk* is not installed

有一点请记住,RPM 并不介意将要安装的包是在本地文件系统,还是在远程 web 或 FTP 服务器上。只要给出完整的 URL,就能对安装包进行远程操作,比如:

rpm -qpi ftp://ftp.server.com/RPMS/bla*

将获取在 ftp.server.com 的目录‘RPMS’中,以‘bla’开头的包的内容描述。

安装,升级,卸载

所有的这些命令需要‘root’权限。

  • rpm -i package :安装install)一个包,
  • rpm -e archive :卸载erase),
  • rpm -U package :升级upgrades)到新版本(包括安装新的包),
  • rpm -F packages :更新freshen)若干个包。先检查指定的包中哪些已安装,然后以合理的顺序更新这些包。

有两个特殊的修正(modifier)可以和上述参数连用:‘--test’ 、‘--verbose’(或‘-v’)

‘--test’ 只是以模拟(as if)的方式执行命令:您可以获得 RPM 执行时产生的所有信息,但是实际上命令没有真正执行,这个修正没有缩写形式。

‘--verbose’(-v) 会输出 RPM 运行时的冗余(verbose)信息。这一参数在检查错误或与‘--test’连用时特别有用。添加另一个‘-v’(‘-vv’)能输出更多的冗余信息。

查询

该命令不需要‘root’权限。请注意,当您查询一个未安装的包时,您需要将‘-p’参数与‘-q’连用。

  • rpm -q archive :查询query)包名和已安装包的版本号,

    rpm -q mc
    mc-4.5.51-7mdk

  • rpm -qp package :同样是查询,但只针对未安装的包,
  • rpm -qi archive :告知inform)包的用途,由谁打包,何时、何地打包,这个包是什么时候安装的,包的大小,等等。要查询未安装的包,可运行 rpm -qpi package
  • rpm -ql archive :列出list)已安装包中的所有文件,
  • rpm -qd archive :列出所有已安装包中的所有文档documentation)文件,
  • rpm -qa :列出所有all)已安装的包,经常与‘grep’连用,
  • rpm -qa --last :以安装日期为顺序列出所有包,最近安装的包在前,
  • rpm -q --changelog archive :显示维护者对包的所有修改记录,
  • rpm -qf file :显示该文件file属于哪个已安装的包。

* section index * top

* 高级查询

再配合使用一些其他的小工具,及有些笨拙的‘--queryformat’可选项,您几乎可以在一个包,或本地 RPM 资料库中,查到所有可能的信息。

找匹配的已安装包

常见的问题:您想知道某个包是否已安装,但却记不清包的确切名称(或者是懒得敲入),可用:

rpm -qa | grep -i pattern

这里用了所谓的 管道(pipe) 和 grep 命令(‘i’可选项使得搜索不区分大小写)。所以,这样的命令

rpm -qa | grep -i xfree

将列出含有字符串‘xfree’的已安装包,并且不区分大小写。

在未安装的包中找一个文件

另一个常见问题是:哪个包里有这个文件?将 Mandrake CD 放到光驱中(我们假设在‘mnt/cdrom’目录下),键入

for i in /mnt/cdrom/Mandrake/RPMS/*.rpm ; do rpm -qpli $i | grep filename && echo $i ; done

如果这个指定文件filename在其中的某个包中,这个 for-do 循环将返回其名称。这样做可能有些乏味,没关系,在下一篇中,我们将介绍的 Mandrake Linux 中的‘urpm’,能漂亮地完成这一任务。

将已安装的包按顺序列出

如果您仔细阅读过第一篇中的介绍,就已经知道 RPM 工作要靠其说明文件。可选项‘--queryformat’使您可以在给定的 RPM 中,根据说明文件中单独的某个域(field),按任何顺序进行查询。键入

rpm --querytags

将列出所有可用的域,这种格式有些复杂,所以最好用例子来演示。
假设您的硬盘空间紧张,想将已安装的包按大小列出,这样您就可以找出最好卸载哪个包,命令如下(在一行中)

rpm -qa --queryformat '%{name} %{size}/n' | sort -n +1 | column -t

是不是有点迷糊?;) 第一部分完成了所有工作:只按查询标签(querytags)‘name’和‘size’,对所有包进行查找,其中的标签格式是‘%{[tag]}’。由于查询标签字符串中包含空格,所以要用单引号括起来。其中‘/n’在每行添加一个回车(line break)
‘sort’命令将输出排序结果(大的在后),‘column’将每行分成漂亮的两列:名称在左,比特为单位的大小在右。只要您记得这种特殊的查询标签格式,使用起来还是很不错的。

您已经看到,RPM 可以做很多事情,但同时RPM语法可能变得复杂。而一些其他的功能,如自动解决依赖问题、匹配归档名,却完全丧失了。好了,现在是 Mandrake Linux 中‘urpm’出场的时候了……

 
原创粉丝点击