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 <file>; 将查询包含有文件<file>;. 的软件包 
· -p <packagefile>; 查询软件包文件名为<packagefile>;的软件包 
还可以指定查询软件包时所显示的信息。它们被称作信息选择选项: 
· -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

转载于:https://blog.51cto.com/8276689/2124961

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/451549.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/451549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unix 多进程编程

一.多进程程序的特点由于UNIX系统是分时多用户系统, CPU按时间片分配给各个用户使用, 而在实质上应该说CPU按时间片分配给各个进程使用, 每个进程都有自己的运行环境以使得在CPU做进程切换时不会"忘记"该进程已计算了一半的"半成品". 以DOS的概念来说, 进程…

Redis单线程模型是什么?

参考文章&#xff1a; redis 单线程的理解 谢谢作者分享&#xff01;

寂静的时候

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 每每听到熟悉的旋律&#xff0c;终又会骤然就无法抑制排山倒海般的忧伤... 就这样想往若已经年迈到只能坐在夕阳余晖里遥望远方该多好.…

@staticmethod和@classmethod的作用与区别

一般来说&#xff0c;要使用某个类的方法&#xff0c;需要先实例化一个对象再调用方法。 而使用staticmethod或classmethod&#xff0c;就可以不需要实例化&#xff0c;直接类名.方法名()来调用。 这有利于组织代码&#xff0c;把某些应该属于某个类的函数给放到那个类里去&…

前端开发注意事项(HTML与CSS进阶)

HTML 与 CSS 进阶 Img 标签 alt 属性 一定要添加 用于图片描述 给机器看的&#xff0c;如果图片加载失败&#xff0c;会显示 alt <img src"" alt""/> 为 img 添加 图片注释 建议做法为 figure(图形) 和 figcaption [caption(字幕)]<figure>…

如果你懂我…

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 想往的世界&#xff0c;有风如深秋的柳絮… 翻飞在遥远的寂静里… 若冷落…若别离… 若守候…若赤诚… 若我…

[NOI2005]维护数列 恶心到毁天灭地的splay

传送门 debug到死2333. 虽然说是splay维护序列模板&#xff0c;作为蒟蒻的我还是GG %%%考场A的dalao Orz Orz. 其实不开long long也行&#xff0c;inf开成0x3f3f3f3f也可&#xff08;flag,欢迎推翻&#xff09; 就当存个板子吧. #include<bits/stdc.h> #include<cs…

Python的from import和import的区别

对于from...import...&#xff0c;其意义具体是from Module import Function或Class等&#xff0c;这个只是从模块中导入一个或几个函数或类的做法。另外一个常见的是import Module&#xff0c;就是把整个模块中得东西都导入&#xff0c;所以你后面的程序就都可以使用了。另外还…

静态代理、动态代理、AOP

参考文章&#xff1a; Java中的代理模式——静态代理以及分析静态代理的缺点 Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别 Spring中的AOP以及切入点表达式和各种通知

Linux系统中解压缩指令汇总

.tar 解包&#xff1a; tar xvf FileName.tar 打包&#xff1a;tar cvf FileName.tar DirName &#xff08;注&#xff1a;tar是打包&#xff0c;不是压缩&#xff01;&#xff09; --------------------------------------------- .gz 解压1&#xff1a;gunzip FileName.gz 解…

python中的@

函数修饰符 ‘’ 用做函数的修饰符&#xff0c;可以在模块或者类的定义层内对函数进行修饰&#xff0c; 出现在函数定义的前一行&#xff0c;不允许和函数定义在同一行 一个修饰符就是一个函数&#xff0c;它将被修饰的函数作为参数&#xff0c;并返回修饰后的同名函数或其他可…

这样想起...

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 // 看到一张精致的自然风景图片&#xff0c;心生向往. 在海的一个小小角落边&#xff0c;有一寓不很大的房子&#xff0c;暮色浸染的云彩…

python几种括号表示的类型

python语言最常见的括号有三种&#xff0c;分别是&#xff1a;小括号( )、中括号[ ]和大括号&#xff08;也叫做花括号{ }&#xff09;。其作用也各不相同&#xff0c;分别用来代表不同的python基本内置数据类型。 1、python中的小括号( )&#xff1a;代表tuple元组数据类型&am…

IT巨头互掐云存储:Dropbox能否一马当先

随着北京时间4月25日Google Drive横空出世&#xff0c;微软也迫不及待的发布了SkyDrive的大量更新。各大巨头进军云存储市场&#xff0c;激烈角逐的意向已经昭然可见。网友针对此事纷纷发表热议。苹果、微软、谷歌三巨头加上一个Dropbox各出各的云存储高招&#xff1a;微软SkyD…

Spring集成redis(Spring Data Redis)

2019独角兽企业重金招聘Python工程师标准>>> 转载地址&#xff1a;http://blog.csdn.net/zhu_tianwei/article/details/44923001 Spring-data-redis是spring大家族的一部分&#xff0c;提供了在srping应用中通过简单的配置访问redis服务&#xff0c;对reids底层开发…

python中利用re模块使用正则表达式

Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先使用re.compile()函数&#xff0c;将正则表达式的字符串形式编译为Pattern实例&#xff0c;然后使用Pattern实例处理文本并获得匹配结果&#xff08;一个Match实例&#xff09;&#xff0c;最后使用Match实例获得…

Java三大变量分别是类变量、实例变量和局部变量

什么是变量:就是内容可以改变的量&#xff0c;它与常量相对应。而这三大变量实际上是从变量的作用域来定义和划分的。 1、类变量&#xff0c;是归属类的变量&#xff0c;它是通过在定义类的属性的时&#xff0c;增加static修饰符&#xff0c;所以又称为静态变量。类变量不仅可…

路途

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 PS : 这应该是08年写的了吧.... 像是追寻明天的沧海一束&#xff0c; 不知道什么时候开始走上这样熟悉的路途. 当天空开始一点一点变…

redux 源码详解

redux 单向数据流的由来 Flux将应用分成四个部分;view 视图层;Action 视图层发出的消息&#xff1b;(改变store里面的数据)Dispatch(派发器)Store (数据层) : 用来存在应用的状态(数据)&#xff0c;一旦发生变动,就要提醒view更新页面。redux单向数据流&#xff1a; 具体详情请…

冒泡排序与快速排序(java实现)

冒泡排序&#xff1a; public class bubbleSort {public static void bubbleSort1(int [] a, int n){int i, j;for(i0; i<n; i){//表示 n 次排序过程。for(j1; j<n-i; j){if(a[j-1] > a[j]){//前面的数字大于后面的数字就交换//交换 a[j-1]和 a[j]int temp;temp a[j…