首页 > 代码库 > 20.文件系统——使用RPM安装、卸载、查询、升级和校验软件包
20.文件系统——使用RPM安装、卸载、查询、升级和校验软件包
一、使用RPM安装软件包
rpm安装软件包,使用的选项是-i或者是--install,格式如下:
rpm -i|--install /Path/To/RPM_File
如果要显示安装时的信息,可以使用-v、-vv、-vvv选项,其中v的个数用来表示显示信息的详细级别。
如果要以哈希码(#,一个#表示2%)的形式显示安装进度,可以使用-h选项。
通常情况下上述三个选项会组合起来使用。
下面来演示一下rpm包的安装过程:
[root@localhosttest]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm
Preparing... ########################################### [100%] 1:zsh ########################################### [100%] #进度100%表示成功安装了rpm包zsh-4.3.10-7.el6.x86_64.rpm
现在再直接从光盘上安装一个软件包:
[root@localhostcdrom]# cd /media/cdrom/Packages/
[root@localhostPackages]# ls bind*
bind-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm bind-libs-9.8.2-0.17.rc1.el6_4.6.i686.rpm bind-chroot-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm bind-libs-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm bind-dyndb-ldap-2.3-5.el6.x86_64.rpm bind-utils-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm
[root@localhostPackages]# rpm -K bind-chroot-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm
bind-chroot-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm:rsa sha1 (md5) pgp md5 OK #验证bind-chroot-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm的合法性
[root@localhostPackages]# rpm -ivh bind-chroot-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm
error: Failed dependencies: bind = 32:9.8.2-0.17.rc1.el6_4.6 isneeded by bind-chroot-32:9.8.2-0.17.rc1.el6_4.6.x86_64 #提示安装不成功,错误的依赖关系,因此需要先装bind的核心包
如果能确定某个包的依赖关系,可以先安装被依赖的包,或者是同时安装被依赖和依赖的包,但是如果无法确定包的依赖关系,可以采取忽略安装的方式,当然这样会有很大的风险,尽管包可能能够安装成功,但往往不能运行,故通常不建议忽略依赖关系。忽略依赖关系使用的选项是--nodeps。
[root@localhostPackages]# rpm -ivh bind-chroot-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm --nodeps
Preparing... ########################################### [100%] 1:bind-chroot warning:group named does not exist - using root warning: group named does notexist - using root%) warning: group named does notexist - using root%) warning: group named does notexist - using root%) warning: group named does notexist - using root%) warning: group named does notexist - using root%) warning: group named does notexist - using root%) warning: group named does notexist - using root%) warning: group named does notexist - using root%) warning: group named does notexist - using root%) warning: user named does notexist - using root3%) warning: group named does notexist - using root warning: group named does notexist - using root%) warning: group named does notexist - using root%) warning: user named does notexist - using root2%) warning: group named does notexist - using root warning: user named does notexist - using root8%) warning: group named does notexist - using root ###########################################[100%] grep: /etc/sysconfig/named: Nosuch file or directory #bind-chroot-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm能够安装,但是报了大量的错误
有时候只需要测试一下是否能够安装一个包,而非真正安装这个包,可以使用选项--test。
[root@localhostPackages]# rpm -ivh bind-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm --test
Preparing... ########################################### [100%] #只测试,没有实际安装
如果一个程序已经安装了,但是想重新安装一遍,可以使用--replacepkgs。
[root@localhostPackages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm
Preparing... ###########################################[100%] packagezsh-4.3.10-7.el6.x86_64 is already installed #提示zsh-4.3.10-7.el6.x86_64.rpm已经安装过一遍了
[root@localhostPackages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm --replacepkgs
Preparing... ###########################################[100%] 1:zsh ########################################### [100%] #重新安装成功,替换了原有的包
使用rpm可以一次安装多个软件包。
二、RPM包的卸载
卸载RPM软件包可以使用-e选项,卸载的时候只需要指定包名,而不需要指定源文件,其格式如下:
rpm -e RPM_Name
例如要卸载zsh这个包,只需要进行如下操作:
[root@localhostPackages]# rpm -e zsh
#如果没有任何提示信息,说明卸载成功了
[root@localhostPackages]# rpm -e zsh
error: package zsh is notinstalled #卸载没有安装的包会报错
卸载的时候也存在依赖关系,
[root@localhostPackages]# rpm -ivh bind-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm
Preparing... ###########################################[100%] 1:bind warning:/etc/sysconfig/named created as /etc/sysconfig/named.rpmnew ###########################################[100%] #先安装bind这个包
[root@localhostPackages]# rpm -e bind
error: Failed dependencies: bind = 32:9.8.2-0.17.rc1.el6_4.6 isneeded by (installed) bind-chroot-32:9.8.2-0.17.rc1.el6_4.6.x86_64 #试图卸载bind这个包失败了,因为bind这个包被bind-chroot所依赖
如果要卸载有依赖关系的包,有两种做法:(1)将相互依赖的包都卸载掉;(2)使用--nodeps忽略依赖关系。
使用--test也可以测试是否存在依赖关系,而不是真正卸载这个包:
[root@localhostPackages]# rpm -e bind --test
error: Failed dependencies: bind = 32:9.8.2-0.17.rc1.el6_4.6 isneeded by (installed) bind-chroot-32:9.8.2-0.17.rc1.el6_4.6.x86_64 #检测说明bind这个包有依赖关系
[root@localhostPackages]# rpm -e bind --nodeps
warning: /etc/sysconfig/namedsaved as /etc/sysconfig/named.rpmsave #忽略依赖关系,可以卸载,但是会有警告信息 #这里的警告信息是因为安装bind包可能会修改/etc/sysconfig/named这个文件 #系统认为这个被修改过的文件可能以后还会被用到,因此对其进行了备份 #重新安装的时候有可能也会出现类似的警告信息,在生产环境中可以根据这些信息恢复相应的配置
三、RPM包的查询
查询系统中是否安装了某个包,可以使用-q或者--query选项,其格式为:
rpm -q|--query RPM_Name
例如,查询zsh是否安装了,可以进行如下操作:
[root@localhostPackages]# rpm -q zsh
package zsh is not installed #提示没有安装这个包
[root@localhostPackages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm
Preparing... ###########################################[100%] 1:zsh ########################################### [100%]
[root@localhostPackages]# rpm -q zsh
zsh-4.3.10-7.el6.x86_64 #安装zsh这个包后再次查询,可以得到包名、版本号、发行号、平台等信息
如果要查询所有已安装的包,可以使用-qa这个选项,后面无需带包名;如果只知道部分包名,可以结合grep命令:
rpm -qa | grep “pattern”
[root@localhostPackages]# rpm -qa
... evince-2.28.2-14.el6_0.1.x86_64 python-kerberos-1.1-6.2.el6.x86_64 openssh-5.3p1-94.el6.x86_64 iw-3.10-1.1.el6.x86_64 #不带包名,将显示当前系统上安装的所有包
注意,rpm -qa不支持文件名通配,例如:
[root@localhostPackages]# rpm -qa bind*
#无法查询到任何信息,*被当做软件包包名的一部分
[root@localhostPackages]# rpm -qa | grep "^bind"
#只显示以“bind”开头的包 bind-libs-9.8.2-0.17.rc1.el6_4.6.x86_64 bind-utils-9.8.2-0.17.rc1.el6_4.6.x86_64 bind-chroot-9.8.2-0.17.rc1.el6_4.6.x86_64
使用-qi 可以查询软件包的具体信息,这些信息都是由软件包的制作者提供的,我们自己打包时也可以添加这些信息:
[root@localhostPackages]# rpm -qi zsh
Name : zsh Relocations: (notrelocatable) Version : 4.3.10 Vendor: CentOS Release : 7.el6 Build Date:Sun 24 Nov 2013 12:40:59 PM EST Install Date: Sat 16 Aug 201405:19:18 PM EDT Build Host:c6b9.bsys.dev.centos.org Group : System Environment/Shells Source RPM: zsh-4.3.10-7.el6.src.rpm #包组的信息 Size : 5009102 License: BSD #包大小,包的许可证 Signature : RSA/SHA1, Sun 24 Nov 2013 02:33:46 PM EST,Key ID 0946fca2c105b9de #签名 Packager : CentOS BuildSystem<http://bugs.centos.org> #谁制作的包 URL : http://zsh.sunsite.dk/ Summary : Apowerful interactive shell #包的简单说明信息 Description : The zsh shell is a commandinterpreter usable as an interactive login shell and as a shell scriptcommand processor. Zsh resembles the ksh shell (the Korn shell), butincludes many enhancements. Zsh supports command line editing, built-inspelling correction, programmable command completion, shellfunctions (with autoloading), a history mechanism, and more. #包的详细描述信息
使用-ql选项,可以查询RPM包安装生成的文件清单:
[root@localhostPackages]# rpm -ql zsh | less
/bin/zsh /etc/skel/.zshrc /etc/zlogin /etc/zlogout /etc/zprofile /etc/zshenv /etc/zshrc /usr/lib64/zsh /usr/lib64/zsh/4.3.10 /usr/lib64/zsh/4.3.10/zsh /usr/lib64/zsh/4.3.10/zsh/attr.so /usr/lib64/zsh/4.3.10/zsh/cap.so ...
使用-qc选项,可以只显示安装了包以后生成的配置文件:
[root@localhostPackages]# rpm -qc zsh
/etc/skel/.zshrc /etc/zlogin /etc/zlogout /etc/zprofile /etc/zshenv /etc/zshrc
使用-qd选项,可以查看包的帮助文档:
[root@localhostPackages]# rpm -qd zsh
/usr/share/man/man1/zsh.1.gz /usr/share/man/man1/zshall.1.gz /usr/share/man/man1/zshbuiltins.1.gz /usr/share/man/man1/zshcalsys.1.gz /usr/share/man/man1/zshcompctl.1.gz ...
使用-q 和--scripts,可以查看软件包在安装过程中所执行的脚本:
[root@localhostPackages]# rpm -q --scripts zsh
postinstall scriptlet (using/bin/sh): if [ ! -f /etc/shells ] ; then echo "/bin/zsh" > /etc/shells else grep -q "^/bin/zsh$" /etc/shells|| echo "/bin/zsh" >> /etc/shells fi if [ -f/usr/share/info/zsh.info.gz ]; then # This is needed so that--excludedocs works. /sbin/install-info/usr/share/info/zsh.info.gz /usr/share/info/dir --entry="* zsh: (zsh). An enhanced bourneshell." fi : preuninstall scriptlet (using/bin/sh): if [ "$1" = 0 ] ; then if [ -f /usr/share/info/zsh.info.gz ]; then # This is needed so that --excludedocsworks. /sbin/install-info --delete/usr/share/info/zsh.info.gz /usr/share/info/dir --entry="* zsh: (zsh). An enhanced bourneshell." fi fi : postuninstall scriptlet (using/bin/sh): if [ "$1" = 0 ] ; then if [ -f /etc/shells ] ; then TmpFile=`/bin/mktemp/tmp/.zshrpmXXXXXX` grep -v ‘^/bin/zsh$‘ /etc/shells >$TmpFile cp -f $TmpFile /etc/shells rm -f $TmpFile fi fi
包相关的脚本有四类:
A.preinstall:程序包安装前执行的脚本
B.postinstall:程序包安装后执行的脚本
C.preuninstall:程序包卸载前执行的脚本(例如要卸载某个包,必须先停止服务器)
D.postuninstall:程序包卸载后执行的脚本(例如某个程序卸载后,需要清楚使用该程序的用户)
如果一个程序包还没有安装,但希望知道安装后的相关信息,可以使用-qpi选项,但需要注意的是,它后面跟的不再是包名,而是rpm包的文件名,即包含版本号、发行号、运行平台等信息的文件名:
[root@localhostPackages]# rpm -e zsh
#先卸载zsh这个包
[root@localhostPackages]# rpm -qpi zsh-4.3.10-7.el6.x86_64.rpm
Name : zsh Relocations: (notrelocatable) Version : 4.3.10 Vendor: CentOS Release : 7.el6 Build Date: Sun 24 Nov2013 12:40:59 PM EST Install Date: (notinstalled) Build Host:c6b9.bsys.dev.centos.org Group : System Environment/Shells Source RPM: zsh-4.3.10-7.el6.src.rpm Size : 5009102 License: BSD Signature : RSA/SHA1, Sun 24 Nov 2013 02:33:46 PM EST,Key ID 0946fca2c105b9de Packager : CentOS BuildSystem<http://bugs.centos.org> URL : http://zsh.sunsite.dk/ Summary : A powerful interactive shell Description : The zsh shell is a commandinterpreter usable as an interactive login shell and as a shell scriptcommand processor. Zsh resembles the ksh shell (the Korn shell), butincludes many enhancements. Zsh supports command line editing, built-inspelling correction, programmable command completion, shellfunctions (with autoloading), a history mechanism, and more. #查询的是没安装的包的相关信息
[root@localhostPackages]# rpm -qi zsh
package zsh is not installed #没有安装的包使用-qi选项是查询不到任何信息的
使用-pql可以查询未安装包将会生成的文件名,使用-qpc可以查询未安装包将会生成的配置文件,使用-qpd可以查询未安装包将会生成的文档信息:
[root@localhostPackages]# rpm -qpl zsh-4.3.10-7.el6.x86_64.rpm
... /usr/share/zsh/4.3.10/functions/zstyle+ /usr/share/zsh/4.3.10/scripts /usr/share/zsh/4.3.10/scripts/newuser /usr/share/zsh/site-functions #文件名信息
[root@localhostPackages]# rpm -qpc zsh-4.3.10-7.el6.x86_64.rpm
/etc/skel/.zshrc /etc/zlogin /etc/zlogout /etc/zprofile /etc/zshenv /etc/zshrc #配置文件信息
[root@localhostPackages]# rpm -qpd zsh-4.3.10-7.el6.x86_64.rpm
/usr/share/doc/zsh-4.3.10/BUGS /usr/share/doc/zsh-4.3.10/CONTRIBUTORS /usr/share/doc/zsh-4.3.10/FAQ /usr/share/doc/zsh-4.3.10/FEATURES /usr/share/doc/zsh-4.3.10/LICENCE /usr/share/doc/zsh-4.3.10/MACHINES /usr/share/doc/zsh-4.3.10/NEWS /usr/share/doc/zsh-4.3.10/README #文档信息
四、RPM包的升级
RPM包的升级,使用-U或-F选项,其中-U是指升级并安装,如果程序已经安装了,则只升级;如果程序还没有安装,则直接安装。-F选项表示只升级,如果程序还没有安装,则-F选项不会进行任何操作。升级和安装的过程非常相似,因此这两个选项也和-v、-h选项一起用,即-Uvh和-Fvh。
升级RPM包有可能会带来一些问题,因为包与包之间可能有依赖关系,如果包A依赖的包是B,B的版本号位1.1.1,现在将B升级为1.2.1,则很有可能破坏它和包A之间的依赖关系。
使用--force(新旧版本有冲突)和--nodeps(忽略依赖关系)可以强行升级。
注意,内核不应该升级,而应该尽可能安装,内核允许多版本并存!
五、RPM包的校验
安装了一个RPM包以后,过了一段时间有可能会发现这个包的相关信息被修改了,因此需要确定对此包进行修改的用户是否非经授权。
校验RPM包使用的选项是-V,加上包名:
[root@localhostPackages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm
Preparing... ########################################### [100%] 1:zsh ########################################### [100%]
[root@localhostPackages]# rpm -V zsh
#这里没有任何提示信息,表示该包没有被修改过
[root@localhostPackages]# vim /etc/zlogin
# /etc/zlogin and .zlogin aresourced in login shells. It should # contain commands that should beexecuted only in # login shells. It should be used to set the terminal # type and run a series ofexternal commands (fortune, # msgs, from, etc). # Add Some information #修改这个包的配置文件
[root@localhostPackages]# rpm -V zsh
S.5....T. c /etc/zlogin #再次校验,会发现这个包的配置文件被修改了
这里的S.5....T.有不同的含义,具体的含义如下:
[root@localhostPackages]# man rpm
Sfile Size differs:# 表示文件的大小
MMode differs (includes permissions and file type): # 权限信息和文件类型
5digest (formerly MD5 sum) differs:# 5 表示校验码(md5码)
DDevice major/minor number mismatch #主次设备号
LreadLink(2) path mismatch (后文详解)
UUser ownership differs # 属主信息
GGroup ownership differs # 属组信息
TmTime differs # 时间戳,最近一次修改时间
PcaPabilities differ # 提供的能力(如web服务器的能力)
点. # 表示没有被修改的部分
六、RPM包的数据库
RPM包的数据库位于/var/lib/rpm路径下。事实上,红帽系统的大多数程序的数据库都存放在/var/lib目录下,注意,/var/lib目录下的很多文件不是库文件,而是数据库文件。
[root@localhostPackages]# ls -l /var/lib/rpm
total 67544 -rw-r--r--. 1 root root 5529600 Aug 16 18:16 Basenames # 包名的基本名称 -rw-r--r--. 1 root root 12288 Jul 9 21:39 Conflictname -rw-r--r--. 1 root root 24576 Aug 16 18:20 __db.001 -rw-r--r--. 1 root root 229376 Aug 16 18:20 __db.002 -rw-r--r--. 1 root root 1318912 Aug 16 18:20 __db.003 -rw-r--r--. 1 root root 753664 Aug 16 18:20 __db.004 # 形如__db.00#的文件多为锁文件 -rw-r--r--. 1 root root 1290240 Aug 16 18:16 Dirnames -rw-r--r--. 1 root root 10436608Aug 16 18:16 Filedigests # 包中文件的摘要信息 -rw-r--r--. 1 root root 20480 Aug 16 18:16 Group -rw-r--r--. 1 root root 20480 Aug 16 18:16 Installtid -rw-r--r--. 1 root root 49152 Aug 16 18:16 Name -rw-r--r--. 1 root root 24576 Aug 16 17:07 Obsoletename -rw-r--r--. 1 root root 50475008Aug 16 18:16 Packages # 包和包的文件列表 -rw-r--r--. 1 root root 1318912 Aug 16 18:16 Providename -rw-r--r--. 1 root root 655360 Aug 16 18:16 Provideversion -rw-r--r--. 1 root root 12288 Aug 16 15:54 Pubkeys -rw-r--r--. 1 root root 479232 Aug 16 18:16 Requirename -rw-r--r--. 1 root root 282624 Aug 16 18:16 Requireversion -rw-r--r--. 1 root root 98304 Aug 16 18:16 Sha1header -rw-r--r--. 1 root root 81920 Aug 16 18:16 Sigmd5 -rw-r--r--. 1 root root 12288 Aug 16 17:07 Triggername
一旦程序的数据库文件被损坏了,则会导致无法对包进行校验,此时就需要对数据库进行重建。重建数据库的命令和选项是rpm--initdb(初始化数据库,如果数据库已经存在了,则不会覆盖原有的数据库,只创建一个新数据库)和--rebuilddb(重建数据库,会覆盖原有的数据库),其中--rebuilddb使用得比较多。
重建数据库会遍历当前系统上已经安装的每一个包,并抽取包中的信息,然后重新生成数据库,因此这个过程需要较长的时间。
[root@localhostPackages]# rpm --rebuilddb
#重建数据库不需要指定包名,直接使用选项即可
七、源码格式的RPM包
RPM包的生成过程,是根据spec(后文详解)文件来完成的,而定义spec文件是打包中最重要的部分。而源码格式的RPM包已经提供了spec文件,以及相关的补丁等信息,仅仅只是没有制作成rpm包。比如从epel上下载下来的形如4ti2-1.3.2-6.el6.src.rpm包,其中src就表示这是一个源码格式的包,这个rpm包也可以安装,但是安装了以后无法直接使用,它会生成一个spec文件和源码,如果要使用这个程序,需要用户根据spec文件将源码编译制作成二进制的rpm包,然后再安装这个制作好的二进制rpm包。之所以提供源码格式的RPM包,是为了适应不同的CPU平台。它使用的命令是rpmbuild。有关源码格式的RPM包的安装使用,后文中会详解,这里只作简单介绍。
本文出自 “重剑无锋 大巧不工” 博客,请务必保留此出处http://wuyelan.blog.51cto.com/6118147/1546305
20.文件系统——使用RPM安装、卸载、查询、升级和校验软件包