安全地卸载
rpm卸载软件包,并不是简单地将原来安装的文件逐个删除,那样做的话,可能会出现这样或那样的问题。如,a软件包依靠b软件包做某些工作,若b软件包卸载了,则a软件包就不能正常运行了。rpm为用户安全考虑,会做某些检查,尽可能排除出错的情况。
rpm在卸载软件包时,分步骤进行如下操作:
1. 检查依赖(denpendency)
检查依赖的目的,在于确保当前没有所有软件包依赖于当前要卸载的软件包。
2. 执行卸载前触发脚本程式(triggerun)
3. 执行卸载前脚本程式(preuninstall)
本程式为软件包制作者设定,完成卸载前的一些工作,具体如,要卸载的软件包中某个
程式当前正在运行时,脚本程式必须杀掉他,否则无法正确卸载。
4. 检查设置文件(configfiles)
rpm卸载软件包前会检查包中的设置文件是否修改了,如果修改了,rpm要换个名字保存
该文件,文件名一般是“原文件名+.rpmsave”。(这是rpm软件包管理的特色之一)
5. 真正卸载
即按照软件包中的文件列表,将文件逐个删除。要注意的是,如果其中有文件属于别的
软件包(即两个软件包拥有一个名字相同的文件),则rpm并不删除。
6. 执行卸载后脚本程式(postuninstall)
本程式主要是完成卸载的善后工作,如将系统设置文件inetd.conf修改一下,去掉安装
时添加的东西等等。
7. 更新rpm数据库
卸载后,rpm删除该软件包在数据库中的所有信息。
8. 执行卸载后触发脚本程式(triggerpostun)

命令格式
卸载rpm格式的软件包,可使用如下命令格式:
rpm -e [卸载选项1 卸载选项2...] [软件包标识1 软件包标识2...]

注: 也可使用--erase代替-e,效果相同。

软件包标识
对于已安装的软件包,rpm使用如下格式来唯一标识他:
name[-subname]-version-release
其中: name: 指软件名;
subname : 本项可选,指软件包子包的名字;
version : 指软件版本号。注意:其中不能含减号(-)字符;
release : 指软件释出号。

如:
包裹文件file-3.26-6.i386.rpm安装后,其软件包标识为file-3.26-6。能用此标识卸载,查询,校验该软件包。在命令行上输入
软件包标识时,能写全,也能采用简写的方式。如file-3.26-6,可仅输入file,或file-3.26,或输全。又如:
带有子包的软件包标识xfree86-devel-3.3.6-6,可仅输入xfree86-devel,或xfree86-devel-3.3.6,还
可完全输入。
注意: 软件包标识是大小写敏感的,即大写字母和小写字母表示不同的涵义。如bash-2.03-10标识不能输作bash-2.03-10,也不能输作bash-2.03-10等等。

选项列表

选项详解
通用选项的解释,请参见<<精通rpm之二--安装篇>>,本文不再赘述。
下面对指定用选项做些解释:
1. --test : 卸载测试
rpm的卸载测试做些什么?主要是检查依赖关系,确保系统中没有软件包依赖于要卸载的软件包。如果更有软件包依赖要卸载的软件包,则rpm会提示依赖关系将中断的错误,例如:
# rpm -e --test mktemp
error: removing these packages would break dependencies:
mktemp is needed by autoconf-2.13-5
mktemp is needed by dev-2.7.7-4bp
mktemp is needed by groff-1.11a-10bp
mktemp is needed by gzip-1.2.4-15bp
mktemp is needed by initscripts-4.16-3bp
mktemp is needed by metamail-2.7-21bp
mktemp is needed by rpm-3.0.3-4bp
mktemp is needed by autofs-3.1.3-2
/bin/mktemp is needed by apache-1.3.12-5bp
/bin/mktemp is needed by linuxconf-1.16r1.3-4bp
#

当然,我们通过浏览卸载测试时输出的调试信息就知道得更清晰了。
# rpm -e --test -vv file | nl
1 d: opening database mode 0x0 in //var/lib/rpm/
2 d: getting list of mounted filesystems
3 + echo triggeruninstall
4 triggeruninstall
5 d: will remove files test = 1
6 d:file: /usr/share/magic action: remove
7 d:file: /usr/man/man4/magic.4 action: remove
8 d:file: /usr/man/man1/file.1 action: remove
9 d:file: /usr/bin/file action: remove
10 + echo triggerpostuninstall
11 triggerpostuninstall
12 d: removing database entry

注: 本例进行file包的卸载测试,输出信息送管道交nl列出行号,现逐行解释。(行号后以d:开始的行输出的为调试信息)
第1行: 打开/var/lib/rpm目录下的rpm数据库;
第2行: 取已安装文件系统列表;
第3行: 执行卸载前触发脚本程式;
第4行: 这一行是卸载前触发脚本程式的执行结果;
第5行: rpm提示将要删除文件,其中test=1表明为卸载测试,并非真正删除;
第6-9行: 显示各文件的执行操作--删除;
第10行: 执行卸载后触发脚本程式;
第11行: 本行是卸载后触发脚本程式的执行结果;
第12行: 删除软件包在数据库中的信息。
2. --nodeps : 不检查依赖
rpm
管理软件包,不仅管理包中的所有文件,还同时管理着软件包之间的依赖关系。如a依赖于b运行,若b不存在了,则a也就运行不了了。rpm维护着这种关系,
尽量避免破坏,以确保软件的正常运行。上例进行mktemp包的卸载测试时,rpm提示了中断依赖关系的错误。如果使用本选项,不检查依赖,则卸载测试会
顺利完成。
# rpm -e --test --nodeps mktemp
#

需要说明的是,除非用户对软件包有足够了解,否则不要使用本选项,最佳让rpm自动维护软件间的依赖关系,确保其能正常运行。
3. --noscripts : 不执行脚本程式
一个rpm软件包中可包含五种脚本程式,即:安装前脚本程式,安装后脚本程式,卸载前脚本程式,卸载后脚本程式和校验脚本程式。卸载时使用--noscripts选项,可禁止卸载前和卸载后脚本程式的执行。
注意: 一般用户不要使用此选项。此选项主要提供给软件包制作者使用的。通过禁止执行脚本程式,能防止因安装带有bug的软件包而宕掉整个系统。当软件包去掉了bug后,此选项就不必使用了。
4. --notriggers : 不执行触发程式

了软件包间的交互控制,rpm设计了三种触发程式:安装时触发程式,卸载前触发程式和卸载后触发程式。为了防止因某一软件包的卸载而引发卸载前和卸载后触
发程式的执行,能使用--notriggers选项。通过比较下一例子和第1个选项介绍中的例子的输出,就可看到:选择--notriggers选项后,
卸载前和卸载后触发程式都没有被触发执行。
# rpm -e --test -vv --notriggers file | nl
1 d: opening database mode 0x0 in //var/lib/rpm/
2 d: getting list of mounted filesystems
3 d: will remove files test = 1
4 d:file: /usr/share/magic action: remove
5 d:file: /usr/man/man4/magic.4 action: remove
6 d:file: /usr/man/man1/file.1 action: remove
7 d:file: /usr/bin/file action: remove
8 d: removing database entry
5. --allmatches : 卸载所有匹配的包

rpm可将同一软件的不同版本安装到系统中,这样如果想全部卸载掉,这时仅简单输软件名是不行的,将出现错误,如:
# rpm -q foo
foo-6.0-1
foo-7.0-1
# rpm -e foo
error: "foo" specifies multiple packages
#

注: 本例中先查询foo包,发现有6.0和7.0版两个版本,接着卸载foo包,出现错误: 有多个软件包的名字均为foo。
怎样才能全部卸载呢?
答案之一是个一个卸载,卸载时输入软件包标识,因为软件名相同,所以最少再输个版本号,这种情况适用于软件版本少的时候。
答案之二是使用--allmatches选项,仅输个软件名即可,指示rpm卸载所有匹配的包,比较方便。
# rpm -e --allmatches foo
# rpm -q foo
package foo is not installed
#

卸载过程没有出现错误,之后再查询foo包,rpm则提示软件包未安装。
6. --justdb : 仅修改数据库
使用本选项后,rpm将只更新其数据库,文件系统不更新,意即如果软件包安装有文件的话,卸载后这些文件照样存在。
# rpm -ql file
/usr/bin/file
/usr/man/man1/file.1
/usr/man/man4/magic.4
/usr/share/magic
# ls -l /usr/bin/file
-rwxr-xr-x 1 root root23948 mar 23 1999 /usr/bin/file
# rpm -e --justdb file
# ls -l /usr/bin/file
-rwxr-xr-x 1 root root23948 mar 23 1999 /usr/bin/file
#

注: 本例先用rpm
-ql查询得到file包的文件列表,再用ls命令列包中的一个文件/usr/bin/file,能列出信息,故文件存在。然后用rpm -e
--justdb卸载file包但只更新数据库,而后再用ls命令列/usr/bin/file,能看到该文件依然存在。

RPM卸载的更多相关文章

  1. mysql 5.7.20 在线安装与卸载(yum卸载与rpm卸载方式)

    mysql5.7.20和之前的5.7.16版本不同,解压后没有data文件,需要自己建立 1.把下载的mysql5.7.20放到目录:/usr/local/2.卸载cenos上预装的mysql查看已安 ...

  2. rpm 命令|rpm 安装|rpm 卸载|rpm 使用|rpm 删除

    在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的“添加/删除程序”,但是功能又比“添加/删除程序”强很多,它就是Red Hat Package Manager(简称RPM) ...

  3. jenkins rpm卸载

    rpm卸载 1.rpm -e jenkins rpm -ql jenkins 检查是否卸载成功 2.彻底删除残留文件:find / -iname jenkins | xargs -n 1000 rm ...

  4. RPM卸载软件包

    如何卸载rpm包 首先:通过  rpm -q <关键字> 可以查询到rpm包的名字 然后:调用 rpm -e <包的名字> 删除特定rpm包 如果遇到依赖,无法删除,使用 rp ...

  5. gitlab RPM卸载 & 安装 && 升级(9.0.13-》9.5.9-》10.0->10.3.9->10.6.6-》10.8-》11.0)

    版本:9.0.3 升级版本:9.0.13 一,停止服务 gitlab-ctl stop unicorn gitlab-ctl stop sidekiq gitlab-ctl stop nginx 二, ...

  6. rpm 卸载

    卸载:python-urlgrabber-3.9.1-9.el6.noarch rpm -e python-urlgrabber-3.9.1-9.el6.noarch

  7. linux rpm 卸载,简单说明

    平时Linux卸载文件总是遇到卸载不干净,各种依赖什么的,今天又是搞这玩意,就记录下一个比较常规的方法. 一.查询包括某关键字的软件(这里以卸载openoffice为例) 查询包括office的软件 ...

  8. rpm卸载软件error preun

    这两天,使用ipvsadm -ln总是显示空. 后来,使用strace ipvsadm -ln定位 看来,是ipvsadm模块有问题,卸载了再重新安装吧,结果出现这种问题. 从来没遇到这种问题: er ...

  9. Red Hat 操作系统 rpm 卸载软件提示"error: %preun( ) scriptlet failed, exit status 1"

    在linux里安装程序有两种方法,一种是源程序安装,按照安装包里的readme或者install文件指示,一步步地进行,通常是configure, make, install三部曲.另一种就是rpm包 ...

随机推荐

  1. [xsy3241]暴风士兵

    题意:一个血量为$h$的人,它会被攻击$n$次,第$i$次有$p$的概率$-1$滴血(每次的$p$不同),问每次攻击后他的血量期望,强制在线 若一个人被扣了$i$滴血的概率为$p_i$,那么记多项式$ ...

  2. 【数论】【莫比乌斯反演】【线性筛】hdu6134 Battlestation Operational

    看这个题解吧:http://blog.csdn.net/wubaizhe/article/details/77338332 代码里顺便把几个常用的线性筛附上了. Key:1.gcd(i,j)==1利用 ...

  3. 找出N个数中最小的k个数问题(复杂度O(N*logk))

    这是一个经典的算法题,下面给出的算法都在给定的数组基础上进行,好处时不用分配新的空间,坏处是会破坏原有的数组,可以自己分配新的空间以避免对原有数组的破坏. 思路一 先直接排序,再取排序后数据的前k个数 ...

  4. Educational Codeforces Round 8 C. Bear and String Distance 贪心

    C. Bear and String Distance 题目连接: http://www.codeforces.com/contest/628/problem/C Description Limak ...

  5. Linux中KVM虚拟机是什么

    概念: Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中.它使用Linux自身的调度器进行 ...

  6. 用GDB 调试Java程序

      陈皓 http://blog.csdn.net/haoel 背景 想要使用GDB调试程序,就需要用GNU的编译器编译程序.如:用GCC编译的C/C++的程序,才能用GDB调试.对于Java程序也是 ...

  7. android 检查能否上网

    文章一: 首先在,AndroidManifest.xml 中增加访问权限: <uses-permission android:name="android.permission.ACCE ...

  8. php概率算法

    这是一个很经典的概率算法函数: function get_rand($proArr) { $result = ''; //概率数组的总概率精度 $proSum = array_sum($proArr) ...

  9. Java Excel 插入图片

    在POI中有HSSFPatriarch对象,该对象为画图的顶级管理器,它的createPicture(anchor, pictureIndex)方法就能够在Excel插入一张图片.所以要在Excel中 ...

  10. PostgreSQL配置文件--QUERY TUNING

    5 QUERY TUNING 5.1 Planner Method Configuration. 下列参数控制查询优化器是否使用特定的存取方法.除非对优化器特别了解,一般情况下,使用它们默认值即可. ...