何为RPM.docx
- 文档编号:23974151
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:14
- 大小:27.64KB
何为RPM.docx
《何为RPM.docx》由会员分享,可在线阅读,更多相关《何为RPM.docx(14页珍藏版)》请在冰豆网上搜索。
何为RPM
何为RPM?
RPM是RedHatPackageManager的缩写。
由RedHatLinux首先引入(显而易见;)),现在已经被一些主要的Linux发行商采用,如SuSE、Caldera、Conectiva,当然,还有Mandrakesoft。
什么是‘Package’?
‘package’就是归档包(archive):
其中包含了属于该应用程序或程序库的所有文件。
这有点类似于ZIP或TAR。
但除了压缩功能,这个包里还有控制脚本(controlscripts)。
这些脚本可以被本地的安装程序读出,执行,并存储。
可以进行安装、卸载、状态检查、依赖检查等。
管理者通过一个说明文件('specfile':
specificationfile)来控制软件包。
这个说明文件明确了相应包中的文件将被安放到哪里,软件正确运行要依赖哪些其他程序,安装卸载前后要执行哪些程序,是谁在什么时候建立的这个包,还有一段包内容的描述,等等。
为了有效地工作,RPM需要记录系统都安装了哪些软件。
这个资料库在‘/var/lib/rpm’。
通过这个资料库,您可以了解许多已安装的软件的信息。
sectionindex
top
RPM能作什么?
RPM包及其维护者能完成下面的事情:
∙编译和修补程序源代码.这对初学者来讲特别方便。
编译源码并打补丁需要更多的知识,althoughit'sbynomeansblackmagic。
如果觉得编译太枯燥,或者源码太多,甚至有点难以处理,RPM是好帮手。
∙依赖处理.不象有些系统铁板一块(如Windows),Linux系统可以进行不同大小的安装,这取决于系统的用途、个人的喜好等。
没有必要安装所有东西,您可以选择想要的文件、程序及程序库。
当您安装新程序时,RPM会检测您是否已安装新程序所依赖的软件。
正是这种处理机制,能防止您意外删除一些其他软件包依赖的程序。
∙提供文件的状态信息.RPM可以告诉您某个包是否已安装。
在安装新的软件包前,您可以进行整合性检查,安装后可以瞧瞧是否正确安装。
您还可以查看某个包是什么时候安装的,占了多大空间,包含哪些文档和配置文件,软件包维护者最近做了哪些改动,等等。
∙安全检查.RPM提供了对软件进行PGP或GPG签名的机制,这样可以保证软件包没有被篡改。
∙自动化.RPM能在许多脚本中用作自动维护的任务。
而且还是一些很好的RPM图形工具,一些扩展如‘rpmfind’,及MandrakeLinux自己的‘urpmi’系统的基础。
∙绿色卸载.要卸载某RPM包,只需一个命令。
该命令将删除RPM包,但保留一些改动过的文件(主要是一些配置文件和spool文件)。
∙保护配置文件.软件包的维护者能选择如何处理旧版软件的配置文件。
要么保留旧文件,将新版软件中的创建为‘rpmnew’文件;要么告诉RPM将旧的配置文件重命名为‘rpmsave’文件,并安放新的配置文件。
∙区分运行和编译时需要的文件.软件包被分割为运行时(runtime)和编译时(compiletime,‘devel’)两种。
如果您自己不编译源代码,那就不需要安装‘devel’包。
或者您也可以在编译软件时安装,完成后再删除。
∙网络功能.只要您提供文件的完整路径,RPM并不介意软件包是在本地系统,NFS,还是在FTP服务器上。
∙重建简单.每个自由软件或开源软件的RPM包都源于‘SourceRPM’(即SRPM或'src.rpm')。
这些SRPM包能用来建立相应的RPM软件包。
如果您想在编译时选不同的参数,或将该软件包移到特殊的系统环境(包括不同的系统、内核、库等的版本),或打补丁时,RPM的这个特性会很有帮助。
sectionindex
top
RPM不能作什么?
与其他工具一样,RPM也有些不足:
∙无法自动解决依赖问题.RPM会告诉您缺什么,但不能自己去抓取、安装。
这个主要的不足基本上可以由一些其他工具来弥补,如MandrakeLinux的‘urpmi’、脚本程序‘rpmfind’。
∙没有交互式地配置.软件包通常都包含配置文件和安装后可运行的脚本,但这种配置只能在安装后单独进行。
∙难以预防包中的错误.每个人都会犯错误,包维护者也不例外。
安装了说明文件有误的包,可能导致无法运行程序。
甚至在理论上,可以通过RPM包安装,有目的地破坏系统(只有‘root’才能安装rpm包)。
所以,您最好从可信赖的地方获取包。
∙缺乏兼容性保证.有很多Linux发行商和独立的个人在使用RPM。
不同的打包策略可能导致软件包无法安装,或即使安装了也无法运行(比如将可执行的文件放到了其他目录下)。
建议选用您系统的发行商的软件包。
∙最优化.通过带合适的参数编译源程序,RPM包可以在相应的处理器下的运行达到最优化。
MandrakeLinux针对奔腾级(Pentium-class,i586)处理器,正是用了这样的办法。
但实际上,这些参数只是很多编译设置中的一小部分。
通常,打包者会启用尽量多的参数,但这导致包变得更大,含的文件数也更多,有时也会受影响速度。
当然,如果您想要最好的,就得自己编译源码。
尽管RPM不是最最佳的,但却是很实用的工具,‘urpmi’作为rpm的扩展,提供了更多功能。
预备(Preliminaries)
图形软件包管理器(GraphicalPackageManagers)
在这里,我不准备讨论如何运用图形软件包管理器,如MandrakeLinuxSoftwareManager、GnoRPM及KPackage。
这些软件有各自的在线帮助,而且学会了RPM系统的基础,再用这些图形软件就能事半功倍。
LinuxDemoandTutorialCenter上有KPackage和SoftwareManager的动画教程。
MandrakeLinux的‘InstallationandUserGuide’中,有一章专门介绍用SoftwareManager进行软件包管理。
包的名称(PackageNames)
RPM包的全名包含三部分:
归档(archive)名称、归档版本号和包(package)的版本号。
所以‘mc-4.5.51-7mdk.rpm’表明:
归档名是‘mc’,版本号是4.5.51,这是该包的第七个修正版。
‘mdk’是Mandrake的缩写,而不是mandatory(命令的)。
为何需要一个额外的包版本号(packageversion)呢?
打包是个复杂的过程。
有时打包者可能忽视了某些细节,所以只能再发布后继包,也可能是打包者发现了改进包的办法。
因此,包版本号可以升级含有相同版本的归档(sameversionofanarchive)的包。
注意到包版本号可以有两部分,以点号(afullstop)作分割,如gcc-2.96-0.76mdk,这表示该包是由于安全原因升级。
您会碰到这样的包名:
mc-4.5.51-7mdk.src.rpm,这是RPM源码包。
除非您知道其用途和处理方法,否则这类包对您来说没有用处。
归档名还是文件名?
RPM区分已安装和未安装的包。
对未安装包的操作需要完整的文件名作为RPM命令的参数,比如
rpm-imc-4.5.51-7mdk.rpm
此命令在本地系统中安装‘mc-4.5.51-7mdk.rpm’包。
如果您想对一个已安装的包进行操作,这时要用归档名(archivename):
rpm-emc
此命令将从系统中删除包含‘mc’归档的包。
这个办法之所以有效,是由于在同一系统中,您无法安装两个含相同归档名的RPM包。
如果您试试下面的命令:
rpm-emc-4.5.51-7mdk.rpm
会有如下信息:
error:
packagemc-4.5.51-7mdk.rpmisnotinstalled
事实上,您可能已经安装了这个包。
sectionindex
top
一般操作
RPM有许多可选参数,幸好很容易从名称中联想到相应的用途。
大多数参数都有两种名称(flavor):
长名和短名。
长名是两个连字符(hyphen),后跟参数的全名;短名只有一个连字符,后带一个字符(一般是全名的首字母)。
当然,应用时您只需一种格式就够了,比如:
rpm--installpackage或rpm-ipackage。
如果RPM参数是文件名,您可以用匹配模式,来指定多个文件,例如:
rpm-ibla*
该命令将安装所有当前目录下以字符串‘bla’开头的包。
模糊格式对要求归档名作参数的操作无效,例如:
rpm-e*gtk*
error:
package*gtk*isnotinstalled
有一点请记住,RPM并不介意将要安装的包是在本地文件系统,还是在远程web或FTP服务器上。
只要给出完整的URL,就能对安装包进行远程操作,比如:
rpm-qpiftp:
//
将获取在的目录‘RPMS’中,以‘bla’开头的包的内容描述。
安装,升级,卸载
所有的这些命令需要‘root’权限。
∙rpm-ipackage:
安装(install)一个包,
∙rpm-earchive:
卸载(erase),
∙rpm-Upackage:
升级(upgrades)到新版本(包括安装新的包),
∙rpm-Fpackages:
更新(freshen)若干个包。
先检查指定的包中哪些已安装,然后以合理的顺序更新这些包。
有两个特殊的修正(modifier)可以和上述参数连用:
‘--test’、‘--verbose’(或‘-v’)。
‘--test’只是以模拟(asif)的方式执行命令:
您可以获得RPM执行时产生的所有信息,但是实际上命令没有真正执行,这个修正没有缩写形式。
‘--verbose’(-v)会输出RPM运行时的冗余(verbose)信息。
这一参数在检查错误或与‘--test’连用时特别有用。
添加另一个‘-v’(‘-vv’)能输出更多的冗余信息。
查询
该命令不需要‘root’权限。
请注意,当您查询一个未安装的包时,您需要将‘-p’参数与‘-q’连用。
∙rpm-qarchive:
查询(query)包名和已安装包的版本号,
rpm-qmc
mc-4.5.51-7mdk
∙rpm-qppackage:
同样是查询,但只针对未安装的包,
∙rpm-qiarchive:
告知(inform)包的用途,由谁打包,何时、何地打包,这个包是什么时候安装的,包的大小,等等。
要查询未安装的包,可运行rpm-qpipackage,
∙rpm-qlarchive:
列出(list)已安装包中的所有文件,
∙rpm-qdarchive:
列出所有已安装包中的所有文档(documentation)文件,
∙rpm-qa:
列出所有(all)已安装的包,经常与‘grep’连用,
∙rpm-qa--last:
以安装日期为顺序列出所有包,最近安装的包在前,
∙rpm-q--changelogarchive:
显示维护者对包的所有修改记录,
∙rpm-qffile:
显示该文件(file)属于哪个已安装的包。
sectionindex
top
高级查询
再配合使用一些其他的小工具,及有些笨拙的‘--queryformat’可选项,您几乎可以在一个包,或本地RPM资料库中,查到所有可能的信息。
找匹配的已安装包
常见的问题:
您想知道某个包是否已安装,但却记不清包的确切名称(或者是懒得敲入),可用:
rpm-qa|grep-ipattern
这里用了所谓的管道(pipe)和grep命令(‘i’可选项使得搜索不区分大小写)。
所以,这样的命令
rpm-qa|grep-ixfree
将列出含有字符串‘xfree’的已安装包,并且不区分大小写。
在未安装的包中找一个文件
另一个常见问题是:
哪个包里有这个文件?
将MandrakeCD放到光驱中(我们假设在‘mnt/cdrom’目录下),键入
foriin/mnt/cdrom/Mandrake/RPMS/*.rpm;dorpm-qpli$i|grepfilename&&echo$i;done
如果这个指定文件(filename)在其中的某个包中,这个for-do循环将返回其名称。
这样做可能有些乏味,没关系,在下一篇中,我们将介绍的MandrakeLinux中的‘urpm’,能漂亮地完成这一任务。
将已安装的包按顺序列出
如果您仔细阅读过第一篇中的介绍,就已经知道RPM工作要靠其说明文件。
可选项‘--queryformat’使您可以在给定的RPM中,根据说明文件中单独的某个域(field),按任何顺序进行查询。
键入
rpm--querytags
将列出所有可用的域,这种格式有些复杂,所以最好用例子来演示。
假设您的硬盘空间紧张,想将已安装的包按大小列出,这样您就可以找出最好卸载哪个包,命令如下(在一行中):
rpm-qa--queryformat'%{name}%{size}\n'|sort-n+1|column-t
是不是有点迷糊?
;)第一部分完成了所有工作:
只按查询标签(querytags)‘name’和‘size’,对所有包进行查找,其中的标签格式是‘%{[tag]}’。
由于查询标签字符串中包含空格,所以要用单引号括起来。
其中‘\n’在每行添加一个回车(linebreak)。
‘sort’命令将输出排序结果(大的在后),‘column’将每行分成漂亮的两列:
名称在左,比特为单位的大小在右。
只要您记得这种特殊的查询标签格式,使用起来还是很不错的。
您已经看到,RPM可以做很多事情,但同时RPM语法可能变得复杂。
而一些其他的功能,如自动解决依赖问题、匹配归档名,却完全丧失了。
好了,现在是MandrakeLinux中‘urpm’出场的时候了……
区别
RPM与SRPM
S(ource)RPM包里的是源代码,而不是编译好的程序。
只有当您碰到不相容的情况,要再建(rebuild)一个RPM包时,才需要跟SRPM包打交道(下面有不相容的介绍)。
SRPM包以‘src.rpm’为文件名的结尾。
bla.rpm与bla-devel.rpm
‘-devel-’RPM包中含有所谓的头文件,编译其他程序时可能会用到。
Non-develRPM包里的是运行时需要的文件。
除非您打算自己编译程序,否则一点也不需要‘-devel-’RPM包。
安装与升级
升级是代替原来的老版本,而安装则不会动以前的版本(如果可能)。
当涉及到库(libraries)时,这点区别尤为重要,因为应用程序要依赖库中的代码。
不同的程序可能依赖于同一种库的不同版本。
升级将会影响依赖于旧版库的程序,RPM自然不准这样做。
但是,您可以在同一系统中,拥有同一种库的不同版本。
[...].rpmnew与[...].rpmsave文件
两者都是配置文件。
[...].rpmnew是RPM包中的新文件,同时保留了旧文件。
[...].rpmsave是旧文件,原来的文件已经被RPM包中的新文件取代。
sectionindex
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包?
urpmffile
如果您不用‘urpm’系统,可以用下面的命令:
foriin*.rpm;dorpm-qpli$i|grepfile&&echo$i;done
您也可以用或RPMPBoneSearch的搜索引擎,只需要输入您要找的文件名。
当然,大多数RPM图形工具也都有搜索功能。
……从一个RPM包中析取若干个文件?
一些文件管理器,如MidnightCommander(mc),允许您象普通文件一样,浏览RPM包,并且可以将其中的某个文件复制到其他目录。
您还可以用‘rpm2cpio’命令,将RPM包转换到‘cpio’归档中,然后您再用‘cpio’命令对其进行操作。
……从一目录中只升级而不安装RPM包?
rpm-F*.rpm
将根据当前目录内的新版软件,升级相应的RPM包。
……升级互相依赖的包?
请看上一个条目。
……对非当前使用的Linux系统安装或升级RPM包?
可用‘--root=[dir]’可选项。
假如启用MandrakeLinuxrescuesystem(急救系统),您可以将RPM包安装到挂在‘/mnt’上的Linux系统:
rpm-i--root=/mnt/path/package
请注意,这只能在本地机上有效,通过网络连接的就不行了。
……用旧版RPM包替换新版RPM包(降级)?
rpm-U--oldpackagepackage
……安装不相容的RPM包(可能由于不同版本的库,不同的路径等)?
取得这个包的源码RPM包,通常是‘[packagename].src.rpm’的形式,然后用‘rpm-build’包中的命令,重新编译和安装:
rpmbuild--recompileSRPM
如果您希望RPM新建一个包,可用命令:
rpmbuild--rebuildSRPM
请注意,这一过程通常需要先安装一些‘devel’RPM包。
您可以在‘/usr/src/RPM/RPMS/arch’目录下找到这些再建(rebuild)的RPM包。
如果RPM的不相容只是由于安装路径的不同,您可将其重定位(relocate):
rpm-i--relocateoldpath=newpath
或者,在您安装之前,将RPM包的安装目录联接到您系统认可的地方,比如:
ln-s/usr/opt/kde
这个用于SuSE或Caldera中的KDE包。
……更多地输出RPM在执行过程中的信息?
添加‘-hv’参数,从而获得一个进度条。
要更多文本输出的话,用‘-v’,甚至‘-vv’参数。
……排除一些可安装文件?
rpm-i--excludepathpathpackage
将不安装所有名称以path开头的文件。
rpm-i--excludedocspackage
不安装文档文件。
‘devel’包中有许多文档,这时用该命令就很有效。
但对有些RPM包,这个命令无法工作。
……新建RPM包?
这大概能再写一篇文章。
;)
RPMHOWTO是不错的介绍,MaximumRPM俨然还是这方面的权威。
想了解出自Mandrake的说明,可以看一下MandrakeRPMHOWTO。
sectionindex
top
如果……
……RPM抱怨,和已安装RPM包中的文件冲突
有时多个包中含有若干相同的文件。
如果您想安装含已有文件的RPM包,可用
rpm-i--replacefilespackage
……RPM抱怨,RPM版本冲突(RPM3、RPM4)
安装Mandrake7.2中的RPM3.0.5,这是RPM3.x与4.x的唯一过渡版本。
Mandrake8用的是RPM4,可以向后兼容。
……RPM抱怨‘failingtoopen/var/lib/rpm/packages.rpm’
只有‘root’才有权安装、升级或卸载包。
先用命令su或sudo作切换。
……普通用户无法使用urpmi/urpme
请注意:
直到Mandrake8.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--nodepspackage
显然,这会忽略所有依赖检查,所以您肯定可以通过安装。
但使用‘--nodeps’(甚至‘--force’),可能会破坏您的资料库。
在正常情况下,绝对不需要使用这个参数。
从我个人而言,几年内都不没有用过这个参数。
……再建SRPM包时,一下子就失败了,说是nosuchfileordirectory
先安装MandrakeLinux光盘中的‘rpm-build’包,然后再试试。
……再建来自Cooker的SRPM包时出错fg:
nojobcontrol
新建或再建RPM包时,用到了位于‘/usr/lib/rpm/[arch-]mandrake-linux/macros’的命令宏(commandmacros)。
由于不时会引入新的宏,当如果说明文件中有对某个宏的调用,而该宏又没有列在当前的宏文件中,shell会试图解释这个宏,但结果往往显示上述错误信息。
解决这个问题最直接的办法,是升级到最近的RPM版本(我不知道只替换宏文件是否有效,谁有这方面的经验?
)。
另一办法是通过‘/usr/src/RPM/SPECS’说明文件编辑出错的宏,但是这样可能导致错误的RPM包。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RPM