首页 > 代码库 > 程序包管理之RPM

程序包管理之RPM

    在windows系统上安装一个程序很简单,只需要双击打开安装程序包,然后就是下一步,下一步的问题。在linux系统上对于安装来说要复杂的多,在没有安装包工具之前,安装一个程序需要先配置(configure), 编译(make)以及安装(make install), 这中间很容易出错,对于新手来说不容易上手,如果对于一个软件包不了解的话,那些错综复杂的依赖关系就把人搞的很头痛。

    为了解决这个问题,debian首先发布了一个软件包管理程序dpkg,用于管理安装软件包,后来Redhat也依照dpkg提供了rpm这个管理程序,全称为redhat package manager, 后来这种标准被工业化以后又称为RPM is Package Manager。  
     RPM可以让用户直接以二进制(binary)方式安装软件包,并且可替用户查询是否已经安装了有关的库文件;在用RPM删除程序时,它又会聪明地询问用户是否要删除有关的程序。如果使用RPM来升级软件,RPM会保留原先的配置文件,这样用户就不用重新配置新的软件了。RPM保留一个数据库,这个数据库中包含了所有的软件包的资料,通过这个数据库,用户可以进行软件包的查询。RPM虽然是为Linux而设计的,但是它已经移值到SunOS、Solaris、AIX、Irix等其它UNIX系统上了。RPM遵循GPL版权协议,用户可以在符合GPL协议的条件下自由使用及传播RPM。

     RPM做为一个软件包的管理程序, 常用的功能有软件包的安装, 卸载, 查询, 检验以及RPM数据库的管理, 下面我们依次来看下相应的功能及实现.

1. RPM软件使用基础及安装

     对于rpm来说, 我们先来看下它的格式, 一般一个rpm包都会以rpm结尾, 有时候也会看到以src.rpm结尾的是以源代码方式封装的rpm包.常见的格式为name-version-release-arch.rpm

       name: 软件的名称

       version: 软件的版本号

       release: 这里的release是指rpm包的发布版本号, 跟软件无直接关系

       arch: 指这个软件支持的平台架构, 如 i386, 或者x86_64等, 有时候会看到noarch表示支持所有的平台.

     举个例子来说明下, 比如说一个rpm包: MySQL-server-5.5.16-1.rhel5.i386.rpm, 我们从后往前看会好理解些, rpm结尾, 说明这是一个rpm格式的包, i386表示支持的架构,这个是X86架构的, 1.rhel5表示软件包封装的relase, 很容易看清楚是基于rhel5来封装的, 5.5.16是指导软件包的版本, 最后MySQL-server是这个软件包的名称.

rpm命令的使用格式

rpm [options] file…

基本格式说完,就可以说下安装了,安装很简单,用于安装的选项:

       -i: install 安装的意思

       -v: 显示安装的详细信息

       -h: 以#号的形式显示安装进度

举个例子来说明下, 比如说要安装MySQL-server-5.5.16-1.rhel5.i386.rpm, 命令如下:

rpm –ivh MySQL-server-5.5.16-1.rhel5.i386.rpm

  --nodeps: 软件包之间会有依赖关系, 如果想忽略依赖关系强制安装或者卸载的话,可以使用这个选项,不建议使用,因为就算安装上以后,也不一定能使用. 

    --force: 在安装的时候,有可能现存的版本比较新,会无法安装,如果想强制安装的话可以使用这个选项

2. 升级

  升级的话可以使用-U或者-F选项,这两个选项之间是有区别的.

    -U: 即能用于软件版本升级也能用于安装

    -F: 仅仅用于使用  

    nodps与force选项同样适合于升级时使用

3. 卸载

    卸载一个软件包的话使用, -e选项, 后面跟软件的名称, 注意是软件的名称而不是软件包的名称. nodeps与force选项同样可以用于卸载.

    -e: 软件包卸载

4. 查询

    查询的选项有很多, 也有很多相应的功能, 下面一一细说

    -q: 用于查询某个软件包是否安装

    -qi: 查询软件的基本信息,包含版本,签名,简单描述等

    -qa: 查询所有已经安装过的程序包, 可以配置管道符以及grep来搜索

    -ql: 查询软件包都安装了哪些文档

    -qf: 查询某个文件是由哪一个软件包生成

    -qc: 查询软件包生成的配置文件

    上面这些命令都是用于查询已经安装完成的包的信息的, 当然也可以查询未安装的包的信息, 只需要在相应的命令上加上p即可, 比如说-qpl就表示查询某个未安装的包,安装后所生成文件的, 其它选项类似.

5. 检验

    校验分为两个部分,检验安装后的文件是否被修改过和安全性,先说检验文件是否被修改过,使用-V选项来检验校验结果会看到如下的一些字母标识:

    S: 表示文件大小;
    M: 表示权限;
    5: 表示MD5检查和;
    D: 表示主从设备号;
    L: 表示符号连接;
    U: 表示属主;
    G: 表示属组;
    T: 表示最后修改时间根据文件类型的不同检验的项目也不同

    看下,相应的执行结果

    [root@centos1 ~]# echo "#new line" >> /etc/skel/.bashrc #给bash的一个文件添加一行注释
    [root@centos1 ~]# rpm -V bash
    S.5....T.  c /etc/skel/.bashrc

    上文件只是列出了bashrc文件,没有列出的,说明没有被修改过。S表示文件大小发生了改变,因为我们添加了一行。5表示MD5值发生了改变,因为大小变了MD5值肯定会有变化,T是最后修改时间。

    再下来说下文件的安全性,安全性主要是指包文件的完整性及合法性,在生产环境当中,如果安装了一个来源不明或者黑客提供的一个文件,危害是可想而知的,所以需要校验。使用-K的选项校验,如果提示key不正确或者没有,需要先导入key. 导入key使用--import选项,后面跟key的文件名称。

[root@centos1 ~]# ls    #查看当前目录,看到一个freeradius的软件包
bin  bonnie  freeradius-2.1.10-5.el6.x86_64.rpm  install.log  install.log.syslog
[root@centos1 ~]# rpm -K ./freeradius-2.1.10-5.el6.x86_64.rpm   #校验freeradius的软件包,跟包的路径,默认是当前目录
freeradius-2.1.10-5.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK   #校验OK

6. 数据库

前文就说过,rpm是需要依赖于数据库文件的, 那么如果数据库文件损坏, 或者说还没有建立该怎么办呢?下面就说下数据库的建立以及重建的方式.

rpm --initdb: 用于数据库的建立

rpm --rebuilddb: 用于数据库的重新建立, 注意会覆盖原有的文件.

7. 安装时的常见错误

  1). 软件包已经安装

package xxx.rpm is already installed 

error:  xxx.rpm cannot be installed

看到这种类似的提示说明安装的软件包已经安装过, 如果必须要安装的话, 可以使用--force选项来强制安装.

  2). 软件包冲突

 /usr/bin/xx confilicts with file from xx-1.0-1 
error: xxx.rpm cannot be installed

看到类似这种类似的错误提示, confilicts表示软件包与已经安装过的冲突, 如果必须要安装现有的, 可以先卸载掉与安装冲突的软件

  3). 缺少依赖的包

error: xxx is needed by xxx-1.0-1

  看到类似的提示信息, 说明缺少依赖包xxx-1.0-1, 需要先安装被依赖的包才能再继续安装.

 

从上文可以看到, rpm安装并不能自动解决包的依赖关系, 如果需要自动解决依赖关系的话, 就需要程序包的前端管理工具, yum来解决. rpm就说到这吧, 关于yum具体的东西再开文细讲.

本文出自 “无名无题” 博客,请务必保留此出处http://ryanhou.blog.51cto.com/9297149/1546937

程序包管理之RPM