RPM卸载 (Linux 使用)[通俗易懂]

2022-09-28 11:15:41 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

可以先用rpm -q ‘xxx’ 或者 rpm -qf ‘xxx/bin/xxxx.xx’ 来查询一下所属的rpm包的名字。

然后用rpm -e ‘xxxxxx’ 来删之。

‘xxx/bin/xxxx.xx’ 是一个包中任意的文件 ‘xxxxxx’ 是查询得到的rpm包的名称

rpm -e的时候后面的文件名不用加版本号

详细说明:

安全地卸载 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 #

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/193775.html原文链接:https://javaforall.cn

0 人点赞