Enghish Version

MandrakeUser.Org - Your Mandrake-Linux Knowledge Base!

* DocIndex - Basics

RPM 第四篇

* 区别
* 如何……
* 如果……

相关资源:

man rpm
Maximum RPM

Revision / Modified: Mar. 15, 2002 / May 17, 2002
Author: Tom Berger
Translator: Wu XiaoGuang

* 区别

RPM 与 SRPM

S(ource)RPM 包里的是源代码,而不是编译好的程序。只有当您碰到不相容的情况,要再建(rebuild)一个 RPM 包时,才需要跟 SRPM 包打交道(下面有不相容的介绍)
SRPM 包以‘src.rpm’为文件名的结尾。

bla.rpm 与 bla-devel.rpm

‘-devel-’RPM 包中含有所谓的头文件,编译其他程序时可能会用到。Non-devel RPM 包里的是运行时需要的文件。
除非您打算自己编译程序,否则一点也不需要‘-devel-’RPM 包。

安装与升级

升级是代替原来的老版本,而安装则不会动以前的版本(如果可能)
当涉及到库(libraries)时,这点区别尤为重要,因为应用程序要依赖库中的代码。不同的程序可能依赖于同一种库的不同版本。升级将会影响依赖于旧版库的程序,RPM 自然不准这样做。
但是,您可以在同一系统中,拥有同一种库的不同版本。

[...].rpmnew 与 [...].rpmsave 文件

两者都是配置文件。[...].rpmnew 是 RPM 包中的新文件,同时保留了旧文件。
[...].rpmsave 是旧文件,原来的文件已经被 RPM 包中的新文件取代。

* section index * top

* 如何……

……列出已安装的 RPM 包(根据安装日期和大小)

rpm -qa | less

由‘less’程序显示所有已安装的 RPM 包。

根据安装日期:

rpm -qa --last | less

根据大小:

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

……列出所有可用 RPM 包?

less /var/lib/urpmi/compss

在纯的 RPM 中,您可以将 RPM 输出 重定向 到一个文件,也就创建了 RPM 列表:

rpm -qpi *.rpm > ~/rpmlist.txt

……找到含特定文件的 RPM 包?

urpmf file

如果您不用‘urpm’系统,可以用下面的命令:

for i in *.rpm ; do rpm -qpli $i | grep file && echo $i ; done

您也可以用 rpmfind.netRPM PBone Search 的搜索引擎,只需要输入您要找的文件名。
当然,大多数 RPM 图形工具也都有搜索功能。

……从一个 RPM 包中析取若干个文件?

一些文件管理器,如 Midnight Commander (mc),允许您象普通文件一样,浏览 RPM 包,并且可以将其中的某个文件复制到其他目录。

您还可以用‘rpm2cpio’命令,将 RPM 包转换到‘cpio’归档中,然后您再用‘cpio’命令对其进行操作。

……从一目录中只升级而不安装 RPM 包?

rpm -F *.rpm

将根据当前目录内的新版软件,升级相应的 RPM 包。

……升级互相依赖的包?

请看上一个条目。

……对非当前使用的 Linux 系统安装或升级 RPM 包?

可用‘--root=[dir]’可选项。假如启用 Mandrake Linux rescue system(急救系统),您可以将 RPM 包安装到挂在‘/mnt’上的 Linux 系统:

rpm -i --root=/mnt /path/package

请注意,这只能在本地机上有效,通过网络连接的就不行了。

……用旧版RPM包替换新版 RPM 包(降级)?

rpm -U --oldpackage package

……安装不相容的 RPM 包(可能由于不同版本的库,不同的路径等)

取得这个包的源码 RPM 包,通常是‘[packagename].src.rpm’的形式,然后用‘rpm-build’包中的命令,重新编译和安装:

rpmbuild --recompile SRPM

如果您希望 RPM 新建一个包,可用命令:

rpmbuild --rebuild SRPM

请注意,这一过程通常需要先安装一些‘devel’RPM 包。您可以在‘/usr/src/RPM/RPMS/arch’目录下找到这些再建(rebuild)的 RPM 包。

如果 RPM 的不相容只是由于安装路径的不同,您可将其重定位(relocate)

rpm -i --relocate oldpath=newpath

或者,在您安装之前,将 RPM 包的安装目录联接到您系统认可的地方,比如:

ln -s /usr /opt/kde

这个用于 SuSE 或 Caldera 中的 KDE 包。

……更多地输出 RPM 在执行过程中的信息?

添加‘-hv’参数,从而获得一个进度条。要更多文本输出的话,用‘-v’,甚至‘-vv’参数。

……排除一些可安装文件?

rpm -i --excludepath path package

将不安装所有名称以 path 开头的文件。

rpm -i --excludedocs package

不安装文档文件。‘devel’包中有许多文档,这时用该命令就很有效。但对有些 RPM 包,这个命令无法工作。

……新建RPM包?

这大概能再写一篇文章。;)
RPM HOWTO 是不错的介绍,Maximum RPM 俨然还是这方面的权威。
想了解出自 Mandrake 的说明,可以看一下 Mandrake RPM HOWTO

* section index * top

* 如果……

…… RPM 抱怨,和已安装 RPM 包中的文件冲突

有时多个包中含有若干相同的文件。如果您想安装含已有文件的 RPM 包,可用

rpm -i --replacefiles package

…… RPM 抱怨,RPM 版本冲突(RPM 3、RPM 4)

安装 Mandrake 7.2 中的 RPM 3.0.5,这是 RPM 3.x 与 4.x 的唯一过渡版本。Mandrake 8 用的是 RPM 4,可以向后兼容。

…… RPM 抱怨‘failing to open /var/lib/rpm/packages.rpm’

只有‘root’才有权安装、升级或卸载包。先用命令 susudo 作切换。

……普通用户无法使用 urpmi/urpme

请注意:直到 Mandrake 8.0,才允许部分普通用户运行‘urpmi’。在运行之前,您要加入到‘urpmi’组中:将您的用户名加到‘/etc/groups’合适的行,当然只有‘root’才能做这个改动。
‘urpme’只能由‘root’来运行。只有‘root’能从非标准目录中,用‘urpmi’命令安装 RPM 包。

……只能用自己编译的文件来解决依赖问题

解决 RPM 包的依赖,RPM 要检查自己的资料库,但不是整个系统。所以,即使您自己编译安装了所有依赖的包,RPM 也无法通过依赖检查。(但我又听说新版的 RPM 可以检查整个安装系统,而不仅仅局限于自己的资料库。实际上,我也不很清楚。)

有两种解决办法:

  • 在‘/etc/’目录下新建‘rpmrc’文件,并按下面的格式,对该文件安装条目:

    Provides: file

    file 是自己编译文件的名称(比如,‘libguile.so.2’)。这样之所以有效,是因为 RPM 依赖系统是建立在文件,而不是包的基础上。上述条目就使得 RPM 以为该项依赖已经解决,虽然这个文件并未在资料库中列出。

  • 您可以让 RPM 忽略依赖检查:

    rpm -i --nodeps package

    显然,这会忽略所有依赖检查,所以您肯定可以通过安装。但使用‘--nodeps’(甚至‘--force’),可能会破坏您的资料库。在正常情况下,绝对不需要使用这个参数。从我个人而言,几年内都不没有用过这个参数。

……再建 SRPM 包时,一下子就失败了,说是no such file or directory

先安装 Mandrake Linux 光盘中的‘rpm-build’包,然后再试试。

……再建来自 Cooker 的 SRPM 包时出错fg: no job control

新建或再建 RPM 包时,用到了位于‘/usr/lib/rpm/[arch-]mandrake-linux/macros’的命令宏(command macros)。由于不时会引入新的宏,当如果说明文件中有对某个宏的调用,而该宏又没有列在当前的宏文件中,shell 会试图解释这个宏,但结果往往显示上述错误信息。

解决这个问题最直接的办法,是升级到最近的 RPM 版本(我不知道只替换宏文件是否有效,谁有这方面的经验?)。另一办法是通过‘/usr/src/RPM/SPECS’说明文件编辑出错的宏,但是这样可能导致错误的 RPM 包。

* section index * top

* ‘rpmdrake’纠错


Legal: All texts on this site are covered by the GNU Free Documentation License.
Standard disclaimers of warranty apply.