linux环境下 RPM使用详解

    xiaoxiao2022-07-04  112

    1、 RPM包方式安装   找对应的包官网

    1.1 RPM包管理工具介绍       RPM是Red Hat Package Manager的缩写,本意就是Redhat软件包管理,是最先由Redhat公司开发出来的linux下软件包管理工具,由于这种软件管理方式非常方便,逐渐被其它linux发行商所借用,现在已经成为linux平台下通用的软件包管理方式,例如Fedora 、Redhat、suse、Mandrake等主流linux发行版本都默认采用了这种软件包管理方式。       RPM包管理类似于windows下的“添加/删除程序”但是功能却比“添加/删除程序”强大很多。在Linux的系统安装光盘中,有很多以“.rpm”结尾的软件包,这些包文件就是我们所说的RPM文件。每个RPM文件中包含了已经编译好的二进制可执行文件,其实就是将软件源码文件进行编译安装,然后进行封装,就成了RPM文件,类似与windows安装包中的“.exe”文件。       此外RPM文件中还包含了运行可执行文件所需的其它文件,这点也和windows下的软件包类似,windows程序的安装包中,除了“exe”可执行文件,还有其它依赖运行的文件。       RPM包管理方式的优点是:安装简单方便,因为软件已经编译完成打包完毕,安装只是个验证环境和解压的过程。此外通过RPM方式安装的软件,RPM工具都会记录软件的安装信息,这样方便了软件日后的查询,升级和卸载。 RPM包管理方式的缺点是对操作系统环境的依赖很大,它要求RPM包的安装环境必须与RPM包封装时的环境相一致或相当。还需要满足安装时与系统某些软件包的依赖关系,例如需要安装A软件,但是A软件需要系统有B和C软件的支持,那么就必须先安装B和C软件,然后才能安装A软件。这也是我们在用RPM包方式安装软件需要特别注意的地方。

    1.2 RPM包种类和命令

          RPM包的封装格式一般有两种,分别是RPM和SRPM,SRPM包也是一种RPM,但是它包含了编译时的源码文件和一些编译指定的参数文件,因而在使用的时候需要重新进行编译,通常SRPM对应的RPM文件类似与“xxxxxxxx.src.rpm”格式。 下面我们讲述一下两种RPM包对应的文件名含义: 例如一个rpm文件:nxserver-2.1.0-22.i386.rpm 其中“nxserver”表示软件的名称,“2.1.0”表示软件的版本号,“22”表示软件更新发行的次数,“i386”表示适合硬件的平台,最后的“.rpm”是rpm软件包的标识。       一般的RPM封装包的命名格式都有这五个部分组成,由于SRPM包是需要编译才能使用的,因此没有上面显示项中对应的平台选项,其它与RPM包命令格式完全一样。       对于RPM包的五个组成部分,我们下面介绍一些它们更详细的含义和异同: 软件名称:是对软件包的标识; 软件的版本号:每个软件都有自己的版本号,版本号可以说明软件从开始到现在发行了多少了,软件是否是新的等等。 软件更新发行次数:由于一个版本的软件在发行后可能出现bug或者漏洞,那么就需要修复和重新封装,每修复封装一次,软件的名称就要更新一次。 适合的硬件平台:由于RPM包要在各种不同的linux硬件平台上使用,但是由于每个不同的硬件平台RPM打包封装的参数也各不相同,这样就出现了针对i386、i686、x86_64、noarch等的平台名称标识。 i386指这个软件包适用于intel 80386以后的x86架构的计算机。 i686指这个软件包适用于intel 80686以后(奔腾pro以上)的x86架构的计算机。 x86_64指这个软件包适用于x86架构64为处理器的计算机。 noarch表示这个软件包与硬件构架无关,可以通用。       需要注意的是:i386软件包可以在任意x86平台下使用,无论是i686或是x86_64的机器,相反,i686的软件包不一定能在i386硬件上面使用,由于i686软件包一般都是对cpu进行了优化,所有具有向后兼容性,但是不具有先前兼容的特性。

    2.3 RPM工具的使用       RPM工具的使用分为安装、查询、验证、更新、删除等操作,下面我们分别介绍。 1. 安装软件包 命令格式:rpm -i [辅助选项] file1.rpm file2.rpm…..fileN.rpm   主选项说明: -i:install的意思,就是安装软件。也可以使用“--install”。 参数说明:file1.rpm file2.rpm…..filen.rpm是指定将要安装RPM包的文件名,可以多个文件一起安装。 辅助选项说明:这里的选项很多,我们只列出常用选项,详细解释如下:  -v:显示附加信息。  -h:安装时输出标记“#”。  --test:只对安装进行测试,并不实际安装。  --nodeps:不检查软件之间的依赖关系。加入此选项可能会导致软件不可用。  --force:忽略软件包以及软件冲突。  --replacepkgs:强制重新安装已经安装的软件包。  --prefix:将软件包安装到由 指定的路径下。  --percent:以百分比的形式输出安装的进度。  --excludedocs:不安装软件包中的说明文件  --includedocs:安装软件包,包含说明文件。 举例: (1)我们安装ipvsadm-1.24-6.i386.rpm,使用下面命令: [root@localhost ~]# rpm -ivh ipvsadm-1.24-6.i386.rpm  执行结果如下: warning:ipvsadm-1.24-6.i386.rpm:V3 DSA signature: NOKEY, key ID 44e181 Preparing...    ############################ [100%]    1:ipvsadm  ############################[100%] (2)下面操作显示了安装gcc-3.4.4-2.i386.rpm包过程,在安装过程中,出现了安装包依赖问题,我们的处理过程是这样的: [root@server ~]# rpm -ivh gcc-3.4.4-2.i386.rpm  执行结果如下: warning: gcc-3.4.4-2.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e error: Failed dependencies:         glibc-devel >= 2.2.90-12 is needed by gcc-3.4.4-2.i386     Suggested resolutions:         glibc-devel-2.3.4-2.13.i386.rpm 这里显示在安装gcc编译器之前需要安装glibc-devel包的支持,这个包详细的版本是glibc-devel-2.3.4-2.13.i386.rpm,因此,我们需要先安装这个软件包。 [root@server ~]# rpm -ivh glibc-devel-2.3.4-2.13.i386.rpm  执行结果如下: warning: glibc-devel-2.3.4-2.13.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e error: Failed dependencies:         glibc-headers is needed by glibc-devel-2.3.4-2.13.i386         glibc-headers = 2.3.4-2.13 is needed by glibc-devel-2.3.4-2.13.i386     Suggested resolutions:         glibc-headers-2.3.4-2.13.i386.rpm 这里又出现依赖关系,上面的错误提示是说安装glibc-devel包需要先安装glibc-headers软件包,并且给出了安装建议版本,于是我们就先安装glibc-headers包。 [root@server ~]# rpm -ivh glibc-headers-2.3.4-2.13.i386.rpm  执行结果如下: warning: glibc-headers-2.3.4-2.13.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e error: Failed dependencies:         kernel-headers is needed by glibc-headers-2.3.4-2.13.i386         kernel-headers >= 2.2.1 is needed by glibc-headers-2.3.4-2.13.i386     Suggested resolutions:         glibc-kernheaders-2.4-9.1.98.EL.i386.rpm 依然报错,信息与上面相同,意思是说在安装kernel-headers包之前,需要glibc-kernheaders包的支持,并且给出了建议版本,我们先安装glibc-kernheaders包。 [root@server ~]# rpm -ivh glibc-kernheaders-2.4-9.1.98.EL.i386.rpm  执行结果如下:  warning: glibc-kernheaders-2.4-9.1.98.EL.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e Preparing... ########################### [100%]    1:glibc-kernheaders ###################### [100%] 这次依赖终于解除了,按照相反的顺序开始安装,下面显示安装步骤。 [root@server ~]# rpm -ivh glibc-headers-2.3.4-2.13.i386.rpm        warning: glibc-headers-2.3.4-2.13.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e Preparing...  ########################### [100%]    1:glibc-headers  ######################## [100%] [root@server ~]# rpm -ivh glibc-devel-2.3.4-2.13.i386.rpm  warning: glibc-devel-2.3.4-2.13.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e Preparing... ########################### [100%]    1:glibc-devel  ######################## [100%] [root@server ~]# rpm -ivh gcc-3.4.4-2.i386.rpm  warning: gcc-3.4.4-2.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e Preparing...  ############################## [100%]    1:gcc      ########################### [100%] (3) 在上例中,如果我们在安装gcc第一步加入“--nodeps”参数,gcc由于不检查依赖关系,即可安装成功: [root@server ~]# rpm -ivh gcc-3.4.4-2.i386.rpm –nodeps 执行结果如下: warning: gcc-3.4.4-2.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e Preparing...  ############################## [100%]    1:gcc      ########################### [100%] 这里加入了忽略依赖关系的参数,虽然可以安装成功,但是我们不建议这么做,因为这样安装的软件很有可能是不可用的,或者使用过程中出现问题,除非我们知道忽略依赖关系对软件本身没有影响的话,才可使用此参数。 (4)安装xxxxxx.src.rpm的方法,这里我们以my-package.src.rpm名称为例,在redhat linux i386平台下进行介绍,常用的有两种方法,操作步骤如下: 方法一:  1)执行rpm -i my-package.src.rpm  2) cd /usr/src/redhat/SPECS  3) rpmbuild -bp my-package.specs 一个和软件包同名的specs文件。  4) cd /usr/src/redhat/BUILD/my-package/ 一个软件包同名的目录  5) ./configure 这一步和编译普通的源码软件一样,可以加上参数  6) make 7) make install 方法二:  1)执行rpm -i my-package.src.rpm  2)cd /usr/src/redhat/SPECS  前两步和方法一相同  3)rpmbuild -bb my-package.specs 一个和软件包同名的specs文件。 此时,在/usr/src/redhat/RPM/i386/ (这里的路径根据具体包的不同,也可能是i686、noarch等等) 在这个目录下,有一个或者两个新的rpm包,这个是编译好的二进制文件。  4)执行rpm -i new-package.rpm,安装完成。 例如:利用xxxx.src.rpm格式的包安装rsh软件,操作方法如下: [root@localhost ~]# rpm -i rsh-0.17-25.3.src.rpm [root@localhost ~]#cd /usr/src/redhat/SPECS/ rsh.spec [root@localhost SPECS]#rpmbuild  -bb rsh.spec [root@localhost SPECS]# cd /usr/src/redhat/RPMS/i386/ rsh-0.17-25.3.i386.rpm   rsh-debuginfo-0.17-25.3.i386.rpm   rsh-server-0.17-25.3.i386.rpm [root@localhost i386]#rpm -ivh rsh-* Preparing...  ############################ [100%]    1:rsh-server  ########################## [ 33%]    2:rsh   ############################## [ 67%]    3:rsh-debuginfo  ######################## [100%] [root@localhost i386]#

    2. 查询软件包

    命令格式:rpm -q [辅助选项] package1……packageN 主选项说明: -q:query的意思,也可以使用“--query”。 参数说明:package1……packageN为已经安装的软件包名称。 辅助选项说明: -f:查询操作系统中某个文件属于哪个对应的rpm软件包。 例如: [root@localhost ~]# rpm -qf /bin/bash bash-3.0-19.2 -p:查询以“.rpm”为后缀的软件包安装后对应的包名称。 例如: [root@server ~]# rpm -qp gcc-3.4.4-2.i386.rpm  gcc-3.4.4-2 从这里的查询可以得知,“gcc-3.4.4-2.i386.rpm”安装到系统以后,对应的包名为gcc-3.4.4-2。 -l:显示软件包中的所有文件列表。此选项后面跟软件包安装后对应的包名,切记不是以“.rpm”为后缀的rpm包。 例如: [root@server ~]# rpm –ql gcc-3.4.4-2 /usr/bin/c89 /usr/bin/c99 /usr/bin/cc /usr/bin/gcc /usr/bin/gcov ………(以下省略)……… -i:显示软件包的概要信息,例如软件名称、版本、适应平台、大小等等。此选项后面跟完整的包名,切忌不是以“.rpm”为后缀的rpm包。 例如:在得到一个软件,安装之前一般都需要看下软件包有什么内容,可以使用以下命令: [root@server ~]# rpm -qi gcc-3.4.4-2.i386 或者使用 [root@server ~]# rpm -qpi gcc-3.4.4-2.i386.rpm 这里由于用到了“-p”选项,首先显示出了安装后的软件包名,所以“-i”选项后可跟“.rpm”结尾的软件包。 -g:查询系统有哪些软件包属于指定的类别,RPM工具根据软件功能的不同,将软件分了很多种类,分别如下,括弧内为注释说明: Amusements/Games (娱乐/游戏)   Amusements/Graphics(娱乐/图形)   Applications/Archiving (应用/档案)   Applications/Communications (应用/通讯)   Applications/Databases (应用/数据库)   Applications/Editors (应用/编辑器)   Applications/Emulators (应用/仿真器)   Applications/Engineering (应用/工程)   Applications/File (应用/文件)   Applications/Internet (应用/因特网)   Applications/Multimedia (应用/多媒体)   Applications/Productivity (应用/产品)   Applications/Publishing (应用/印刷)   Applications/System (应用/系统)   Applications/Text (应用/文本)   Development/Debuggers (开发/调试器)   Development/Languages (开发/语言)   Development/Libraries (开发/函数库)   Development/System (开发/系统)   Development/Tools (开发/工具)   Documentation (说明文档)   System Environment/Base (系统环境/基础)   System Environment/Daemons (系统环境/守护)   System Environment/Kernel (系统环境/内核)   System Environment/Libraries (系统环境/函数库)   System Environment/Shells (系统环境/接口)   User Interface/Desktops (用户界面/桌面)   User Interface/X (用户界面/X窗口)   User Interface/X Hardware Support (用户界面/X硬件支持) 例如:查看当前系统属于“开发/调试器”类别的包有多少,使用以下命令: [root@server ~]# rpm -qg "Development/Debuggers"      lsof-4.72-1.1 crash-4.0-2 sysreport-1.3.15-5 ltrace-0.3.36-2.EL4 strace-4.5.13-0.EL4.1 valgrind-2.2.0-5.EL4 valgrind-callgrind-0.9.9-1 gdb-6.3.0.0-1.63 pstack-1.2-6 -d:显示软件包中的说明文件列表,RPM将软件包中的文件分为三类,一类是配置文件,一类是说明文件,一类是可执行文件。后面跟完整的包名,切忌不是以“.rpm”为后缀的rpm包。 例如:查看file软件包中的说明文件,使用以下命令: [root@server108 cicro]# rpm -qd  file-4.10-2 /usr/share/doc/file-4.10/LEGAL.NOTICE /usr/share/doc/file-4.10/README /usr/share/man/man1/file.1.gz /usr/share/man/man3/libmagic.3.gz /usr/share/man/man5/magic.5.gz -s:与“-l“选项类似,除了显示软件包中的所有文件列表信息,而且还显示每个文件的状态。RPM已安装的软件包中各个文件拥有四种状态,分别是normal(正常状态,表示文件没有被其它软件包修改过)、not installed(未安装状态,表示文件没有安装)、replaced(已替换状态,表明此文件已经被其它软件包修改替换过了)、net shared(网络共享状态,表示此文件处于网络共享状态)。 例如:查看ipvsadm-1.24-6包中每个文件的状态,使用以下命令: [root@localhost ~]# rpm -i --excludedocs ipvsadm-1.24-6.i386.rpm  [root@localhost ~]# rpm -qs ipvsadm-1.24-6                          normal        /etc/rc.d/init.d/ipvsadm normal        /sbin/ipvsadm normal        /sbin/ipvsadm-restore normal        /sbin/ipvsadm-save not installed /usr/share/doc/ipvsadm-1.24 not installed /usr/share/doc/ipvsadm-1.24/README not installed /usr/share/man/man8/ipvsadm-restore.8.gz not installed /usr/share/man/man8/ipvsadm-save.8.gz not installed /usr/share/man/man8/ipvsadm.8.gz       从上面可以看到,我们在安装ipvsadm-1.24-6.i386.rpm的时候指定不安装说明文档,然后通过“-s”命令查看文件状态时,软件包的说明文档状态均为“not installed”。 -R (或--requires):显示软件包所需的功能,所谓功能,可以是软件包标识,也可以是共享动态库文件等等,软件包的依赖关系就是依靠功能来实现的,如果所需的功能不存在,则依赖关系一定得不到满足,软件安装就会失败。 --provides:显示软件包提供的功能,这个功能可以是动态库文件,也可以是虚拟软件的包名等等。 例如:查看nxclient-2.1.0-17.i386.rpm提供的功能,使用以下命令: [root@localhost ~]# rpm -qp --provides nxclient-2.1.0-17.i386.rpm                    nxclient = 2.1.0-17 可以看到这个软件提供了nxclient的功能。

    3. 验证软件包       验证已经安装的软件包       校验软件包比较的是某软件包安装的文件和原始软件包中的同一文件的信息是否一致。它校验每个文件的大小、权限、MD5 值、类型、所有者、以及组群。 命令格式:rpm -V [辅助选项] package1……packageN 主选项说明: -V:verify的意思,也可以用“--verify”代替。此参数主要校验已经安装的软件包内的文件和最初安装时是否一致。 参数说明:package1……packageN 表示需要校验的且已经安装的软件包名。 辅助选项说明: -p:验证软件包文件 例如:下面是验证rsh包的安装状态,操作过程如下: [root@localhost ~]# rpm -V rsh-0.17-25.3  package rsh-0.17-25.3 is not installed [root@localhost ~]# rpm -Vp rsh-0.17-25.3.i386.rpm warning: rsh-0.17-25.3.i386.rpm: V3 DSA signature: NOKEY, key ID db2a6e missing     /usr/bin/rcp missing     /usr/bin/rexec missing     /usr/bin/rlogin missing     /usr/bin/rsh missing   d /usr/share/man/man1/rcp.1.gz missing   d /usr/share/man/man1/rexec.1.gz missing   d /usr/share/man/man1/rlogin.1.gz missing   d /usr/share/man/man1/rsh.1.gz [root@localhost ~]# rpm -ivh rsh-0.17-25.3.i386.rpm     warning: rsh-0.17-25.3.i386.rpm: V3 DSA signature: NOKEY, key ID db2a6e Preparing...   ########################### [100%]    1:rsh     ######################## [100%] [root@localhost ~]# rpm -Vp rsh-0.17-25.3.i386.rpm   warning: rsh-0.17-25.3.i386.rpm:V3 DSA signature: NOKEY, key ID db2a6e [root@localhost ~]# rpm -V rsh-0.17-25.3 #上面操作中,我们首先验证rsh,可以知道rsh没有在系统中安装,接着我们安装了rsh软件包,再次查看rsh包状态时,没有任何输出了,表示软件包文件全部正常。 -f:校验文件在所属的软件包的状态,此选项后面跟相应的文件名。 例如:检查mysqlclient包中各个文件的状态,我们的操作如下: [root@localhost ~]# rpm -ql mysqlclient10-3.23.58-4.RHEL4.1  /etc/ld.so.conf.d/mysqlclient10-i386.conf /usr/lib/mysql/libmysqlclient.so.10 /usr/lib/mysql/libmysqlclient.so.10.0.0 /usr/lib/mysql/libmysqlclient_r.so.10 /usr/lib/mysql/libmysqlclient_r.so.10.0.0 [root@localhost ~]# mv \ >/usr/lib/mysql/libmysqlclient.so.10  /usr/lib/mysql/libmysqlclient.so.10.d [root@localhost ~]# rpm –V mysqlclient10-3.23.58-4.RHEL4.1 missing     /usr/lib/mysql/libmysqlclient_r.so.10 [root@localhost ~]# rpm -Vf  /usr/lib/mysql/libmysqlclient_r.so.10 missing     /usr/lib/mysql/libmysqlclient_r.so.10  #这里我们首先检查了mysqlclient包中包含的所有文件,然后模拟删除mysqlclient包中一个文件,然后查看这个文件的状态,可以看到显示为“missing”,如果我们通过“-Vf”选项检查某个文件,没有任何输出时,表示这个文件状态正常。 -a:检验所有的软件包。 -g:检验所有属于组的软件包。 验证未安装的软件包文件 发行的RPM格式的软件包是否值得信任,是否损坏,我们可以通过RPM提供的选项进行验证。RPM软件包一般使用 Gnu 隐私卫士(或称 GPG)来签名,从而帮助使用者肯定下载软件包的可信任性。 命令格式:rpm -K file1.rpm……fileN.rpm 主选项说明: -K: checksig的意思,也可以用“--checksig”代替。这个选项用来检查 RPM 软件包文件的md5校验和GPG签名。 参数说明:file1.rpm……fileN.rpm表示需要校验软件包名。 例子:如果想要校验某个软件包是否被篡改或者是否损坏,可以使用如下命令检查:  [root@localhost ~]# rpm -K nxserver-2.1.0-22.i386.rpm  nxserver-2.1.0-22.i386.rpm: md5 OK 这里的“md5 OK”表示文件在下载中没有被损坏或者没有被篡改。即这个文件是安全的。 [root@localhost ~]# rpm -K ipvsadm-1.24-6.i386.rpm  ipvsadm-1.24-6.i386.rpm: (SHA1) DSA sha1 md5 (GPG) NOT OK (MISSING KEYS: GPG#443e1821)  上面的输出表示这个软件没有被授权签名,在安装未被linux发行商授权的软件包时,请务必谨慎,因为这些软件包内可能包含有害的代码。

    4. 更新软件包 命令格式:rpm -U [辅助选项] file1.rpm……fileN.rpm 主选项说明: -U:upgrade的意思,可以使用“--upgrade”代替。 参数说明:file1.rpm……fileN.rpm表示需要升级的rpm文件包。 辅助选项说明: --oldpackage 表示允许"升级"到一个老版本,即软件版本降级。 其它选项与安装RPM软件包辅助参数完全相同,这里不再讲述。 例子:我们将rsh从rsh-0.17-25.3升级到rsh-0.17-37.el5,步骤如下: [root@localhost ~]# rpm  -q rsh rsh-0.17-25.3 [root@localhost ~]# rpm  -Uvh rsh-0.17-37.el5.i386.rpm     warning: rsh-0.17-37.el5.i386.rpm: V3 DSA signature: NOKEY, key ID 37017186 Preparing... ######################### [100%]    1:rsh    ########################### [100%] [root@localhost ~]# rpm  -q rsh

    rsh-0.17-37.el5 5. 删除软件包 命令格式:rpm -e [辅助选项] package1……packageN 主选项说明: -e:erase的意思,也可以用“--erase”代替。 参数说明:package1……packageN表示已经安装的软件包名称。 辅助选项说明: --test:只执行删除的测试。 --nodeps:不检查依赖性。 举例: (1) 删除rsh软件包,使用以下命令: [root@localhost ~]# rpm  -q rsh     rsh-0.17-37.el5 [root@localhost ~]# rpm  -e rsh-0.17-37.el5 [root@localhost ~]# rpm  -q rsh package rsh is not installed (2)删除gcc软件包,但是存在依赖关系,操作过程如下: [root@server ~]# rpm -e gcc                     error: Failed dependencies: gcc = 3.4.4-2 is needed by (installed) gcc-c++-3.4.4-2.i386 gcc = 3.4.4-2 is needed by (installed) gcc-g77-3.4.4-2.i386 gcc = 3.4.4-2 is needed by (installed) gcc-java-3.4.4-2.i386 gcc = 3.4.3 is needed by (installed) libtool-1.5.6-4.EL4.1.i386 gcc is needed by (installed) systemtap-0.4-0.EL4.i386 这里又出现了删除依赖性了,根据上面的提示可知,要删除gcc软件包,必须删除与gcc相互依赖的五个软件包,这个操作要非常慎重,除非知道删除后对系统没有影响,否则一定不要盲目执行删除操作,因为这样可能导致系统的崩溃。 其实我们也可以加入“--nodeps”参数,忽略依赖关系,但是这样可能会导致相关依赖软件的不可用。

    最新回复(0)