分类: LINUX
2008-05-04 22:41:34
GTES11系统中的所有软件均以RPM包的形式存在,用户可通过图形化工具或命令行对系统中的软件包进行安装、删除和升级操作。RPM包管理器是一个开放的系统,运行在包括Turbolinux在内的大多数Linux平台上。对最终用户来说,软件包的安装、删除和升级都可通过简短的命令完成。RPM维护系统中所安装软件包的所有信息,因此,用户可通过RPM强大的查询选项对系统安装软件包进行查询或校验。
软件包升级时,RPM会仔细处理用户的配置文件,因此不会出现由于软件升级而导致配置丢失的情况。对开发者来说,可以通过RPM将软件源代码打成包,并以源码包或二进制包的形式提供给最终用户。这些过程由一个包SPEC描述文件驱动,SPEC文件包含了编译该软件包所需的所有信息,如:源代码,补丁以及编译指令等等,当软件有新版本发布时,就能够极大地提高软件包的可维护性。
理解RPM的设计目标对于更好的使用RPM包管理工具是有益的,具体来说,RPM的设计目标包括如下几个方面:
• 可升级性
使用RPM可以升级单个软件包而不需要重新安装整个系统。当基于RPM的Linux系统发行新版本时,RPM可以智能化、自动地升级现有的系统。软件包中的配置文件在升级时被保留,因此用户定制的配置信息不会丢失。
• 强大的查询功能
RPM设计时提供了强大的查询功能。你可以在整个包管理数据库中搜索指定的软件包或文件。你还可以轻易地知道哪个文件属于哪个软件包,软件包来自哪里。每个RPM包有一个二进制头,其中包含软件包本身及其内容的信息,包中的文件被压缩存储,这样就允许快速简捷地查询软件包。
• 系统校验
RPM另一项强大的功能是软件包校验。如果担心可能删除了某软件包中的一个重要文件,只需校验该软件包即可知道是否有这种情况。必要时,可以重装该软件包,修改过的配置文件在重装时会被RPM保留。
• 纯净源码
一个重要的设计目标是允许使用所谓“纯净”软件源码,即由软件作者发布的没有打过任何补丁的源码。RPM将“纯净”源码、所用的补丁、以及完整的编译指令放在一个描述文件中,用来驱动将来的包管理过程。这是一个重要的优点,理由有几个,例如,如果软件有新版本推出,你不必从头开始整个编译过程,因为所有缺省的编译选项,补丁信息,要生成的二进制包中文件的列表等等都包含在描述文件了。保持源码“纯净”不仅对开发者重要,它也保证了给最终用户提供的软件的质量。
RPM有五种最基本的操作:安装、删除、升级、查询和校验。下面将介绍这些操作的一般用法,详细情况可参考rpm manpage
假设要安装的软件包名为:foo-1.0-1.i386.rpm,用root用户登录到系统,运行以下命令:
rpm -ivh foo-1.0-1.i386.rpm
如果安装成功,将显示如下信息:
Preparing... ########################################### [100%] 1:foo ########################################### [100%]
RPM从版本4.1开始,在安装或升级软件包时会检查软件包的签名。如果签名验证失败,将显示如下错误信息:
error: V3 DSA signature: BAD, key ID 0352860f
如果仅是一个新的文件头签名,将显示如下错误信息:
error: Header V3 DSA signature: BAD, key ID 0352860f
如果系统中没有相应的密钥来验证该签名,将显示如下警告信息:
warning: V3 DSA signature: NOKEY, key ID 0352860f
安装过程比较简单,但也可能出现下面错误:
• 已经安装的包
如果系统中已安装有同样版本的软件包,将显示如下信息:
Preparing... ########################################### [100%] package foo-1.0-1 is already installed
这种情况下,如果仍然要强行安装,可以使用—replacepkgs选项,此时,RPM将忽略该错误:
#rpm -ivh --replacepkgs foo-1.0-1.i386.rpm
该选项在删除了原来安装的RPM包中的一些文件,或者想恢复初始时配置文件的情况下有用。
• 冲突的文件
如果要安装的软件包与已安装的软件包包含有相同名字的文件,将显示如下信息:
Preparing... ########################################### [100%] file /usr/bin/foo from install of foo-1.0-1 conflicts with file from package bar-2.0.20
可以使用—replacefiles选项让RPM忽略此错误:
#rpm -ivh --replacefiles foo-1.0-1.i386.rpm
• 不能解析的依赖
RPM包有时会依赖其它的软件包,只有安装了这些被依赖的包,该软件包才能正常运行,如果依赖关系没有解决,将显示如下类似信息:
error: Failed dependencies: bar.so.2 is needed by foo-1.0-1 Suggested resolutions: bar-2.0.20-3.i386.rpm
如果仍然要强行安装,可以使用—nodeps选项,这将可能导致该软件包不能正常运行,因此不建议这样做。
删除软件包和安装一样简单,在提示符下输入如下命令:
#rpm -e foo
如果系统中有其它软件包依赖要删除的软件包,那么将显示如下类似信息:
error: Failed dependencies: foo is needed by (installed) bar-2.0.20-3.i386.rpm
此时也可以用—nodeps选项强制RPM删除该软件包,但这将导致依赖关系被破坏。
与安装类似,升级软件包时输入以下命令:
#rpm -Uvh foo-1.0-1.i386.rpm
RPM将自动删除系统中相应的旧包。实际上也可以使用-U命令来安装软件包,而不管系统中有无该软件包的以前版本。 如果系统中有软件包升级时需要更新的配置文件,那么将显示如下类似信息:
saving /etc/foo.conf as /etc/foo.conf.rpmsave
该信息意味着新的配置文件不能前向兼容系统中原有配置文件,原有配置文件被更名保存,新的配置文件安装进去。此时应该马上对比一下新老配置文件的不同,确保系统仍能正常运行。
如果RPM认为要升级的软件包比系统中原有的旧,则提示如下类似信息:
package foo-2.0-1 (which is newer than foo-1.0-1) is already installed
可以使用—oldpackage选项强制RPM升级。
更新与升级类似,命令如下: rpm -Fvh foo-1.0-1.i386.rpm 与升级不同的是,如果系统中没有相应的旧包,将不执行安装操作。
可以用-q命令对安装的软件包执行查询操作。如:rpm -q foo 将显示包的名字、版本号、发行号:foo-2.0-1
除了可以指定包的名称,也可以使用以下选项来配合-q命令执行各项查询操作:
• -a 查询所有已安装的软件包 • -f <文件名> 查询哪个包包含有指定的文件 • -p <包名> 查询指定的软件包
同样,-q命令也有丰富的选项来指明执行查询操作时将显示什么信息:
• -i 显示包的名称、描述、版本号、发行号、大小、编译时间、安装时间和提供商等信息 • -l 显示包中所有文件的列表 • -s 显示包中所有文件的状态 • -d 显示包中所有的文档文件 • -c 显示包中所有的配置文件
对于显示文件列表的选项,可以附加-v选项来显示详细信息。
RPM使用-V命令校验软件包,校验内容包括:大小、MD5校验和、类型以及文件所属的用户和组等。可以与-V命令配合使用的校验选项有:
• -f <文件名> 校验指定文件所属的软件包,例如: rpm -Vf /usr/bin/vim
• -a 校验所有已安装的软件包,例如:
#rpm -Va
• -p <包名> 用指定的软件包校验已安装的软件包,例如:
#rpm -Vp foo-1.0-1.i386.rpm
如果校验一切正常,将没有输出,反之则输出不一致结果,格式为:
xxxxxxxx 文件名
字段1由八个字符组成,每个字符指明该文件与RPM数据库中一致或不一致的地方,单个点(.)说明没有异常,具体含义如下:
• 5 — 校验和 • S — 文件大小 • L — 符合连接 • T — 文件修改时间 • D — 设备 • U — 用户 • G — 组 • M — 文件模式 • ? — 文件不可读
如果有任何输出显示,请判断是否真的有问题,然后决定删除或重安装异常的软件包,或者通过其它方式解决。
如果仅想知道RPM包是否已损坏或被恶意篡改,可以用下面命令来验证包的MD5校验和:
rpm -K --nosignature
正常情况下将显示如下信息:
: md5 OK
如要看到更详细的消息,可以加vv选项,如:
rpm -Kvv --nosignature
另一方面,软件包开发者的可信度如何?如果该软件包使用了开发者的 GnuPG密钥签名,你就会知道开发者的身份是否如他们声称的那样。
GnuPG工具用于安全通信,而且完全替代了PGP。你可以用GnuPG来验证文档的有效性以及对要发送(接送)的文档加密(解密),同时,GnPG也能处理PGP 5.x的文件。
缺省时系统中已经安装有GnuPG, 因此,你可以马上用它来验证RPM包。但是,首先必须导入Turbolinux的公开密钥。
在可以检查包的签名前,必须用下面命令导入Turbolinux的公开密钥:
#rpm –import /usr/share/gpg-pubkey/RPM-GPG-KEY
下面命令可以显示系统中已安装的公开密钥:
#rpm -qa gpg-pubkey*
导入密钥后,检查RPM包的GnuPG签名时可运行下面命令:
#rpm -K
用户有时候会误删一些文件,但却不知道到底删了哪些文件,这时可以运行下面命令来检查整个系统:
rpm -Va
遇到不认识的文件时,可以这样查看它属于哪个包:
#rpm -qf /usr/bin/ggv
把上面两个例子结合起来,下面命令将检查指定文件所属的那个RPM包:
#rpm -Vf /usr/bin/paste
要知道一个程序所在RPM包的相关文档在哪儿时可运行:
#rpm -qdf /usr/bin/host
查看一个二进制包的详细信息时,执行下面命令:
#rpm -qpi gcc-3.4.3-9.4.i386.rpm
输出结果如下:
Name : gcc Relocations: (not relocatable) Version : 3.4.3 Vendor: (none) Release : 9.4 Build Date: 2005年04月29日 星期五 14时10分13秒 Install Date: (not installed) Build Host: dev3-241.dev.cn.tlan Group : Development/Languages Source RPM: gcc-3.4.3-9.4.src.rpm Size : 13029656 License: GPL Signature : (none) URL : Summary : Various compilers (C, C++, Objective-C, Java, ...) Description : The gcc package contains the GNU Compiler Collection version 3.4. You'll need this package in order to compile C code.
再有,下面命令可以查看包中所有文件列表:
#rpm -qlp crontabs-1.10-5.noarch.rpm