一、使用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依赖的包是BB的版本号位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包的安装使用,后文中会详解,这里只作简单介绍。