rpm 卸载软件以什么为前缀的软件

博客访问: 8245
博文数量: 22
注册时间:
鏆傛棤浠嬬粛
ITPUB论坛APP
ITPUB论坛APP
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: IT生活
RPM的安装和卸载深入学习。[@more@]安装篇从一般意义上说,软件包的安装其实是文件的拷贝,RPM安装软件包,也无外乎此。但RPM要更进一步、更聪明一些就需要多做些工作了。 聪明的安装 从一般意义上说,软件包的安装其实是文件的拷贝,即把软件所用的各个文件拷贝到特定目录。RPM安装软件包,无外乎此。但RPM要更进一步,更聪明一些。在安装前,它通常要执行以下操作: <font color="#.检查软件包的依赖(Dependency)RPM格式的软件包中可包含有依赖关系的描述,如软件执行时需要什么动态链接库,需要什么程序存在及版本号要求等。当RPM检查时发现所依赖的链接库或程序等不存在或不符合要求时,默认的做法是中止软件包安装。 <font color="#.检查软件包的冲突(Conflicts)有的软件与某些软件不能共存,软件包制作者会将这种冲突记录到RPM软件包中。安装时,若RPM发现有冲突存在,将会中止安装。 <font color="#.执行安装前脚本程序(Preinstall)此类程序由软件包制作者设定,需要在安装前执行。通常是检测操作环境,建立有关目录,清理多余文件等等,为顺利安装作准备。 <font color="#.处理配置文件(Configfiles)RPM对配置文件(Configfiles)有着特别的处理。因为用户常常需要根据实际情况,对软件的配置文件做相应的修改。如果安装时简单地覆盖了此类文件,则用户又得重新手工设置,很麻烦。这种情况下,RPM做得比较明智:它将原配置文件换个名字保存了起来(原文件名后缀加上.rpmorig),用户可根据需要再恢复,避免重新设置的尴尬。 <font color="#.解压软件包并存放到相应位置这是最重要的部分,也是软件包安装的关键所在。在这一步,RPM将软件包解压缩,将其中的文件一个个存放到正确的位置,同时,文件的操作权限等属性相应设置正确。 <font color="#.执行安装后脚本程序(Postinstall)此类程序为软件的正确执行设定相关资源,如修改inetd.conf、运行ldconfig程序以利新的动态链接库生效等等。 <font color="#.更新RPM数据库安装后,RPM将所安装的软件及相关信息记录到其数据库中,便于以后升级、查询、校验和卸载。 <font color="#.执行安装时触发脚本程序(Triggerin)触发脚本程序是指软件包满足某种条件(如已安装软件包sendmail,或file版本大于3.0)时才触发执行的脚本程序,它用于软件包之间的交互控制。触发脚本程序有三类:一是软件包安装时才触发的,称为安装时触发脚本程序(triggerin);二是软件包卸载前触发的,叫作卸载前触发脚本程序(triggerun);三是软件包卸载后才触发执行的,称作卸载后触发脚本程序(triggerpostun)。这些触发脚本程序,大大扩展了RPM软件包管理的功能。 命令格式 安装RPM格式的软件包,可使用如下命令格式: rpm -i [安装选项1 安装选项2...] 包裹文件1 包裹文件2...注:可用--install代替-i,效果相同。 选项列表
包裹文件 对于要安装的RPM格式的包裹文件,RPM对其名字不作强制要求。用户可以使用以下三种方式的命名样式: <font color="#.典型的命名样式(常用):格式为:软件名-版本号-释出号.体系号.rpm注:体系号指的是执行程序适用的处理器体系,如i386体系,sparc体系等。体系号为src时表明为源代码包,否则为执行程序包。 如abc-3.2-1.i386.rpm为执行程序包,软件名为abc,版本号为3.2,释出号为1,适用体系为i386,而abc-3.2-1.src.rpm则为源代码包。 <font color="#.URL形式的命名样式(较常用):* FTP方式的命名格式:ftp://[用户名[:密码]@]主机[:端口]/包裹文件注:[]括住的内容表示可选。主机可以是主机名,也可是IP地址。包裹文件可含目录信息。如未指定用户名,则RPM采用匿名方式传输数据(用户名为anonymous)。如未指定密码,则RPM会根据实际情况提示用户输入密码。如未指定端口,则RPM使用默认端口(一般为21)。 如/yyy.rpm(使用匿名传输,主机,包裹文件yyy.rpm);如ftp://24.109.164.55:1024/pub/yyy.rpm(匿名FTP传输,主机IP:24.109.164.55,使用1024端口,包裹文件在/pub目录下);如ftp://zhsoft@/yyy.rpm(主机,FTP用户名zhsoft,如有密码,RPM将会自动提示输入);如ftp://zhsoft:password@/yyy.rpm(主机,FTP用户名zhsoft,密码password)。* HTTP方式的命名:http://主机[:端口]/包裹文件注:[]括住的内容可选。主机可以是主机名,也可是IP地址。包裹文件可含目录信息。如未指定端口,则RPM默认使用80端口。 如/yyy.rpm(用HTTP获取主机上的yyy.rpm文件);又如:8080/pub/yyy.rpm(用HTTP获取主机上/pub目录下的yyy.rpm文件,使用端口8080)。<font color="#.其它形式(很少使用):命名格式:任意如将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###################################################从上看出,软件包安装顺利完成。 <font color="#.percent:以%(百分比)显示安装进度percent的含义是百分比,而此选项的作用就是以百分比(%)来显示安装进度的。同样是安装MySQL软件包,下面的输出就不一样: # rpm -i --percent MySQL-3.22.32-1.i386.rpm%% 0.000000%% 0.002600%% 0.020586......%% 100.000000#上例中省略了很多输出(......表示)。因为如果软件包很大,则用--percent时输出的内容会很多,所以用户最好用--hash选项,以#号来表示安装进度,这样简洁明了。 <font color="#.test:安装测试所谓安装测试,意即并非真正的安装,它不拷贝和建立任何文件。使用本选项的目的在于:检测软件包的依赖关系是否满足,是否存在潜在的冲突等等。 # rpm -i --test autofs-3.1.3-2.i386.rpmerror: 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#由上看出,这次测试没有出现什么错误。 <font color="#.replacepkgs:替换软件包为什么要替换软件包?原因可能是系统中的软件包已经破坏了,其中一个或多个文件丢失或损毁。如果用户想修复这个软件包,用直接安装的方法,RPM将报错退出: # rpm -V filemissing/usr/man/man1/file.1# rpm -i file-3.26-6.i386.rpmpackage file-3.26-6 is already installed#注:本例先用RPM校验命令校验一下file软件包,发现/usr/man/man1/file.1文件丢失。之后用安装命令安装,RPM提示软件包file-3.26-6已经安装了。(有关RPM校验命令,<>中将会有详细的介绍) 如果采用--replacepkgs选项,结果又怎样呢? # rpm -i --replacepkgs file-3.26-6.i386.rpm# rpm -V file#看来,RPM成功地替换了原软件包,校验一下该包,发现没有错误输出,所以现在的软件包是完整的。 <font color="#.replacefiles:替换文件RPM是聪明的软件包管理器,它维护着每个已安装软件包的文件信息。如果在安装一个新的软件包时,RPM发现其中某个文件和已安装的某个软件包中的文件名字相同但内容不同,那么RPM就会认为这是一个文件冲突,会报错退出: # rpm -i ff-4.0-2.i386.rpmfile /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.rpmwarning: /etc/foo.conf saved as /etc/foo.conf.rpmorig#<font color="#.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.confls: /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属性的配置文件本来就是可以丢失的嘛,不必太在意了。 <font color="#.force:强制执行force的含义是强制。--force选项的作用就是强制安装软件包,不考虑软件包是否已安装,也不考虑有没有文件冲突。其效果相当于同时选用--replacepkgs与--replacefiles选项进行安装。 <font color="#.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.1ls: /usr/man/man1/file.1: 文件或目录不存在# ls -l /usr/man/man4/magic.4ls: /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.1ls: /usr/man/man1/file.1: 文件或目录不存在# ls -l /usr/man/man4/magic.4ls: /usr/man/man4/magic.4: 文件或目录不存在#<font color="#.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#<font color="#.noscripts:不执行脚本程序一个RPM软件包中可包含五种脚本程序,即:安装前脚本程序,安装后脚本程序,卸载前脚本程序,卸载后脚本程序和校验脚本程序。安装时使用--noscripts选项,可禁止安装前与安装后脚本程序的执行。 # rpm -i foo-6.0-1.i386.rpmpreinstall is running ... donepostinstall is running ... done#上面不禁止脚本程序的执行,下面不执行脚本程序,请看输出结果: # rpm -i --noscripts foo-6.0-1.i386.rpm#看,因为没有安装前与安装后脚本程序的执行,所以没有什么输出了。 注意:一般用户不要使用此选项。此选项主要提供给软件包制作者使用的。通过禁止执行脚本程序,可以防止因安装带有BUG的软件包而宕掉整个系统。当软件包去掉了BUG后,此选项就不必使用了。 <font color="#.nodeps:不检查依赖RPM管理软件包,不仅管理包中的所有文件,还同时管理着软件包之间的依赖关系。如A依赖于B运行,若B不存在了,则A也就运行不了了。RPM维护着这种关系,尽量避免破坏,以保证软件的正常运行。 # rpm -i autofs-3.1.3-2.i386.rpmerror: 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#注:除非用户对软件包有足够了解,或只想看看软件,否则不要使用本选项,以维护软件间正常的依赖关系。 <font color="#.notriggers:不执行触发程序为了软件包间的交互控制,RPM设计了三种触发程序:安装时触发程序,卸载前触发程序和卸载后触发程序。为了防止因某一软件包的安装而引发安装时触发程序的执行,可以使用--notriggers选项。 <font color="#.ignorearch:忽略体系与ignoreos :忽略操作系统何谓体系?体系就是CPU的类别,有Intel的x86(如i386,i486系列)体系,有Sun的sparc体系等等。当一个软件包建立时,RPM就为其指定了所适用的CPU体系,也为其指定了所适用的操作系统。这样做的好处就是,RPM容易知道为一台计算机所建立的软件包是否适用于兼容于另一台计算机。RPM的资源配置文件(默认为/usr/lib/rpm/rpmrc)中,就定义了体系的兼容关系(arch_compat表达)和操作系统的兼容关系(os_compat表达)。RPM安装一个包裹文件时,要做这样一个兼容方面的检查。如果用户想忽略体系,不管其是否兼容,请用--ignorearch选项安装。如果也不管操作系统是否兼容,可用--ignoreos选项。需要指出的是,若非知道自己这样的目的,否则不要试图这样做。 <font color="#.ignoresize:不检查空间大小RPM安装软件包前,首先要检查当前系统是否有足够的剩余空间,如果空间不足的话,安装将无法完成。使用本选项的目的,在于指示RPM不做空间大小方面的检查,意即不管系统是否有容纳要安装的软件包的空间,照直安装就行了。 <font color="#.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查询命令,详见<>) <font color="#.badreloc:强制重定位RPM软件包的重定位,依赖于制作时重定位前缀的定义。如果没有定义重定位前缀,或者用户安装时所指定的重定位前缀不存在,则RPM会报错退出,中断安装。此时,若用本选项,则RPM会不管这些错误,进行强制的重定位安装。注:本选项和--relocate选项同时使用时才有意义。 如上例,采用并不存在的重定位前缀/usr/man进行安装: # rpm -i --relocate /usr/man=/tmp file-3.26-6.i386.rpmpath /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。怎么样?神奇吧! <font color="#.excludepath:不安装指定目录下的文件利用此选项,可以禁止RPM安装某些指定目录下的文件。如不想安装file软件包中的说明文档,除了可使用--excludedocs选项外,还可使用本选项。因为file的说明文档均在目录/usr/man下面。 # rpm -i --excludepath /usr/man file-3.26-6.i386.rpm# rpm -qls filenormal/usr/bin/filenot installed /usr/man/man1/file.1not installed /usr/man/man4/magic.4normal/usr/share/magic#注:例子中先安装file软件包,并用--excludepath禁止安装/usr/man下的文件,再用RPM查询命令rpm -qls列出file包的文件及状态,可以看到:/usr/man下的两个文件均未安装(not installed)。 <font color="#.justdb:仅更新数据库安装软件包使用此选项后,RPM将只更新其数据库数据,文件系统不更新,意即并不拷贝和建立包中的文件。 # rpm -i --justdb file-3.26-6.i386.rpm# rpm -qls filenormal/usr/bin/filenormal/usr/man/man1/file.1normal/usr/man/man4/magic.4normal/usr/share/magic# ls -l /usr/bin/filels: /usr/bin/file: 文件或目录不存在#注:例子中安装file包但指明只更新数据库,结果是:虽然用查询命令查到该软件包中所有文件状态均正常(normal),但用ls命令列包中所含文件/usr/bin/file,该文件却不存在。这表明包中文件并未建立。 <font color="#.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#<font color="#.ftpproxy:指定FTP代理主机本选项指定FTP代理主机,主机可以是主机名,也可以是IP地址。 <font color="#.ftpport:指定FTP端口本选项指定FTP协议使用的TCP端口,系统默认是21。 请看下面的例子: # rpm -iv --ftpport 8888 ftp://root@xwboc/tmp/file-3.26-6.i386.rpmPassword for root@xwboc: Password for root@xwboc: Retrieving ftp://root@xwboc/tmp/file-3.26-6.i386.rpmfile-3.26-6#本例中用FTP方式安装file软件包,数据传输使用8888端口。执行中,RPM先提示输入root用户的密码两次,之后下载(retrieve)软件,最后成功安装。 <font color="#.httpproxy:指定HTTP代理主机本选项指定HTTP代理主机,主机可以是主机名,也可以是IP地址。 <font color="#.httpport:指定HTTP端口本选项指定HTTP协议使用的TCP端口,系统默认是80。 下面的例子就指定了80端口来安装autofs软件,当然不指定也行,因为系统默认的就是这个端口。 # rpm -iv --httpport 80 http://24.109.164.55/rpms/autofs-3.1.3-2.i386.rpmRetrieving http://24.109.164.55/rpms/autofs-3.1.3-2.i386.rpmautofs-3.1.3-2#注:同FTP方式一样,RPM都是下载再安装。 二、通用选项 所谓通用选项,就是不管是安装,升级,卸载还是其它软件包操作,统统适用的选项。 这样的选项主要以下几个: <font color="#.-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.rpmfile-3.26-6#<font color="#.-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行:如果有安装后执行脚本程序的话,执行它。 <font color="#.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.rpmfailed to open /usr/var/lib/rpm/packages.rpmerror: 不能打开 /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(这些功能将在以后讲到)。 <font color="#.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这种形式。 <font color="#.dbpath:指定RPM数据库目录本选项不同于--root选项,它仅仅是指定RPM数据库的目录,并不改变安装文件的位置。 RPM卸载&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等等。 选项列表 选项详解 通用选项的解释,请参见<>,本文不再赘述。 下面对指定用选项做些解释: 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,可以看到该文件依然存在。
阅读(1851) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 linux rpm 卸载 的文章

 

随机推荐