谁能详细讲一下rpmbuild命令的用法。谢谢!!!!!!!
zq97_0
|
1#
发表于 2003-09-12 17:28
|
zq97_0
|
1#
zq97_0 发表于 2003-09-12 17:28
谁能详细讲一下rpmbuild命令的用法。谢谢!!!!!!! |
cnhnln
|
2#
cnhnln 发表于 2003-09-12 22:35
引用:RPM是RedHat Package Manager的缩写,意即RedHat(红帽子)软件包管理器。(RedHat是美国有名的LINUX公司,网址:http://www.redhat.com) 对于一个操作系统来说,不能没有一个象样的软件包管理器。没有软件包管理器的帮助,操作系统发行版的制作者将面临这样或那样的难题,用户安装,升级,卸载与发布软件包也将是非常麻烦的,系统管理也容易出现问题。相反,有了专门的软件包管理器,软件制作者易于制作和发行自己的软件了,而对于普通用户来说,软件包的安装维护将变得非常方便了。这种 情况,对于一个操作系统的推广也会起到良好的促进作用。RPM就是随着RedHat LINUX发行版的流行而迅速推广开来的,二者的表现相得易彰。RPM先行者 最初的时候,LINUX系统的发布并没有使用什么软件包管理器。随着时间的推移,RedHatmLINUX开发者意识到开发一个软件包管理器的重要性,于是开发出RPP这个管理器。 RPP相对于RPM虽然是简单的,但已有了几项重要的功能,如打一个简单的命令就可以实现软件的安装与卸载,包中可含有安装前后与卸载前后执行的脚本程序,还可以随时校验已安装的软件包,查询功能也很强大。 RPP的缺点在于,RPP打包是基于特别修改过的(针对RPP)源代码的,因而这些源代码并非是纯正的源代码。由于这个原因,当软件包开发者想建立大量不同的软件包时,将面临众多技术面的问题。RPP也不能保证当前的执行程序是基于打包过的源程序的,并且RPP不支持多处理器体系结构。与RPP同时开发的,还有PMS(即package management system,软件包管理系统),这是另一群LINUX爱好者开发的。PMS采用的是纯正的源代码,它允许软件包制作者很快释出一个软件的最新版本,并且可以立刻看到该软件的变化。RPM采用了这一明智的做法,这也是PMS对RPM的一项重大贡献。PMS的缺点是查询功能不强,没有包校验功能,不支持多体系结构,数据库设计也不好。在RPP和PMS之后,Rik Faith和Doug Hoffman开发了PM管理器。该管理器整合了RPP与PMS的许多功能,但是数据库设计还不强,依然不支持多体系结构。 RPM开发 此后,Marc Ewing和Erik Troan两人在吸取RPP,PMS,PM设计经验的基础上,用PERL语开发了RPM软件包管理器,即RPM1.0版。 其成功之处在于: 可自动处理配置文件; 可重建大量的软件包; 易于使用。 其不足之处在于: 程序大,运行速度慢,因为它是用PERL这种解释型的语言写的; 数据库功能太弱; 不支持多体系结构; 包裹文件格式不可扩展。 针对RPM1.0的弱点,RPM的开发者再度努力,将RPM升级到2.0,3.0和现在的4.0版本。他们主要做了以下几点: 用C重写了程序,这极大地提高了RPM的运行速度。 RPM数据库格式进行了再设计,重点从性能和可靠性两方面提高。 软件包格式也进行了再设计,方便以后的扩展和升级。 建立了rpmlib(RPM函数库),方便其它程序调用RPM。 增加多体系支持,方便RPM跨平台使用(不论是x86体系,还是sparc等其它体系)。 网上的RPM RPM官方网址为http://www.rpm.org,该网站刊登有RPM的最新消息,有关于RPM的说明文档,还可下载最新的RPM软件源代码和执行代码,不妨常去看看。 小结 如今的RPM使得软件包安装与卸载更容易,校验已安装的软件包是否正常也容易,将程序(源程序或执行程序)打包也简单了,跨平台的支持,遵循GPL版权发布源代码,使得RPM得到更广泛的应用与推广。RPM正在风靡LINUX与非LINUX世界。如果你想了解甚至精通RPM,那么请跟我来吧! 引用:一、安装命令格式: rpm -i ( or --install) options file1.rpm ... fileN.rpm 参数: file1.rpm ... fileN.rpm 将要安装的RPM包的文件名 详细选项: -h (or --hash) 安装时输出hash记号 (``#'') --test 只对安装进行测试,并不实际安装。 --percent 以百分比的形式输出安装的进度。 --excludedocs 不安装软件包中的文档文件 --includedocs 安装文档 --replacepkgs 强制重新安装已经安装的软件包 --replacefiles 替换属于其它软件包的文件 --force 忽略软件包及文件的冲突 --noscripts 不运行预安装和后安装脚本 --prefix 将软件包安装到由 指定的路径下 --ignorearch 不校验软件包的结构 --ignoreos 不检查软件包运行的操作系统 --nodeps 不检查依赖性关系 --ftpproxy 用 作为 FTP代理 --ftpport 指定FTP的端口号为 通用选项 -v 显示附加信息 -vv 显示调试信息 --root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下 --rcfile 设置rpmrc文件为 --dbpath 设置RPM 资料库存所在的路径为 二、删除 命令格式: rpm -e ( or --erase) options pkg1 ... pkgN 参数 pkg1 ... pkgN :要删除的软件包 详细选项 --test 只执行删除的测试 --noscripts 不运行预安装和后安装脚本程序 --nodeps 不检查依赖性 通用选项 -vv 显示调试信息 --root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下 --rcfile 设置rpmrc文件为 --dbpath 设置RPM 资料库存所在的路径为 三、升级 命令格式 rpm -U ( or --upgrade) options file1.rpm ... fileN.rpm 参数 file1.rpm ... fileN.rpm 软件包的名字 详细选项 -h (or --hash) 安装时输出hash记号 (``#'') --oldpackage 允许"升级"到一个老版本 --test 只进行升级测试 --excludedocs 不安装软件包中的文档文件 --includedocs 安装文档 --replacepkgs 强制重新安装已经安装的软件包 --replacefiles 替换属于其它软件包的文件 --force 忽略软件包及文件的冲突 --percent 以百分比的形式输出安装的进度。 --noscripts 不运行预安装和后安装脚本 --prefix 将软件包安装到由 指定的路径下 --ignorearch 不校验软件包的结构 --ignoreos 不检查软件包运行的操作系统 --nodeps 不检查依赖性关系 --ftpproxy 用 作为 FTP代理 --ftpport 指定FTP的端口号为 通用选项 -v 显示附加信息 -vv 显示调试信息 --root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下 --rcfile 设置rpmrc文件为 --dbpath 设置RPM 资料库存所在的路径为 四、查询 命令格式: rpm -q ( or --query) options 参数: pkg1 ... pkgN :查询已安装的软件包 详细选项 -p (or ``-'') 查询软件包的文件 -f 查询属于哪个软件包 -a 查询所有安装的软件包 --whatprovides 查询提供了 功能的软件包 -g 查询属于 组的软件包 --whatrequires 查询所有需要 功能的软件包 信息选项 显示软件包的全部标识 -i 显示软件包的概要信息 -l 显示软件包中的文件列表 -c 显示配置文件列表 -d 显示文档文件列表 -s 显示软件包中文件列表并显示每个文件的状态 --scripts 显示安装、卸载、校验脚本 --queryformat (or --qf) 以用户指定的方式显示查询信息 --dump 显示每个文件的所有已校验信息 --provides 显示软件包提供的功能 --requires (or -R) 显示软件包所需的功能 通用选项 -v 显示附加信息 -vv 显示调试信息 --root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下 --rcfile 设置rpmrc文件为 --dbpath 设置RPM 资料库存所在的路径为 五、校验已安装的软件包 命令格式: rpm -V ( or --verify, or -y) options 参数 pkg1 ... pkgN 将要校验的软件包名 软件包选项 -p Verify against package file -f 校验所属的软件包 -a Verify 校验所有的软件包 -g 校验所有属于组 的软件包 详细选项 --noscripts 不运行校验脚本 --nodeps 不校验依赖性 --nofiles 不校验文件属性 通用选项 -v 显示附加信息 -vv 显示调试信息 --root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下 --rcfile 设置rpmrc文件为 --dbpath 设置RPM 资料库存所在的路径为 六、校验软件包中的文件 语法: rpm -K ( or --checksig) options file1.rpm ... fileN.rpm 参数: file1.rpm ... fileN.rpm 软件包的文件名 Checksig--详细选项 --nopgp 不校验PGP签名 通用选项 -v 显示附加信息 -vv 显示调试信息 --rcfile 设置rpmrc文件为 七、其它RPM选项 --rebuilddb 重建RPM资料库 --initdb 创建一个新的RPM资料库 --quiet 尽可能的减少输出 --help 显示帮助文件 --version 显示RPM的当前版本 引用:用RPM包方式来发布软件变得越来越流行,主要的原因是这种软件发布方式很方便用户安装、升级和从系统中删除。除此之外,RPM还可以让你有更多的对系统安装的软件的管理性功能,例如可以查新系统有哪些已经安装的软件包,查看这些软件包分别安装了什么文件,这些文件又放在了什么地方等等。这里我给出一个简单的入门手册,供初学者查看参考,快速使用RPM。这些RPM命令都是最最常用的,更复杂的功能大家可以暂时不用管,等确实需要的时候再去查man手册。 安装一个RPM包的一般采用的命令格式如下: # rpm -ivh package.ix86.rpm 在上面的命令中,package是个假定的名字,ix86是这个包为特定的CPU做了优化处理的意思。例如,package可能是ldconfig-1.9.5-14,而ix86是i386这样的。 “-i”参数指明是要安装这个package,而“-v”这个参数则使输出信息增加,“-h”表示在安装过程中显示hashes作为在安装过程的一个进度条。 上面就是所有的关于安装一个RPM包的内容,非常简单而好用吧。当然如果你安装过程中遇到了一些包依赖关系的问题那就稍微要麻烦一些了。包依赖关系问题就是说,你正在安装的包需要其他的包的支持才能正常工作。通常还有可能遇到的问题是所安装的包需要某个软件或者函数库的特定版本才能正常工作。这样的情况下,你可以安装或者升级依赖的软件包,然后继续安装你自己需要安装的软件包。 如果你要看一个RPM包安装以后到底安装了那些文件,你可以使用这个命令: # rpm -ql packagename 这个packagename就是你要查询的软件包的名字,例如ldconfig-1.9.5-14mdk;而“-p”参数表示查询软件包数据库,看这个软件包是否已经安装;“-l”参数表示列出所查询的包的所有安装了的文件的完整的路径。 下面是一个例子: [wh@infonet wh]$ rpm -ql ldconfig-1.9.5-14mdk /sbin/ldconfig /usr/doc/ldconfig-1.9.5 /usr/doc/ldconfig-1.9.5/README 删除某个特定的RPM包软件。采用的命令参数是“-e“,格式如下: # rpm -e packagename “-e”就表示删除(erase)的意思,就是把特定的软件包(packagename)删除掉。 值得注意的是,rpm管理机制不允许你删除某个软件包,如果这个软件包还被其他软件包所依赖。因为一旦你删除了这个软件包,其他依赖他才能运行的软件包也就不能正常使用了。 升级一个已经存在的rpm包软件。升级其实和安装类似,可以参考下面的命令: # rpm -Uvh package.ix86.rpm “-U“参数表示是升级(upgrade),参数“v”和“h”意义和前面一样的,这里不再赘述。 到此,我们已经学会了,如何安装、删除和升级一个使用rpm发布的软件了。:) 引用:??RPM 有五种基本的操作方式(不包括创建软件包): 安装, 卸载, 升级, 查询,和验证。 下面我们就来逐一的讲解吧。??一、 安装RPM包 ??RPM 软件包通常具有类似foo-1.0-1.i386.rpm 的文件名。其中包括 软件包的名称(foo),版本号(1.0),发行号(1), 和 硬件平台(i386)。安装一个软件包只需简单的键入以下命令: $ rpm -ivh foo-1.0-1.i386.rpm foo #################################### RPM安装完毕后会打印出软件包的名字(并不一定与文件名相同), 而后打印一连串的#号以表示安装进度。虽然软件包的安装被设计的尽量简单易行, 但还是可能会发生如下的错误: 1、 软件包已被安装 如果您的软件包已被安装, 将会出现以下信息: $ rpm -ivh foo-1.0-1.i386.rpm foo package foo-1.0-1 is already installed error: foo-1.0-1.i386.rpm cannot be installed 如果您仍旧要安装该软件包,可以在命令行上使用--replacepkgs 选项,RPM将忽略该错误信息强行安装。 2、文件冲突 如果您要安装的软件包中有一个文件已在安装其它软件包时安装,会出现以下错误信息: # rpm -ivh foo-1.0-1.i386.rpm foo /usr/bin/foo conflicts with file from bar-1.0-1 error: foo-1.0-1.i386.rpm cannot be installed 要想让RPM 忽略该错误信息, 请使用--replacefiles 命令行选项。 3、未解决依赖关系 RPM软件包可能依赖于其它软件包,也就是说要求在安装了特定的软件包之后才能安装该软件包。如果在您安装某个软件包时存在这种未解决的依赖关系。会产生以下信息: $ rpm -ivh bar-1.0-1.i386.rpm failed dependencies: foo is needed by bar-1.0-1 您必须安装完所依赖的软件包,才能解决这个问题。如果您想强制安装(这是个坏主意, 因为安装后的软件包未必能正常运行), 请使用--nodeps 命令行选项。 ??二、卸载RPM包 ??卸载软件包就象安装软件包时一样简单: $ rpm -e foo 注意这里使用软件包的名字name ``foo'', 而不是软件包文件的名字file ``foo-1.0-1.i386.rpm''。 如果其它软件包依赖于您要卸载的软件包,卸载时则会产生错误信息。如: $ rpm -e foo removing these packages would break dependencies:foo is needed by bar-1.0-1 若让RPM忽略这个错误继续卸载(这可不是一个好主意,因为依赖于该软件包的程序可能无法运行),请使用--nodeps 命令行选项。 ??三、升级RPM包 ??升级软件包和安装软件包十分类似:. $ rpm -Uvh foo-2.0-1.i386.rpm foo #################################### RPM将自动卸载已安装的老板本的foo 软件包,您不会看到有关信息。事实上您可能总是使用 -U 来安装软件包,因为即便以往未安装过该软件包,也能正常运行。因为RPM 执行智能化的软件包升级,自动处理配置文件,您将会看到如下信息: saving /etc/foo.conf as /etc/foo.conf.rpmsave 这表示您对配置文件的修改不一定能向上兼容。 因此,RPM 会先备份老文件再安装新文件。您应当尽快解决这两个配置文件的不同之处,以使系统能持续正常运行。 因为升级实际包括软件包的卸载与安装两个过程,所以您可能会碰到由这两个操作引起的错误。另一个你可能碰到的问题是:当您使用旧版本的软件包来升级新版本的软件时,RPM会产生以下错误信息: $ rpm -Uvh foo-1.0-1.i386.rpm foo package foo-2.0-1 (which is newer) is already installed error: foo-1.0-1.i386.rpm cannot be installed 如果你确有需要将该软件包”降级,加入 --oldpackage 命令选项就可以了。 ??四、 查询已安装的软件包 ??使用命令rpm -q来查询已安装软件包的数据库。简单的使用命令 rpm -q foo 会打印出foo软件包 的包名 ,版本号,和发行号: $ rpm -q foo foo-2.0-1 除了指定软件包名以外,您还可以使用以下选项来指明要查询哪些软件包的信 息。 这些选项被称之为 “软件包指定选项“。 · -a 查询所有已安装的软件包 · -f 将查询包含有文件. 的软件包 · -p 查询软件包文件名为的软件包 还可以指定查询软件包时所显示的信息。它们被称作信息选择选项: · -i 显示软件包信息,如描述, 发行号, 尺寸, 构建日期, 安装日期, 平台, 以及其它一些各类信息。 · -l 显示软件包中的文件列表。 · -s 显示软件包中所有文件的状态。 · -d 显示被标注为文档的文件列表(man 手册, info 手册, README's, etc)。 · -c 显示被标注为配置文件的文件列表。这些是您要在安装完毕以后加以定制的文件(sendmail.cf, passwd, inittab, etc)。 对于那些要显示文件列表的文件, 您可以增加-v 命令行选项以获得如同 ls -l 格式的输出。 ??五、 验证软件包 ??验证软件包是通过比较已安装的文件和软件包中的原始文件信息来进行的。验证主要是比较文件的尺寸, MD5 校验码, 文件权限, 类型, 属主和用户组等。 rpm-V命令用来验证一个软件包。您可以使用任何包选择选项来查询您要验证的软件包。 命令rpm -V foo 将用来验证foo软件包。又如: · 验证包含特定文件的软件包: rpm -Vf /bin/vi · 验证所有已安装的软件包: rpm -Va · 根据一个RPM包来验证: rpm -Vp foo-1.0-1.i386.rpm 如果您担心你的RPM数据库已被破坏,就可以使用这种方式。 如果一切均校验正常将不会产生任何输出。如果有不一致的地方,就会显示出来。 输出格式是8位长字符串, ``c'' 用以指配置文件, 接着是文件名. 8位字符的每一个 用以表示文件与RPM数据库中一种属性的比较结果 。``.'' (点) 表示测试通过。.下面的字符表示对RPM软件包进行的某种测试失败: 显示字符 错误源 5 MD5 校验码 S 文件尺寸 L 符号连接 T 文件修改日期 D 设备 U 用户 G 用户组 M 模式e (包括权限和文件类型) 如果有错误信息输出, 您应当认真加以考虑,是通过删除还是重新安装来解决出现的问题。 ??六、教你一招 ??RPM不仅是安装/卸载程序的工具,它还是系统维护和诊断的一把好手。看过下面几个例子你就会领教它的厉害了。 · 如果您误删了一些文件, 但您不能肯定到底都删除了那些文件,怎么办? 您可以键入: rpm -Va rpm会在屏幕上显示出文件删除的情况。若你发现一些文件丢失了或已被损坏, 您就可以重新安装或先卸载再安装该软件包。 · 如果您碰到了一个自己不认识的文件,要想查处它属于哪个软件包,您可以输入以下命令 rpm -qf /usr/X11R6/bin/xjewel 输出的结果会是: xjewel-1.6-1 · 如果发生综合以上两个例子的情况,如文件/usr/bin/paste出了问题。您想知道哪个软件包中包含该文件,您这时可以简单的键入: rpm -Vf /usr/bin/paste · 如果您想了解正在使用的程序的详细信息, 您可以键入如下命令来获得软件包中关于该程序的文档信息: rpm -qdf /usr/bin/ispell 输出结果为: /usr/man/man4/ispell.4 /usr/man/man4/english.4 /usr/man/man1/unsq.1 /usr/man/man1/tryaffix.1 /usr/man/man1/sq.1 /usr/man/man1/munchlist.1 /usr/man/man1/ispell.1 /usr/man/man1/findaffix.1 /usr/man/man1/buildhash.1 /usr/info/ispell.info.gz /usr/doc/ispell-3.1.18-1/README · 您发现了一个新的koules RPM,但您不知道它是做什么的,您可以键入如下命令: rpm -qip koules-1.2-2.i386.rpm · 现在您想了解koules的 RPM包在系统里安装了哪些文件, 您可以键入: rpm -qlp koules-1.2-2.i386.rpm输出结果为: /usr/man/man6/koules.6 /usr/lib/games/kouleslib/start.raw /usr/lib/games/kouleslib/end.raw /usr/lib/games/kouleslib/destroy2.raw /usr/lib/games/kouleslib/destroy1.raw /usr/lib/games/kouleslib/creator2.raw /usr/lib/games/kouleslib/creator1.raw /usr/lib/games/kouleslib/colize.raw /usr/lib/games/kouleslib /usr/games/koules 以上只是几个常见例子。随着您进一步的使用RPM,您会发现它的各种功能选项组合可以实现更为强大的RPM包管理功能。 |
cnhnln
|
3#
cnhnln 发表于 2003-09-12 22:38
引用:从一般意义上说,软件包的安装其实是文件的拷贝,RPM安装软件包,也无外乎此。但RPM要更进一步、更聪明一些就需要多做些工作了。聪明的安装 从一般意义上说,软件包的安装其实是文件的拷贝,即把软件所用的各个文件拷贝到特定目录。RPM安装软件包,无外乎此。但RPM要更进一步,更聪明一些。在安装前,它通常要执行以下操作: 1.检查软件包的依赖(Dependency) RPM格式的软件包中可包含有依赖关系的描述,如软件执行时需要什么动态链接库,需要什么程序存在及版本号要求等。当RPM检查时发现所依赖的链接库或程序等不存在或不符合要求时,默认的做法是中止软件包安装。 2.检查软件包的冲突(Conflicts) 有的软件与某些软件不能共存,软件包制作者会将这种冲突记录到RPM软件包中。安装时,若RPM发现有冲突存在,将会中止安装。 3.执行安装前脚本程序(Preinstall) 此类程序由软件包制作者设定,需要在安装前执行。通常是检测操作环境,建立有关目录,清理多余文件等等,为顺利安装作准备。 4.处理配置文件(Configfiles) RPM对配置文件(Configfiles)有着特别的处理。因为用户常常需要根据实际情况,对软件的配置文件做相应的修改。如果安装时简单地覆盖了此类文件,则用户又得重新手工设置,很麻烦。这种情况下,RPM做得比较明智:它将原配置文件换个名字保存了起来(原文件名后缀加上.rpmorig),用户可根据需要再恢复,避免重新设置的尴尬。 5.解压软件包并存放到相应位置 这是最重要的部分,也是软件包安装的关键所在。在这一步,RPM将软件包解压缩,将其中的文件一个个存放到正确的位置,同时,文件的操作权限等属性相应设置正确。 6.执行安装后脚本程序(Postinstall) 此类程序为软件的正确执行设定相关资源,如修改inetd.conf、运行ldconfig程序以利新的动态链接库生效等等。 7.更新RPM数据库 安装后,RPM将所安装的软件及相关信息记录到其数据库中,便于以后升级、查询、校验和卸载。 8.执行安装时触发脚本程序(Triggerin) 触发脚本程序是指软件包满足某种条件(如已安装软件包sendmail,或file版本大于3.0)时才触发执行的脚本程序,它用于软件包之间的交互控制。触发脚本程序有三类:一是软件包安装时才触发的,称为安装时触发脚本程序(triggerin);二是软件包卸载前触发的,叫作卸载前触发脚本程序(triggerun);三是软件包卸载后才触发执行的,称作卸载后触发脚本程序(triggerpostun)。这些触发脚本程序,大大扩展了RPM软件包管理的功能。 命令格式 安装RPM格式的软件包,可使用如下命令格式: rpm -i [安装选项1 安装选项2...] 包裹文件1 包裹文件2... 注:可用--install代替-i,效果相同。 选项列表 包裹文件 对于要安装的RPM格式的包裹文件,RPM对其名字不作强制要求。用户可以使用以下三种方式的命名样式: 1.典型的命名样式(常用): 格式为:软件名-版本号-释出号.体系号.rpm 注:体系号指的是执行程序适用的处理器体系,如i386体系,sparc体系等。体系号为src时表明为源代码包,否则为执行程序包。 如abc-3.2-1.i386.rpm为执行程序包,软件名为abc,版本号为3.2,释出号为1,适用体系为i386,而abc-3.2-1.src.rpm则为源代码包。 2.URL形式的命名样式(较常用) * FTP方式的命名格式:ftp://[用户名[:密码]@]主机[:端口]/包裹文件 注:[]括住的内容表示可选。主机可以是主机名,也可是IP地址。包裹文件可含目录信息。如未指定用户名,则RPM采用匿名方式传输数据(用户名为anonymous)。如未指定密码,则RPM会根据实际情况提示用户输入密码。如未指定端口,则RPM使用默认端口(一般为21)。 如ftp://ftp.xxx.com/yyy.rpm(使用匿名传输,主机ftp.xxx.com,包裹文件yyy.rpm); 如ftp://24.109.164.55:1024/pub/yyy.rpm(匿名FTP传输,主机IP:24.109.164.55,使用1024端口,包裹文件在/pub目录下); 如ftp://zhsoft@ftp.xxx.com/yyy.rpm(主机ftp.xxx.com,FTP用户名zhsoft,如有密码,RPM将会自动提示输入); 如ftp://zhsoft:password@ftp.xxx.com/yyy.rpm(主机ftp.xxx.com,FTP用户名zhsoft,密码password)。 3 HTTP方式的命名:格式为:http://主机[:端口]/包裹文件 注:[]括住的内容可选。主机可以是主机名,也可是IP地址。包裹文件可含目录信息。如未指定端口,则RPM默认使用80端口。 如http://www.xxx.com/yyy.rpm(用HTTP获取www.xxx.com主机上的yyy.rpm文件); 如http://www.xxx.com:8080/pub/yyy.rpm(用HTTP获取www.xxx.com主机上/pub目录下的yyy.rpm文件,使用端口8080)。 3.其它形式(很少使用): 命名格式:任意 如将abc-3.2-1.i386.rpm改名为abc.txt,用RPM安装也会安装成功,其根本原因是RPM判定一个文件是否RPM格式,不是看名字,而是看内容,看其是否符合特定的格式。 参数: 一、安装指定用选项 1.hash(或-h):以#显示安装进度,如果一个软件包很大、安装费时时,用户若想及时了解安装进度,必须用此选项。该选项以显示#号表示进度,每个#号表示2%的进度,总共要显示50个#号。下面安装MySQL软件包,如下所示: # rpm -i --hash MySQL-3.22.32-1.i386.rpm ################################################## # 从上看出,软件包安装顺利完成。 2.percent:以%(百分比)显示安装进度 percent的含义是百分比,而此选项的作用就是以百分比(%)来显示安装进度的。同样是安装MySQL软件包,下面的输出就不一样: # rpm -i --percent MySQL-3.22.32-1.i386.rpm %% 0.000000 %% 0.002600 %% 0.020586 ...... %% 100.000000 # 上例中省略了很多输出(......表示)。因为如果软件包很大,则用--percent时输出的内容会很多,所以用户最好用--hash选项,以#号来表示安装进度,这样简洁明了。 3.test:安装测试 所谓安装测试,意即并非真正的安装,它不拷贝和建立任何文件。使用本选项的目的在于:检测软件包的依赖关系是否满足,是否存在潜在的冲突等等。 # rpm -i --test autofs-3.1.3-2.i386.rpm error: failed dependencies: mktemp is needed by autofs-3.1.3-2 # 本例进行安装测试时发现了依赖方面的错误,autofs所需要的mktemp包不存在,安装中断。 下面先安装mktemp软件包,再进行autofs安装测试,看情况怎么样: # rpm -i mktemp-1.5-2.i386.rpm # rpm -i --test autofs-3.1.3-2.i386.rpm # 由上看出,这次测试没有出现什么错误。 4.replacepkgs:替换软件包 为什么要替换软件包?原因可能是系统中的软件包已经破坏了,其中一个或多个文件丢失或损毁。如果用户想修复这个软件包,用直接安装的方法,RPM将报错退出: # rpm -V file missing/usr/man/man1/file.1 # rpm -i file-3.26-6.i386.rpm package file-3.26-6 is already installed # 注:本例先用RPM校验命令校验一下file软件包,发现/usr/man/man1/file.1文件丢失。之后用安装命令安装,RPM提示软件包file-3.26-6已经安装了。(有关RPM校验命令,<<精通RPM之六--校验篇>>中将会有详细的介绍) 如果采用--replacepkgs选项,结果又怎样呢? # rpm -i --replacepkgs file-3.26-6.i386.rpm # rpm -V file # 看来,RPM成功地替换了原软件包,校验一下该包,发现没有错误输出,所以现在的软件包是完整的。 5.replacefiles:替换文件 RPM是聪明的软件包管理器,它维护着每个已安装软件包的文件信息。如果在安装一个新的软件包时,RPM发现其中某个文件和已安装的某个软件包中的文件名字相同但内容不同,那么RPM就会认为这是一个文件冲突,会报错退出: # rpm -i ff-4.0-2.i386.rpm file /root/my.a from install of ff-4.0-2 conflicts with file from package zoo-6.0-1 # 注:本例中RPM发现要安装的软件包ff-4.0-2与已安装的软件包zoo-6.0-1中,含有相同的一个文件/root/my.a,但其内容并不相同,所以提示了文件冲突的错误。 如果用户想忽略这个错误,可使用--replacefiles选项,指示RPM发现文件冲突时,直接替换掉原文件即可。注意:除非用户对所冲突的文件有很深的了解,不要轻易替换文件,以免破坏已安装软件包的完整性,确保其能正常运行。 # rpm -i --replacefiles ff-4.0-2.i386.rpm # 采用该选项后,软件包能顺利安装了。 另外,说到替换文件,若要安装的软件包中的文件已存在,但此文件并不属于任何软件包,RPM的做法是将文件换名保存(文件名后缀加.rpmorig),并且以警告信息提醒用户。如下所示: # rpm -i foo-6.0-1.i386.rpm warning: /etc/foo.conf saved as /etc/foo.conf.rpmorig # 6.allfiles:安装所有文件 读者看到此选项,也许要问:难道RPM安装软件包不是安装其中所有的文件吗? 我的回答是:如果是初次安装的话,RPM确是将包中所有文件全部安装。但是,如果是修复软件包(用--replacepkgs选项),那结果就不一定了。个中原因是:RPM包中有些配置文件可标识为missingok属性(missingok指的是即使丢失,照样OK),这样的包安装后,若这种类型的配置文件被删除,则修复时RPM默认的做法是不再安装这种类型的文件,除非采用--allfiles选项。下面看个实际的例子: # rpm -i foo-6.0-1.i386.rpm # ls -l /etc/foo.conf -rw-r--r-- 1 root root9 Oct 11 09:50 /etc/foo.conf # rm -f /etc/foo.conf # rpm -i --replacepkgs foo-6.0-1.i386.rpm # ls -l /etc/foo.conf ls: /etc/foo.conf: 文件或目录不存在 # rpm -i --replacepkgs --allfiles foo-6.0-1.i386.rpm # ls -l /etc/foo.conf -rw-r--r-- 1 root root9 Oct 11 09:50 /etc/foo.conf 注:本例中已预先知道foo包中的配置文件/etc/foo.conf带有missingok属性。 (1)用rpm -i命令安装foo包; (2)用ls命令列一下属于该包的配置文件/etc/foo.conf(能列出来,表明文件存在); (3)用rm命令删除了这个文件; (4)用rpm -i --replacepkgs命令修复foo软件包; (5)因为修复时未用--allfiles选项,所以用ls命令列文件/etc/foo.conf时出错了:文件不存在,没有安装上; (6)用rpm -i --replacepkgs --allfiles命令安装修复foo软件包; (7)再度用ls命令列文件,列了出来,表明这次安装上了。 由本例看出,若用户确实想安全恢复(修复)某个软件包,最好使用--allfiles选项。一般情况下则不必这么做,因为带有missingok属性的配置文件本来就是可以丢失的嘛,不必太在意了。 7.force:强制执行 force的含义是强制。--force选项的作用就是强制安装软件包,不考虑软件包是否已安装,也不考虑有没有文件冲突。其效果相当于同时选用--replacepkgs与--replacefiles选项进行安装。 8.excludedocs:不安装说明文档 RPM有多个好功能,其中之一就是:它将文件分为配置文件,说明文档和其它文件三种,这样便于区别对待,灵活处理。 基于RPM安装的LINUX发行版中包括5000多个说明文档,有50M字节,占用的空间不小。如果想节省空间,可使用--excludedocs选项以排除安装说明文档。 如软件包file中包含/usr/man/man1/file.1和/usr/man/man4/magic.4两个说明文档。安装时若使用--excludedocs选项,这两个文档就不会被安装。 # rpm -i --excludedocs file-3.26-6.i386.rpm # ls -l /usr/man/man1/file.1 ls: /usr/man/man1/file.1: 文件或目录不存在 # ls -l /usr/man/man4/magic.4 ls: /usr/man/man4/magic.4: 文件或目录不存在 # 如果用户想让RPM默认不安装说明文档,则可以这么做:编辑~/.rpmmacros文件(用户主目录HOME下的RPM宏文件),加入下面一行: %_excludedocs 1 其作用是定义RPM内部的_excludedocs宏为1,确认不安装说明文档。 这样的话,就不用在命令行使用--excludedocs选项了。 # rpm -i file-3.26-6.i386.rpm # ls -l /usr/man/man1/file.1 ls: /usr/man/man1/file.1: 文件或目录不存在 # ls -l /usr/man/man4/magic.4 ls: /usr/man/man4/magic.4: 文件或目录不存在 # 9.includedocs:安装说明文档 RPM一般情况下是安装说明文档的,但是如果用户自行修改了设定(象上面的例子),则RPM就不再安装说明文档了,除非特别指定,这就用到--includedocs选项。这种情况下,只有用此选项才能确保安装说明文档。 # rpm -i --includedocs file-3.26-6.i386.rpm # ls -l /usr/man/man1/file.1 -rwxr-xr-x 1 root root12023 Mar 23 1999 /usr/man/man1/file.1 # ls -l /usr/man/man4/magic.4 -rwxr-xr-x 1 root root 6625 Mar 23 1999 /usr/man/man4/magic.4 # 10.noscripts:不执行脚本程序 一个RPM软件包中可包含五种脚本程序,即:安装前脚本程序,安装后脚本程序,卸载前脚本程序,卸载后脚本程序和校验脚本程序。安装时使用--noscripts选项,可禁止安装前与安装后脚本程序的执行。 # rpm -i foo-6.0-1.i386.rpm preinstall is running ... done postinstall is running ... done # 上面不禁止脚本程序的执行,下面不执行脚本程序,请看输出结果: # rpm -i --noscripts foo-6.0-1.i386.rpm # 看,因为没有安装前与安装后脚本程序的执行,所以没有什么输出了。 注意:一般用户不要使用此选项。此选项主要提供给软件包制作者使用的。通过禁止执行脚本程序,可以防止因安装带有BUG的软件包而宕掉整个系统。当软件包去掉了BUG后,此选项就不必使用了。 11.nodeps:不检查依赖 RPM管理软件包,不仅管理包中的所有文件,还同时管理着软件包之间的依赖关系。如A依赖于B运行,若B不存在了,则A也就运行不了了。RPM维护着这种关系,尽量避免破坏,以保证软件的正常运行。 # rpm -i autofs-3.1.3-2.i386.rpm error: failed dependencies: mktemp is needed by autofs-3.1.3-2 # 本例安装中出现了依赖方面的错误(autofs依赖mktemp,但mktemp不存在),安装过程中断了。如果要RPM不管依赖关系是否正常都安装,就要用--nodeps选项,指示RPM不检查依赖,这样就能正常安装了。 # rpm -i --nodeps autofs-3.1.3-2.i386.rpm # 注:除非用户对软件包有足够了解,或只想看看软件,否则不要使用本选项,以维护软件间正常的依赖关系。 12.notriggers:不执行触发程序 为了软件包间的交互控制,RPM设计了三种触发程序:安装时触发程序,卸载前触发程序和卸载后触发程序。为了防止因某一软件包的安装而引发安装时触发程序的执行,可以使用--notriggers选项。 13.ignorearch:忽略体系与ignoreos :忽略操作系统 何谓体系?体系就是CPU的类别,有Intel的x86(如i386,i486系列)体系,有Sun的sparc体系等等。当一个软件包建立时,RPM就为其指定了所适用的CPU体系,也为其指定了所适用的操作系统。这样做的好处就是,RPM容易知道为一台计算机所建立的软件包是否适用于兼容于另一台计算机。RPM的资源配置文件(默认为/usr/lib/rpm/rpmrc)中,就定义了体系的兼容关系(arch_compat表达)和操作系统的兼容关系(os_compat表达)。RPM安装一个包裹文件时,要做这样一个兼容方面的检查。如果用户想忽略体系,不管其是否兼容,请用--ignorearch选项安装。如果也不管操作系统是否兼容,可用--ignoreos选项。需要指出的是,若非知道自己这样的目的,否则不要试图这样做。 14.ignoresize:不检查空间大小 RPM安装软件包前,首先要检查当前系统是否有足够的剩余空间,如果空间不足的话,安装将无法完成。使用本选项的目的,在于指示RPM不做空间大小方面的检查,意即不管系统是否有容纳要安装的软件包的空间,照直安装就行了。 15.relocate:重定位 RPM软件包在制作过程中,可以定义一个或多个重定位前缀,以此方便软件的重定位(即把软件包中的文件放到自定义的目录下面),从而增加软件包安装的灵活性。 本选项用于更换指定的重定位目录,如果一个包有多个重定位前缀,可以使用本选项多次。 # rpm -qpl file-3.26-6.i386.rpm /usr/bin/file /usr/man/man1/file.1 /usr/man/man4/magic.4 /usr/share/magic # rpm -i --relocate /usr=/tmp file-3.26-6.i386.rpm # rpm -ql file /tmp/bin/file /tmp/man/man1/file.1 /tmp/man/man4/magic.4 /tmp/share/magic # 注:本例中先用rpm -qpl列出包裹文件file-3.26-6.i386.rpm当中的文件,可以看到其中的文件均是以/usr开头的。之后进行重定位安装,将/usr换作/tmp。最后从列出已安装的file包的文件列表可以看出,原来的/usr目录前缀换作指定的前缀/tmp了,这样实现了软件的重定位。(关于RPM查询命令,详见<<精通RPM之五--查询篇>>) 16.badreloc:强制重定位 RPM软件包的重定位,依赖于制作时重定位前缀的定义。如果没有定义重定位前缀,或者用户安装时所指定的重定位前缀不存在,则RPM会报错退出,中断安装。此时,若用本选项,则RPM会不管这些错误,进行强制的重定位安装。注:本选项和--relocate选项同时使用时才有意义。 如上例,采用并不存在的重定位前缀/usr/man进行安装: # rpm -i --relocate /usr/man=/tmp file-3.26-6.i386.rpm path /usr/man is not relocateable for package file-3.26-6 # RPM提示了错误:/usr/man目录在file-3.26-6包中是不可重定位的。 如加上--badreloc选项,结果怎么样: # rpm -i --relocate /usr/man=/tmp --badreloc file-3.26-6.i386.rpm # rpm -ql file /usr/bin/file /tmp/man1/file.1 /tmp/man4/magic.4 /usr/share/magic # 由上可以看到,这样的强制重定位获得通过,之后再用查询命令rpm -ql列一下file包的文件,就会发现原来的/usr/man/man1/file.1定位成了/tmp/man1/file.1,而/usr/man/man4/magic.4则成了/tmp/man4/magic.4。怎么样?神奇吧! 17.excludepath:不安装指定目录下的文件 利用此选项,可以禁止RPM安装某些指定目录下的文件。如不想安装file软件包中的说明文档,除了可使用--excludedocs选项外,还可使用本选项。因为file的说明文档均在目录/usr/man下面。 # rpm -i --excludepath /usr/man file-3.26-6.i386.rpm # rpm -qls file normal/usr/bin/file not installed /usr/man/man1/file.1 not installed /usr/man/man4/magic.4 normal/usr/share/magic # 注:例子中先安装file软件包,并用--excludepath禁止安装/usr/man下的文件,再用RPM查询命令rpm -qls列出file包的文件及状态,可以看到:/usr/man下的两个文件均未安装(not installed)。 18.justdb:仅更新数据库 安装软件包使用此选项后,RPM将只更新其数据库数据,文件系统不更新,意即并不拷贝和建立包中的文件。 # rpm -i --justdb file-3.26-6.i386.rpm # rpm -qls file normal/usr/bin/file normal/usr/man/man1/file.1 normal/usr/man/man4/magic.4 normal/usr/share/magic # ls -l /usr/bin/file ls: /usr/bin/file: 文件或目录不存在 # 注:例子中安装file包但指明只更新数据库,结果是:虽然用查询命令查到该软件包中所有文件状态均正常(normal),但用ls命令列包中所含文件/usr/bin/file,该文件却不存在。这表明包中文件并未建立。 19.prefix:指定重定位前缀 如前所述,可重定位的软件包可含一个或多个重定位前缀,可用--relocate选项来改变某个重定位前缀之值。--prefix选项仅能用来改变默认的重定位前缀(默认是第一个重定位前缀),它不需要说明原重定位前缀。下面的例子同样将file包安装到/tmp目录: # rpm -qpl file-3.26-6.i386.rpm /usr/bin/file /usr/man/man1/file.1 /usr/man/man4/magic.4 /usr/share/magic # rpm -i --prefix /tmp file-3.26-6.i386.rpm # rpm -ql file /tmp/bin/file /tmp/man/man1/file.1 /tmp/man/man4/magic.4 /tmp/share/magic # 20.ftpproxy:指定FTP代理主机 本选项指定FTP代理主机,主机可以是主机名,也可以是IP地址。 21.ftpport:指定FTP端口 本选项指定FTP协议使用的TCP端口,系统默认是21。 请看下面的例子: # rpm -iv --ftpport 8888 ftp://root@xwboc/tmp/file-3.26-6.i386.rpm Password for root@xwboc: Password for root@xwboc: Retrieving ftp://root@xwboc/tmp/file-3.26-6.i386.rpm file-3.26-6 # 本例中用FTP方式安装file软件包,数据传输使用8888端口。执行中,RPM先提示输入root用户的密码两次,之后下载(retrieve)软件,最后成功安装。 22.httpproxy:指定HTTP代理主机 本选项指定HTTP代理主机,主机可以是主机名,也可以是IP地址。 23.httpport:指定HTTP端口 本选项指定HTTP协议使用的TCP端口,系统默认是80。下面的例子就指定了80端口来安装autofs软件,当然不指定也行,因为系统默认的就是这个端口。 # rpm -iv --httpport 80 http://24.109.164.55/rpms/autofs-3.1.3-2.i386.rpm Retrieving http://24.109.164.55/rpms/autofs-3.1.3-2.i386.rpm autofs-3.1.3-2 # 注:同FTP方式一样,RPM都是下载再安装。 二、通用选项 所谓通用选项,就是不管是安装,升级,卸载还是其它软件包操作,统统适用的选项。 这样的选项主要以下几个: 1.-v:显示附加信息 一般情况下,RPM和不少LINUX命令(如cp,rm,mv等)一样,都本着尽可能少输出信息的原则(除非必要,否则不要输出),这样做是为了避免浪费CPU资源。所以,当用户使用某个命令后没有什么输出,这就意味着命令执行成功了。如果有什么错误,程序会提示的。RPM也是这个样子。为了使RPM输出多一点的信息,可以使用-v选项。 如不带此选项安装file包,没有输出: # rpm -i file-3.26-6.i386.rpm # 而采用-v选项后安装时输出了包名: # rpm -i -v file-3.26-6.i386.rpm file-3.26-6 # 2.-vv:显示调试信息 选用-vv选项,可以使RPM输出更多的信息。这些信息,主要供RPM软件开发者研究使用的,一般用户也可以看看,从中可以知道RPM究竟干些什么。 下面采用此选项安装file包,同时使用管道线(|)将输出数据送nl命令,以带行号输出每行数据。 从执行结果看,输出的信息很多,其中以D:开头的行均是调试信息。现在逐行解释: 第1行:统计要安装的软件包个数; 第2行:RPM找到1个包; 第3行:查看哪些包需要下载(这些要下载的包,都是以FTP或HTTP形式书写的包名); 第4行:下载了0个包; 第5-10行:取包裹文件的文件头信息,算出软件包占用的空间68019(字节),以利检查 系统是否有足够空间。 第11行:打开RPM数据库; 第12行:找到0个源代码包,1个执行代码包; 第13-18行:检查软件包的依赖关系。其依赖(requires)的东西均得到满足(satisfied)。 第19行:准备安装执行代码包; 第20行:取得已安装文件系统的列表; 第21-26行:再度取包裹文件头信息,算出软件包占用空间; 第27-31行:列出包中文件及要执行的操作,第27行的test=0表示不是进行安装测试, file包中的文件均要执行创建操作(create)。 第32行:如果有安装前执行脚本程序的话,执行它; 第33行:安装软件包file-3.26-6; 第34行:如果有安装后执行脚本程序的话,执行它。 3.root:指定根目录 指定根目录ROOT,其作用在于将系统所有操作限定在指定的目录下面,这样RPM操作的数据库位置变了,软件包的安装位置也变了。它是通过chroot系统调用实现的。RPM默认的数据库目录是/var/lib/rpm,如果指定根目录为/usr,则RPM的数据库目录将变为/usr/var/lib/rpm。同样,如果包中有个文件为/etc/zhsoft.txt,则安装后为/usr/etc/zhsoft.txt。 看下面的例子: # rpm -i --root /usr file-3.26-6.i386.rpm failed to open /usr/var/lib/rpm/packages.rpm error: 不能打开 /usr/var/lib/rpm/packages.rpm # 注:指定RPM根目录为/usr安装file出现错误,RPM打不开/usr/var/lib/rpm/packages.rpm文件,这是因为实际上在/usr/var/lib/rpm目录下没有任何RPM数据库。如果想成功安装,可用初始化RPM数据库命令来建立RPM数据库,命令是rpm --initdb --root /usr(这些功能将在以后讲到)。 4.rcfile:指定RPM资源配置文件 RPM的资源配置文件里,存放着RPM的默认设置,有编译选项optflags,体系定义arch_canon,兼容定义arch_compat,宏文件定义macrofiles等。RPM默认的资源配置文件(按读取顺序)为:/usr/lib/rpm/rpmrc,/etc/rpmrc,~/.rpmrc。(后两个文件现在意义不大了,如今一般换作RPM宏文件了。较之资源配置文件,宏文件有更大的灵活性。) 如果想让RPM使用用户指定的资源配置文件,就用--rcfile来设定,可同时设定多个文件,文件间以冒号(:)分隔,如/usr/lib/rpm/rpmrc:/etc/rpmrc:~/.rpmrc这种形式。 5.dbpath:指定RPM数据库目录 本选项不同于--root选项,它仅仅是指定RPM数据库的目录,并不改变安装文件的位置。 引用:升级做什么RPM的升级功能是它受到用户好评的原因之一。因为用户自己将一个软件包从旧版本升级到新版本,特别是大型软件,需要有经验的支持和技术的积累,比较复杂,而用RPM升级软件,只需一个rpm -U命令就可以了,极大方便了用户。 软件升级基本做两项工作,一是安装新版本,二是卸载旧版本。RPM还有一项重要的工作要做,这就是妥善处理配置文件(CONFIG FILE)。若直接采用安装方式,则用户已配置好的配置文件就会被覆盖,不符合用户要求。 配置文件处理 RPM对某个配置文件,通过比较三种不同的MD5检查和(checksum)来决定如何处理它。这三种不同的MD5检查和是: 1. 原检查和。它是旧版本软件包安装时配置文件的MD5检查和。 2. 当前检查和。它是升级时旧版本配置文件的MD5检查和。 3. 新检查和。它是新版本软件包中配置文件的MD5检查和。 RPM针对以下几种情况分别处理: 1. 当原检查和=X,当前检查和=X,新检查和=X时: 这表明配置文件未曾修改过。此时,RPM会将新的配置文件覆盖掉原文件,而不是对原文件不作处理,原因在于: 虽然文件名和文件内容都没有变化,但文件别的方面的属性(如文件的属主,属组,权限等)却可能改变,所以有必要覆盖一下。 2. 当原检查和=X,当前检查和=X,新检查和=Y时: 这表明原配置文件没有改动过,但是它与新软件包中的配置文件却有所不同。这种情况下,RPM将用新文件覆盖掉旧文件,并且旧文件不作保存(因为它不曾改动过,没有必要保存)。 3. 当原检查和=X,当前检查和=Y,新检查和=X时: 这表明新文件与旧文件内容相同,但当前文件已经作过修改,这些修改对于新版本来说应该是合法的,可以使用的。因此,RPM对当前文件予以保留。 4. 当原检查和=X,当前检查和=Y,新检查和=Y时: 这表明原文件经过修改,现在已与新文件相同,这或许是用户用来修补安全上的漏洞,新版本也作了同样的修改。这种情况下,RPM将新文件覆盖当前文件,避免文件属性方面的不同。 5. 当原检查和=X,当前检查和=Y,新检查和=Z时: 这表明用户已修改了原文件,并且当前内容与新文件内容不同。这种情况下,RPM无法保证新版本软件能正常使用当前的配置文件,所以采用了一个比较明智的办法,既能保护用户的配置数据,又能保证新版本软件正常。这种作法就是将当前文件换名保存(给原文件名加个.rpmsave的后缀,如原文件名为ABC,则换名后为ABC.rpmsave),同时安装新文件,并给出警告信息,如: warning: /etc/.funkey saved as /etc/.funkey.rpmsave 6. 当没有原检查和时: 此种情况下,当前检查和与新检查和已无关紧要,这表明没有安装过此配置文件。因为没有安装过此配置文件,所以RPM无法判断当前文件是否被用户修改过。这种情况下,RPM会将当前文件换名保存(原文件名后缀不是加个.rpmsave,而是.rpmorig),同时安装新文件,并给出警告信息,如: warning: /etc/.inputdef saved as /etc/.inputdef.rpmsave 升级命令格式 升级RPM包时,请用以下命令格式: rpm -U [升级选项1 升级选项2...] [软件包标识1 软件包标识2...] 其中: 也可使用--upgrade代替-U,效果相同。 软件包标识 有关软件包标识的定义,请参见<<精通RPM之三--卸载篇>>。 选项列表 选项说明 因为升级也是一种安装,所以升级的选项列表与安装选项列表基本相同,只是升级的选项列表增加了一项--oldpackage。现着重说明一下这个选项,其它选项说明见<<精通RPM之二--安装篇>>,在此恕不赘述。 --oldpackage选项: 从名字上就可以看出来是老版本软件包的意思。为什么要将软件"升级"到老版本?(这里的升级其实是降级)这里面有个原因。用户一直好好地用着老版本的软件,当有一天发现有新版本发布时,马上用rpm -U命令升级到系统中,但因为新版本有"臭虫",所以这个软件暂时不能正常工作。而这时,直接用rpm -U命令是升级不到老版本的,因为一般情况的升级是将老版本升级到新版本,RPM默认这一点。若想升级到老版本,则必须用这个特殊的选项。下面举个例子: # rpm -U -v lze-6.0-1.i386.rpm package lze-7.0-1 (which is newer then lze-6.0-1) is already installed # 注: 本例在升级过程中出现错误,RPM提示lze软件包已安装,并且现存版本号7.0,高于准备升级的版本号6.0,升级无法继续。 若在命令行使用--oldpackage,结果会怎么样呢? # rpm -U -v --oldpackage lze-6.0-1.i386.rpm lze-6.0-1 # 注: 命令执行后输出了软件包标识lze-6.0-1,表明升级到老版本成功了。 下面通过输出调试信息来观察一下升级软件包时RPM做的主要工作: # rpm -U -vv --oldpackage foo-3.0-2.i386.rpm 2>&1 | nl 1 D: counting packages to install 2 D: found 1 packages 3 D: looking for packages to download 4 D: retrieved 0 packages 5 D: New Header signature 6 D: Signature size: 68 7 D: Signature pad : 4 8 D: sigsize : 72 9 D: Header + Archive: 1577 10 D: expected size : 1577 11 D: opening database mode 0x42 in //var/lib/rpm/ 12 D: found 0 source and 1 binary packages 13 D: requires: /bin/sh satisfied by db file lists. 14 D: installing binary packages 15 D: getting list of mounted filesystems 16 D: New Header signature 17 D: Signature size: 68 18 D: Signature pad : 4 19 D: sigsize : 72 20 D: Header + Archive: 1577 21 D: expected size : 1577 22 D: package: foo-3.0-2 files test = 0 23 D:file: /etc/foo.conf action: create 24 D:file: /usr/bin/foo action: create 25 D: running preinstall script (if any) 26 + echo preinstall 27 preinstall 28 foo-3.0-2 29 D: running postinstall scripts (if any) 30 + echo postinstall 31 postinstall 32 + echo triggerinstall 33 triggerinstall 34 + echo triggeruninstall 35 triggeruninstall 36 + echo preuninstall 37 preuninstall 38 D: will remove files test = 0 39 D:file: /usr/bin/foo action: skip 40 D:file: /etc/foo.conf action: skip 41 D: running postuninstall script (if any) 42 + echo postuninstall 43 postuninstall 44 D: removing database entry 45 D: removing name index 46 D: removing group index 47 D: removing requiredby index for /bin/sh 48 D: removing trigger index for file 49 D: removing trigger index for file 50 D: removing trigger index for file 51 D: removing file index for foo.conf 52 D: removing file index for foo 注: 第1-4行: 计算命令行上要升级的包数,并且下载那些需要下载的包裹文件; 第5-10行: 根据包裹文件头部信息,确定软件占用空间; 第11,12行: 打开RPM数据库及包裹文件; 第13行: 检查依赖是否满足,本例满足; 第14行: 安装执行程序包; 第15行: 取当前已安装文件系统列表; 第16-21行: 再度检查包裹头信息,确定占用系统空间; 第22-24行: 确定包中各个文件的执行操作(action),均为建立(create); 第25行: 执行安装前脚本程序(如果有的话); 第26-27行: 以+开头的为脚本程序执行的命令,其后为其输出结果; 第28行: 安装foo-3.0-2包; 第29行: 执行安装后脚本程序(如果有的话); 第30-31行: 以+开头的为脚本程序执行的命令,其它为执行结果; 第32-33行: 执行安装时触发脚本程序; 第34-35行: 执行卸载前触发脚本程序,自此开始卸载原软件包; 第36-37行: 执行卸载前脚本程序; 第38-40行: 确定原包中各文件的执行操作,本例均为跳过(skip),即不作处理; 第41-43行: 执行卸载后脚本程序; 第44-52行: 删除原包在RPM数据库中的所有信息(数据及索引)。 引用:??RPM不仅在安装,升级,卸载方面工作出色,而且在查询方面比其它软件包管理工具更胜一筹。这从以下几种情况可以看出:* 当你在浏览系统文件时,发现一个文件,想知道它来自哪个软件包时,可以用RPM来查询得知; * 当你的朋友给你发送来一个软件包,但你不知道这是个什么样的软件包,不知道它做些什么,安装些什么,来源是哪里。这时,你可以用RPM查询搞定; * 几个月前你安装了XFree86窗口软件,但现在你忘了它的版本号,也不知它的说明文档在哪里。这时,你可以用RPM查询一下这个软件包,得到这方面的信息。 RPM的查询还有一个高级功能,即定制输出功能。你可用--queryformat(或-qf)来定制一下输出格式,这样,RPM查询得到的信息将以你定制的格式输出,这样很是方便,尤适合于程序的自动处理。 命令格式 查询RPM格式的软件包,可使用如下命令格式: rpm -q [查询选项1 查询选项2...] 注: 也可使用--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) : 查询所有已安装的软件包 # rpm -q -a setup-2.0.2-1 filesystem-1.3.4-5 basesystem-6.0-5 agrep-2.04-5 aktion-0.3.6-2 amor-0.5-1 dhcpcd-1.3.17pl2-1 ldconfig-1.9.5-15 glibc-2.1.2-12 chkconfig-1.0.6-2 ...... # 注: 本例查找当前系统中安装的所有软件包,输出很多,仅列出几个,剩下的省略掉了(以......表示)。 ??(2) -g (或--group) : 查询有哪些软件包属于指定类别 RPM根据软件功用的不同,将软件分为以下若干类括号内为注释) Amusements/Games (娱乐/游戏) Amusements/Graphics(娱乐/图形) Applications/Archiving (应用/档案) Applications/Communications (应用/通讯) Applications/Databases (应用/数据库) Applications/Editors (应用/编辑器) Applications/Emulators (应用/仿真器) Applications/Engineering (应用/工程) Applications/File (应用/文件) Applications/Internet (应用/因特网) Applications/Multimedia (应用/多媒体) Applications/Productivity (应用/产品) Applications/Publishing (应用/印刷) Applications/System (应用/系统) Applications/Text (应用/文本) Development/Debuggers (开发/调试器) Development/Languages (开发/语言) Development/Libraries (开发/函数库) Development/System (开发/系统) Development/Tools (开发/工具) Documentation (说明文档) System Environment/Base (系统环境/基础) System Environment/Daemons (系统环境/守护) System Environment/Kernel (系统环境/内核) System Environment/Libraries (系统环境/函数库) System Environment/Shells (系统环境/接口) User Interface/Desktops (用户界面/桌面) User Interface/X (用户界面/X窗口) User Interface/X Hardware Support (用户界面/X硬件支持) Other (其它) 注意: 类别是大小写敏感的,这一点输入时要小心。如果用户想要查询当前系统安装了哪些游戏类的软件包,可这样做: # rpm -q -g Amusements/Games clanbomber-1.01-1 kdegames-1.1.2-1 xbill-2.0-6 xboard-4.0.0-3 xboing-2.4-7 xgammon-0.98-14 xjewel-1.6-11 xpat2-1.04-10 xpilot-3.6.2-6 xpuzzles-5.4.1-7 xtrojka-1.2.3-6 # 如果用户想查询若干类别的软件包时,可以把类别都列出来,一起查询,如: # rpm -q -g Applications/Editors Applications/File emacs-20.3-15 emacs-nox-20.3-15 emacs-X11-20.3-15 vim-common-5.6-12 vim-minimal-5.6-12 vim-X11-5.6-12 fileutils-4.0-3 bzip2-0.9.5d-1 findutils-4.1-32 git-4.3.17-6 gzip-1.2.4-15 slocate-1.4-7 stat-1.5-12 file-3.26-6 # 注: 本例查询结果中前6个为"应用/编辑器"类别,后8个为"应用/文件"类别。 ??(3) -f (或--file) : 查询有哪些软件包拥有指定文件这个选项非常有用。当用户不清楚某个文件属于哪个软件包时,可试试这个选项。假如我记不清/usr/sbin/ftpd这个文件在哪个包中,现在用RPM查询: # rpm -qf /usr/sbin/ftpd inet6-apps-0.36-3 # 现在知道了,它在inet6-apps-0.36-3包中。命令中-qf是-q -f的缩写,当选项仅带一个减号时,多个选项可以合并在一起,如-a -b -c三个选项可写作-abc,执行效果相同。 ??(4) --whatrequires : 查询有哪些包需要指定功能 本选项指示RPM从所有已安装的软件包中,查询有哪些软件包提供了用户指定的功能,命令行上可输入一个或多个功能。 # rpm -q --whatrequires /bin/ps libc.so.6 | head autofs-3.1.3-2 agrep-2.04-5 aktion-0.3.6-2 amor-0.5-1 chkconfig-1.0.6-2 libtermcap-2.0.8-16 bash-2.03-10 ncurses-4.2-18 info-3.12f-4 fileutils-4.0-3 # 注: 本例从系统中查询哪些软件包需要/bin/ps和libc.so.6功能,通过管道输出前10行内容。 ??(5) --whatprovides : 查询有哪些包提供指定功能 本选项指示RPM从所有已安装的软件包中,查询有哪些软件包提供了用户指定的功能。命令行上可输入一个或多个功能。 # rpm -q --whatprovides libc.so.6 /bin/ps glibc-2.1.2-12 no package provides /bin/ps # 注: 本例从系统中查询有哪些软件包提供libc.so.6与/bin/ps功能,结果是glibc-2.1.2-12包提供了libc.so.6,而没有包提供/bin/ps功能。 (??6) --triggeredby : 查询有哪些包被指定的包触发本选项指示RPM从所有已安装的软件包中,查询有哪些包可被用户指定的包触发。指定的包可输入一个或多个。 # rpm -q --triggeredby file foo-8.0-1 # 注: 本例查询后得知,安装或卸载foo-8.0-1包,将会触发与file包相关的脚本程序执行。 ??2. 查询未安装的软件包: (仅有一个选项可用) ??(1) -p : 查询指定包裹文件的信息 使用本选项,通过指定一个或多个包裹文件名,RPM就可以获取相应包裹的有关信息。包裹文件可以是一般形式,也可是ftp/http形式。 # rpm -qp -l --ftpport 2121 ftp://zzz:pass@linux/zhsoft/file-3.26-6.i386.rpm /usr/bin/file /usr/man/man1/file.1 /usr/man/man4/magic.4 /usr/share/magic # 注: 本例查询ftp形式的包裹,显示其文件列表(-l选项使然,下面要讲到)。ftp用户名zzz,密码为pass,远程机为linux,文件名为/zhsoft/file-3.26-6.i386.rpm,ftp使用2121端口。 ??二、信息显示类 ??本类选项可同时选择多个,以显示多种信息。 ??1. -i : 显示软件包信息 ??当用户需要了解软件包的头部信息时,要使用该选项。 # rpm -qi file Name: file Relocations: /usr Version : 3.26 Vendor: Red Hat Software Release : 6 Build Date: 1999年03月23日 星期二 05时32分29秒 Install date: 2001年10月14日 星期日 21时18分25秒 Build Host: porky.devel.redhat.com Group : Applications/File Source RPM: file-3.26-6.src.rpm Size: 211946 License: distributable Packager: Red Hat Software Summary : A utility for determining file types. Description : The file command is used to identify a particular file according to the type of data contained by the file. File can identify many different file types, including ELF binaries, system libraries, RPM packages, and different graphics formats. You should install the file package, since the file command is such a useful utility. # 上述输出中,包含多个域,各个域的含义为: Name : 软件名;Relocations : 重定位目录前缀(一个或多个); Version : 版本号;Vendor : 开发商; Release : 释出号;Build Date : 包建立时间; Install date : 安装时间; Build host : 包建立主机; Group: 类别; Source RPM : 源代码包; Size : 大小; License : 许可证; Packager : 打包者; Summary : 软件简介; Description : 详细描述。 ??2. -l (或--list) : 显示软件包文件列表 当用户想知道软件包包含哪些文件时,要使用该选项。输出时,一行一个文件名,形成文 件列表。下例列出file包中文件: # rpm -qlv file -rwxr-xr-x root root23948 3月 23 1999 /usr/bin/file -rwxr-xr-x root root12023 3月 23 1999 /usr/man/man1/file.1 -rwxr-xr-x root root 6625 3月 23 1999 /usr/man/man4/magic.4 -rwxr-xr-x root root 169350 3月 23 1999 /usr/share/magic # 注: 本例列文件时选用了通用选项-v,这样列出的格式同ls命令列出的格式,从中可以看到各个文件的权限,属主,属组,大小,最后修改时间及文件名等信息。 ??3. -d (或--docfiles) : 显示软件包说明文档RPM将软件包中的文件分为三类,一是配置文件,一是说明文档,再一是其它文件(包括可执行程序及数据文件等)。通过-d选项,可列出包中所有说明文档。下例列出file包中说明文档: # rpm -qd file /usr/man/man1/file.1 /usr/man/man4/magic.4 # ??4. -c (或--configfiles) : 显示软件包配置文件使用本选项可列出包中所有配置文件。下例列出lze包中的配置文件: # rpm -qc lze /etc/funkey.def /etc/inputme.def # ??5. -s (或--state) : 显示软件包文件状态RPM已安装的软件包中各个文件可拥有如下4种状态: * normal(正常): 这表明文件未被其它软件包修改过。 * replaced(已替换): 这表明文件已被其它软件包修改替换过了,不再是原先的文件了。* not installed(未安装): 这表明文件未安装。有一种原因可导致这种情况发生,这就是当安装软件包时使用了--excludedocs选项(或是通过设置%_excludedocs宏为1),说明文档未被安装到系统中。当用RPM查询此软件包状态时,所有说明文档均显示此状态。 * net shared(网络共享): 这表明文件处于网络共享状态。这一状态是RPM用来支持NFS(网络文件系统)的,用于避免一个NFS客户端系统删除一个正在共享的文件时,另一NFS客户端系统无法正常使用含此文件的软件包。有两种情况可使文件在此状态,一是文件安装在真实网络共享的目录里,二是文件安装在RPM资源配置文件中%_netsharedpath宏所确定的目录里。 # rpm -i --excludedocs file-3.26-6.i386.rpm # rpm -qs file normal/usr/bin/file not installed /usr/man/man1/file.1 not installed /usr/man/man4/magic.4 normal/usr/share/magic # 注: 本例先安装file包裹文件,选用--excludedocs表明不安装说明文档。而后再查询file包文件的状态,可以看到其说明文档均为not installed(未安装),其它文件为normal(正常)状态。 ??6. -R (或--requires) : 显示软件包所需的功能 所谓功能,可以是软件包标识,可以是文件(如共享库libc.so.6等),也可以是虚拟的名字。软件包的依赖关系,就是依靠功能来实现的。RPM安装软件包时,如果所需功能不存在,则其依赖关系不满足,RPM将中断安装过程。 # rpm -q -R lze /bin/sh ld-linux.so.2 libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) # 注: 本例查询lze包所需的功能。 ??7. --provides : 显示软件包提供的功能 一个软件包,可以提供若干功能,这些功能可以是动态链接库等实际的文件,也可以是虚拟的名字(只要其它软件包可以用就行了)。如果想查询某个包提供了哪些功能,要用--provides 选项。 下面的例子查询一个包裹文件所提供的功能: # rpm -qp --provides zlib-1.1.3-6.i386.rpm libz.so.1 libz.so.1(GCC.INTERNAL) # 注: 本包裹文件提供的功能是libz.so.1动态链接库。 ??8. --conflicts : 显示软件包冲突的功能 何谓冲突?冲突就是不同软件包之间不能共存的现象。RPM制作软件包时,可以记录下与本软件包不能共存的功能,这样安装该包时,若冲突的功能已然存在,则RPM将中止安装。 下面的例子查询at-3.1.7-8包是否有与其冲突的功能: # rpm -q --conflicts at-3.1.7-8 crontabs <= 1.5 # 注: 本例显示at包与版本号小于1.5的crontabs包有冲突存在。 ??9. --scripts : 显示软件包内置的脚本程序 scripts即脚本,指的是用SHELL语言编写的程序。选用本选项时,RPM将输出软件包所含的各类脚本程序的内容。总共有5类这样的脚本程序,即安装前脚本程序(preinstall),安装后脚本程序(postinstall),卸载前脚本程序(preuninstall),卸载后脚本程序(postuninstall)和校验脚本程序(verify)。 下面的例子列出zsh包的脚本程序: # rpm -q --scripts zsh-3.0.7-4 | nl 1 postinstall script (through /bin/sh): 2 if [ ! -f /etc/shells ] ; then 3 echo "/bin/zsh" > /etc/shells 4 else 5 echo "/bin/zsh" >> /etc/shells 6 fi 7 /sbin/install-info /usr/info/zsh.info.gz /usr/info/dir \ 8 --entry="* zsh: (zsh). An enhanced bourne shell." 9 preuninstall script (through /bin/sh): 10 if [ "$1" = 0 ] ; then 11 /sbin/install-info --delete /usr/info/zsh.info.gz /usr/info/dir \ 12 --entry="* zsh: (zsh). An enhanced bourne shell." 13 fi 14 postuninstall script (through /bin/sh): 15 if [ "$1" = 0 ] ; then 16 if [ -f /etc/shells ] ; then 17 TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX` 18 grep -v '^/bin/zsh$' /etc/shells > $TmpFile 19 cp -f $TmpFile /etc/shells 20 rm -f $TmpFile 21 chmod 644 /etc/shells 22 fi 23 fi # 注: 本例利用管道技术给查询的每行输出加上了行号,便于观察解释。 第2-8行: 为安装后脚本程序(postinstall)的源代码; 第10-13行: 为卸载前脚本程序(preuninstall)的源代码; 第15-23行: 为卸载后脚本程序(postuninstall)的源代码。 例中所有脚本程序均通过/bin/sh解释执行,本例没有安装前脚本程序(preinstall)和 校验脚本程序(verify)。 ??10. --triggers : 显示软件包内置的触发脚本程序 触发脚本程序是scripts类脚本程序的扩展,它用于软件包之间的交互控制。触发脚本 程序有安装时触发脚本程序(triggerin),卸载前触发脚本程序(triggerun)和卸载后触发脚 本程序(triggerpostun)三种。 下面的例子列出zsh包中的触发脚本程序: # rpm -q --triggers zsh-3.0.7-4 triggerpostun script (through /bin/sh) -- zsh <= 3.0.7-2 if [ ! -f /etc/shells ] ; then echo "/bin/zsh" > /etc/shells else echo "/bin/zsh" >> /etc/shells fi # 注: 输出的第1行说明脚本程序的类别(为卸载后触发脚本程序triggerpostun),用什么程序解释(一般为/bin/sh),和触发的条件(在--之后描述)。本例的触发条件为zsh的版本小于或等于3.0.7-2。如果条件成立,则此脚本程序将会执行。 输出的第2-6行为卸载后触发脚本程序的源代码。 ??11. --changelog : 显示软件维护记录 changelog即软件维护记录,用它来记录什么人,什么时间,改动了软件的什么地方。通 过查看维护记录,开发者或用户可以了解软件的开发进展情况。 下面的例子查询lze包的维护情况: # rpm -q --changelog lze-6.0-2 * 五 5月 01 1998 雨亦奇 - 增加多窗口操作 * 一 3月 24 1997 雨亦奇 - 增加块操作命令 # 注: 从本例中就可以看出来,维护记录的书写有一定的规范:以星号(*)开头的行记录维护时间,维护人及其电子邮箱,而以减号(-)开头的行则记录维护的具体内容。 ??12. --dump : 显示软件包中所有文件的属性信息 如果用户想查看某个软件包内文件的属性信息,请用--dump选项。 # rpm -q --dump file /usr/bin/file 23948 922138347 abaf6cfd51588ac7c484526fbdb84e5b 0100755 root root 0 0 0 X /usr/man/man1/file.1 12023 922138346 76d9ff6567ab64a53eab50911272f5c1 0100755 root root 0 1 0 X /usr/man/man4/magic.4 6625 922138346 b8d126803709f0da7f39f5125a132cd3 0100755root root 0 1 0 X /usr/share/magic 169350 922138346 3bd2eaf3c5e0e84153ba7df38b7561fc 0100755 root root 0 0 0 X # 现在根据例子的输出,解释一下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遇到此字符时,会根据预先定义的转义序列,把后面的字符解释后输出。 转义序列如下: \a : 输出响铃字符(值为7),效果是喇叭鸣叫一声。 \b : 输出退格符(值为,效果是删除光标前面一个字符,且光标后退一个字符位置。 \f : 输出换页符(值为12),根据终端解释的不同,效果也不相同,有的是实现清屏操作,有的则是换一行。 \n : 输出换行符(值为10),效果是光标移到下一行。 \r : 输出回车符(值为13),效果是光标回到行首。 \t : 输出跳格(值为9),根据终端解释的不同,效果也不同,有的是输出一个空格,有的 则输出最多8个空格。 \v : 输出垂直方向的跳格(值为11),用处不大。 \\ : 输出反斜杠(\)这个字符。 * 功能标签 RPM内置了很多功能标签,如NAME表示软件名,VERSION表示版本号,RELEASE表示释出号等。输出功能标签所表示的内容时,需用这样一种格式: %[输出宽度]{功能标签} 注:输出宽度可选,正值表示右对齐输出,负值表示左对齐输出。 如格式串中使用%{NAME}时将输出软件名,使用%20{NAME}时则右对齐输出软件名,宽度为20,而使用%-20{NAME}时则按宽度为20左对齐输出软件名。看看下面的实际例子就会明白: # rpm -q --qf "%{NAME}:%20{NAME}:%-20{NAME}:\n" file file:file:file: # 功能标签书写不区分大小写,即NAME也可输作name,Name等等。功能标签还可以带有选项,选项用":选项名"表示,选项名有大小写之分。如%{FILEMODES}默认以数字形式输出,如采用perms选项,即%{FILEMODES:perms},输出结果将采用rwx的形式。请看下面的例子: # rpm -q --qf "%{filenames} %{FILEMODES:perms}\n" file /usr/bin/file -rwxr-xr-x- # 注: %{filenames}表示包中的文件名。 RPM常用功能标签表 注: 可用rpm --querytags命令查到RPM内置的所有功能标签。 * 数组循环 对于功能标签是数组的,可以用数组循环(用[与]括住的部分)来输出数组的全部内容。数组循环内部可包含功能标签,普通文本和含转义符的文本。RPM将根据循环内部一个或多个数组类型的功能标签所拥有的单元个数,取其最小值,循环同样次数,输出解释或转义后的数据。对于功能标签仅含一个单元的,若想输出多次,则需要在功能标签前面加个等号(=)。 下面的例子以数组循环的方式,输出file包所含的各个文件的文件名及权限,同时输出每一个文件时都要先输出软件包标识。 # rpm -q --qf "[%{=NAME}-%{=VERSION}-%{=RELEASE} : %-20{FILENAMES} : %{FILEMODES:perms}\n]" file file-3.26-6 : /usr/bin/file : -rwxr-xr-x- file-3.26-6 : /usr/man/man1/file.1 : -rwxr-xr-x- file-3.26-6 : /usr/man/man4/magic.4 : -rwxr-xr-x- file-3.26-6 : /usr/share/magic : -rwxr-xr-x- # 通过使用定制输出,我们可以很方便地查找出系统中占用空间最大的软件包。 # rpm -q -a --qf "%{NAME} %{SIZE}\n" | sort -nr +1 | head -1 kernel-source 65824967 # 注: -a项选择所有已安装的软件包,--qf项定制查询格式, 格式串中用功能标签NAME输出软件名,用SIZE输出软件大小,查询得到的数据通过管道送sort命令,对第2列降序排序后由head命令取第1行内容,这即是占用空间最大的软件包。 |
日月迁
|
4#
日月迁 发表于 2003-09-13 11:57
多谢楼主,获益非浅!
|
依梦林
|
5#
依梦林 发表于 2003-09-14 10:23
原来这里面还有那么多学问阿
我以前就知到 -i 这个参数,至于是什么意思还不明白。 多谢指教!!! |
cnhnln
|
6#
cnhnln 发表于 2003-09-14 13:40
不好意思,原来是rpmbuild的用法。我还以为是rpm的用法呢
日月迁, 为什么谢楼主不谢我 :-( |
zq97_0
|
7#
zq97_0 发表于 2003-09-14 20:04
哦。对不起,谢谢你(茶点都忘了,正在研究上面的东西),再次谢谢。
|