RPM全称是Redhat Package Manager,是由RedHat公司开发出来的、用于管理Linux软件的一款开源软件。RPM是一个非常优秀的软件管理程序,现在已经是Linux的软件管理的一个标准,有很多知名Linux发行版都采用了此管理器(RedHat、SUSE)。除了RPM外还有很知名的Deb管理器,是属于Debian系使用的,功能也是十分强大(不过国内大多数工作平台都是RedHat系的,所以我们只谈谈RPM)。

   我们知道程序的运行需要针对平台进行编译,所谓编译就是将一个文本程序(人类能看懂的)转换为二进制代码(计算机能看懂的)。在编译的时候,会生成很多文件(程序二进制文件,依赖的库文件,头文件,配置文件等等等)。如果不合理的管理,会导致你的系统乱糟糟的(你总不希望自己在一个猪窝睡觉吧?)。而且,由于编译是一个相对比较繁琐(对于普通用户来讲可能是一个根本不可能完成的艰巨任务),所以为了让用户更方便的使用计算机安装软件,就开发出来了各种软件管理工具,实现软件的便捷操作。

   继续谈RPM:RPM就是上面提到用来管理软件的工具之一。RPM并不是一个编译器,它是将一个已经编译好的二进制的程序打包起来,然后对其进行一个统一标准的结构化管理(比如说声明这个文件的安装目录,库文件,头文件,所依赖的其他软件有哪些等等等等),安装完毕后RPM会将这个软件的安装信息记录在自己的数据库中,便于日后进行管理。既然RPM是将已经编译好的二进制程序打包,那么就说明这个RPM是具有平台依赖性的(比如 我在x86平台上编译的软件,是无法在Power平台上运行的,而且我在64位平台上编译的,是没法放在32位平台上使用的),所以难免会有些平台限制,如果一个程序没有在你这种平台编译过并打包成RPM,那你是无法用RPM的,只能自己安装了。

   顺便简单的讲一下,为什么X86编译的软件无法在Power平台上运行,以及平台位数是什么。简单讲就是平台不一样,你是中国人,用中文去是没法和外国人对话的是吧?我们的平台也是一样的,不同平台有不同的语言,X86平台有X86的语言,Power有Power的语音,当你把一个程序在X86平台上编译(翻译成X86能懂的语言),再将这个程序放到Power必然是不可行的(毕竟 翻译成了X86的语言,而我只会Power语言,你这是对牛弹琴)。至于平台/操作系统位数,现在常见的有64bit和32bit,这个bit是地址/数据总线的宽度(内存是一个寻址的空间,CPU的数据都来自于内存,地址总线是CPU用来标识内存地址的,每个地址都有一个标识符,按数学逻辑来讲,如果CPU的地址总线为32bit那么它可标记的空间就有2的32次方,所以32bit的内存最大只能是4G)。其实在32bit编译出来的软件是可以在64bit下跑的(高级向下级兼容,是一个包含关系,因为64就包含了32~~),相反64bit编译出来的软件则无法在32bit上面运行(下级是没法包含上级的,32总不能包含64吧)。

   又跑题了,继续RPM。。。(其实关于编译等等的还有很多知识,由于我也不懂唉,所以只能写到这里,现在努力看书中,以后尽量写出更详细的博文!^_^)

   rpm安装的过程比较简单,按照rpm包的内容执行安装即可。rpm包除了二进制程序外,还应该包含一些脚本,用于安装的额外操作:pre:安装前执行 | post:安装完执行 | preun:卸载前执行 | postun:卸载后执行。了解即可,详细各位可以看一下rpm包制作教程。

   不过rpm有一个缺点,就是依赖性。当然这并不关rpm什么事,它只是像运维一样背了个锅~~而yum则是用来解救它的。Linux系统有一条基本原则是“程序功能单一,组合小程序完成复杂任务”,所以Linux的软件通常都很小,但是正因为这个原则,所以每个程序的功能都很单一,当需要一些其他功能的时候,就需要安装其他程序来提供它所依赖的功能,这就是所谓的程序间依赖性,你很有可能会遇到这样的问题,a依赖b,b依赖c,c依赖d,d依赖a,然后就进入了一个循环,即使没有循环,它的依赖性也让人头疼。所以后来又研发了yum,yum就是专门用来解决rpm包的依赖性,它依据rpm依赖库说明,自己解决依赖关系,需要哪个软件就会自动安装,非常方便。不过这个软件需要你先学会rpm咯!

   由于RPM对平台的限制,所以命名是很有讲究的。即使你不做RPM包,也要了解一下他的基本命名规则(要不然你花了好半天劲下了一个RPM包却没法在你这个平台使,那你一定会崩溃掉的!)。

我们以httpd这个软件的命名说一下吧:httpd-2.2.15-47.el6.centos.x86_64.rpm
翻译出来意思就是:软件名-主版本号.次版本号.源码发行号-包发行号.编译时的操作系统平台.编译时的操作系统名.硬件平台.rpm标识符
  1) 软件名:就是软件的名字,没其他意义。
  2) 主版本号:开发此软件的主要的代号,一般有比较重大的升级会更新这个。
  3) 次版本号:一些日常的升级更新这个号。
  4) 源码发行号:补一些小bug就更新这个号。
  5) 包发行号:这个包发行了多少次。
  6) 编译时的操作系统平台:适用于哪种操作系统的那个平台。这里el6就是Enterprise linux的意思。当然结合后面的CentOS
  7) 操作系统平台:适用于哪个操作系统,这里为CentOS
  8) 硬件平台:这里为x86_64
  9) 标识:标识这是一个rpm包


   了解了rpm的命名规则,我们就可以安装rpm包了。不过要想安装rpm,得先会使rpm这个工具。看一下rpm命令的使用格式:

# rpm [options] PackageName...   很简单,rpm命令+选项+包名就可以了,至于格式与选项我们还可以细分一下:
 1.安装:
   rpm {-i|--install} [install-options] PACKAGE_FILE ...
        -h      :显示安装进度
        -v      :显示安装过程
        --test  :测试能否安装
        --force :强制安装(避免冲突)
        --nodeps:忽略依赖关系
        --replacepkgs:重新安装rpm包
        -vv:更多的信息
 2.卸载:
   rpm {-e|--erase} [--nodeps] [--noscripts] PACKAGE_NAME ...
        -v      :显示卸载过程
        --test  :测试能否卸载
        --force :强制安装(避免冲突)
        --nodeps:忽略依赖关系
 3.查询:
   rpm -q[options] PACKAGE_NAME ...
        p:未安装的软件信息
        a:查询所有安装的软件
        i:查看软件信息 
        l:安装后生成的文件
        f:查看文件是哪个安装包生成的
        c:列出配置文件
        d:文档
        --scripts:查看脚本文件
 4.升级(如果没有老版本,就安装):
   rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
        -h      :显示升级进度
        -v      :显示升级过程
 5.更新(如果没有老版本,则不执行):
   rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
        -h      :显示升级进度
        -v      :显示升级过程
 6.数据库管理:#/var/lib/rpm
   rpm --rebuilddb #重建
   rpm --initdb     #初始化
 7.校验:
     rpm {-V|--verify} [select-options] [verify-options]  #对包进行校验
      rpm --import PUBKEY ...   #导入公钥
      rpm {-K|--checksig} [--nosignature] [--nodigest]PACKAGE_FILE ...   #对包内文件进行校验

 操作篇请看RPM包管理(2)