安全地卸载
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. BZOJ 1633 [Usaco2007 Feb]The Cow Lexicon 牛的词典(单调DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1633 [题目大意] 给出一个字符串和一个字符串集, 问要删去多少个字符该字符串才可以被 ...

  2. [UOJ181]密码锁

    这个完全图随机定向后是一个竞赛图,将它的强连通分量缩点后我们得到的东西类似一条链,每个点往它后面的所有点连边 在这条链上,我们可以把点划分为两个点集$S,T$使得没有从$T$中点到$S$中点的边($S ...

  3. 【Matrix-tree定理】【BEST Theorem】hdu6064 RXD and numbers

    题意:给你一张有向图,求从1出发,回到1的欧拉回路数量. 先特判掉欧拉回路不存在时的情况. 看这个吧:http://blog.csdn.net/yuanjunlai141/article/detail ...

  4. [HDU4729]An Easy Problem for Elfness

    [HDU4729]An Easy Problem for Elfness 题目大意: 给你一棵\(n(n\le10^5)\)个点的树,树上每条边都有容量. \(m(m\le10^5)\)次询问,每次询 ...

  5. 永远不要去B网(Bittrex.com)

    永远不要去Bittrex.com,没见过这么垃圾的服务! 注册之后基本资料就不能修改了,结果不能提现,充值却是可以充值,就跟今年初禁比特币时的垃圾火币网一样,只进不出,去他奶奶的! 随后网站提示可以高 ...

  6. SecureCRT配置文件保存和导入

    每次重装系统,都要重新配置SecureCRT,为了减少重复工作.直接在SecureCRT软件中找到:选项---全局选项---常规---配置文件夹下面路径:C:\Users\Administrator\ ...

  7. SecureRandom产生强随机数简介

    SecureRandom是强随机数生成器,主要应用的场景为:用于安全目的的数据数,例如生成秘钥或者会话标示(session ID),弱随机数生成器会产生严重的安全问题,而使用SecureRandom这 ...

  8. ci框架(二)

    自定义SQL语句                                                                             当提供的API满足不了我们对S ...

  9. vi 新建编辑文件时报错 E212 can’t open file for writing

    在vi修改防火墙配置时,不能够保存,报E212 can’t open file for writing错误. 网上大概给出了两种答案. 一是权限不够,可以用root权限事实,或者sudo 操作. 二是 ...

  10. Android常用传感器用法一览(3)

    Android 开发包标准有8个传感器: Sensor.TYPE_ACCELEROMETER o 加速度计 (X, Y, Z) m/s2 Sensor.TYPE_GYROSCOPE o 陀螺仪 (X, ...