RPM

一、概述

   以原始码的方式来安装套件,也就是利用厂商释出的 Tarball 来进行套件与程序的安装。不过,您应该很容易发现,那就是每次安装套件都需要设定操作系统、设定编译参数、实际的编译、最后还要依据个人喜好的方式来安装套件到定位。这过程是真的很麻烦的,而且对于不熟整个系统的朋友来说,还真是累人啊!
 
   那有没有想过,如果我的 Linux 系统与厂商的系统一模一样,那么在厂商的系统上面编译出来的执行档,自然也就可以在我的系统上面跑啰!也就是说,厂商先在他们的系统上面编译好了我们使用者所需要的套件,然后将这个编译好的可执行的套件直接释出给使用者来安装,如此一来,由于我们本来就使用厂商的 Linux distribution ,所以当然系统是一样的,那么使用厂商提供的编译过的可执行档就没有问题啦!说的比较白话一些,那就是利用类似 Windows 的安装方式,由程序开发者直接在已知的系统上面编译好,再将该程序直接给使用者来安装,如此而已。
 
    那么如果在安装的时候还可以加上一些与这些程序相关的信息,将他建立成为数据库,那不就可以进行安装、反安装、升级与验证等等的相关功能啰( 类似 Windows 底下的『新增移除程序』 )?!确实如此,在 Linux 上面至少就有两种常见的这方面的套件管理员,分别是 RPM 与 Debian 的 dpkg ,其中又以 RPM 更常见。所以底下我们就来介绍一下 RPM 这个咚咚啰!


二、历史

    在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的“添加/删除程序”,但是功能又比“添加/删除程序”强很多,它就是 Red Hat Package Manager(简称RPM)。此工具包最先是由Red Hat公司推出的,后来被其他Linux开发商所借用。由于它为Linux使用者省去了很多时间,所以被广泛应用于在Linux下安装、删除软件。RPM 全名是『 RedHat Package Manager 』简称则为 RPM 啦!顾名思义,当初这个套件管理的程序是由 Red Hat 这家公司发展出来的,但其实在很多的其它套件也有相类似的套件管理程序。不过由于 RPM 使用上很方便,所以就成了目前最热门的套件管理程序啦!


三、RPM原理

    那么什么是 RPM 呢?说的简单一点, RPM 是以一种数据库记录的方式来将你所需要的套件安装到你的 Linux 主机的一套管理程序。他最大的特点就是将您要安装的套件先编译( 如果需要的话 )并且打包好了,透过包装好的套件里头预设的数据库记录,记录这个套件要安装的时候必须要的相依属性模块( 就是你的 Linux 主机需要先存在的几个必须的套件 ),当安装在你的 Linux 主机时, RPM 会先依照套件里头的纪录数据查询 Linux 主机的相依属性套件是否满足,若满足则予以安装,若不满足则不予安装。那么安装的时候就将该套件的信息整个写入 RPM 的数据库中,以便未来的查询、验证与反安装!这样一来的优点是:

   1. 由于已经编译完成并且打包完毕,所以安装上很方便( 不需要再重新编译 );
   2. 由于套件的信息都已经记录在 Linux 主机的数据库上,很方便查询、升级与反安装;


四、SRPM

    这也造成很大的困扰,由于 RPM 程序是已经包装好的数据,也就是说,里面的数据已经都『编译完成』了!所以,安装的时候一定需要当初安装时的主机环境才能安装,也就是说,当初建立这个套件的安装环境必须也要在你的主机上面出现才行!例如 rp-pppoe 这个 ADSL 拨接套件,他必须要在 ppp 这个套件存在的环境下才能进行安装!如果你的主机并没有 ppp 这个套件,那么很抱歉,除非您先安装 ppp 否则 rp-pppoe 就是不让你安装的( 当然您可以强制安装,但是通常都会有点问题发生就是了! )。所以,通常不同的 distribution 所释出的 RPM 档案,并不能用在其它的 distributions 里面,举例来说, Red Hat 释出的 RPM 档案,通常无法直接在 Mandrake 上面进行安装的,更有甚者,不同版本之间也无法互通,例如 Mandrake 9.0 的 RPM 档案就无法直接套用在 8.2 上面!因此,这样可以发现他的缺点是:

   1. 安装的环境必须与打包时的环境需求一致或相当;
   2. 需要满足套件的相依属性需求;
   3. 反安装时需要特别小心,最底层的套件不可先移除,否则可能造成整个系统的问题!

那怎么办?呵呵!还好,还有 SRPM 这个东西! SRPM 是什么呢?顾名思义,他是 Source RPM 的意思,也就是这个 RPM 档案里面含有原始码( Source Code )哩!特别注意的是,这个 SRPM 所提供的套件内容『并没有经过编译』,他提供的是原始码喔!通常 SRPM 的附檔名是以 ***.src.rpm 这种格式来命名的。不过,既然 SRPM 提供的是原始码,那么为什么我们不使用 Tarball 直接来安装就好了?!这是因为 SRPM 虽然内容是原始码,但是他仍然含有该套件所需要的相依性套件说明、以及所有 RPM 档案所提供的数据,同时,他与 RPM 不同的是,他也提供了参数设定档( 就是 configure 与 makefile 啦! )。所以,如果我们下载的是 SRPM ,那么要安装该套件时,RPM 套件管理员将会(1)先将该套件以 RPM 管理的方式编译,(2)然后将编译完成的 RPM 档案安装到 Linux 系统当中。与 RPM 档案相比, SRPM 多了一个重新编译的动作,而且 SRPM 编译完成会产生 RPM 档案。
 
    怪了,怎么 SRPM 这么麻烦吶!还要重新编译一次,那么我们直接使用 RPM 来安装不就好了!?通常一个套件在释出的时候,都会同时释出该套件的 RPM 与 SRPM 。我们现在知道 RPM 档案必须要在相同的 Linux 环境下才能够安装,而 SRPM 既然是原始码的格式,自然我们就可以透过修改 SRPM 内的参数设定档,然后重新编译产生能适合我们 Linux 环境的 RPM 档案,如此一来,不就可以将该套件安装到我们的系统当中,而不必与原作者打包的 Linux 环境相同了?这就是 SRPM 的用处了!

现在我们已经知道 RPM 与 SRPM 的格式了,分别为:
 
xxxxxxxxx.rpm  <==RPM 的格式,已经经过编译且包装完成的 rpm 档案;
xxxxx.src.rpm  <==SRPM的格式,包含未编译的原始码信息。
 
那么我们怎么知道这个套件的版本、适用的平台、打包的次数呢?呵呵!只要透过档名就可以知道了!例如 rp-pppoe-3.1-5.i386.rpm 这的档案的意义为:
 
rp-pppoe -  3.1    -   5  .   i386    .rpm
套件名称   套件的版本信息   释出的次数   适合的硬件平台  附文件名
 
除了后面适合的硬件平台与附文件名外,主要是以『-』来隔开各个部分,这样子可以很清楚的发现该套件的名称、版本信息、打包次数与操作的硬件平台!好了,来谈一谈每个不同的地方吧:

    * 套件名称:
      当然就是每一个套件的名称了!上面的范例就是 rp-pppoe 。

    * 版本信息:

      每一次更新版本就需要有一个版本的信息,否则如何知道这一版是新是旧?这里通常又分为主版本跟次版本,以上面为例,主版本为 3 ,在主版本的架构下更动部分原始码内容,而释出一个新的

版本,就是次版本啦!以上面为例,就是 1 啰!

    *   释出版本次数:

      也就是编译的次数啦!那么为何需要重复的编译呢?这是由于同一版的套件中,可能由于有某些 bug 或者是安全上的顾虑,所以必须要重新设定当初打包时候的设定参数,设定完成之后重新编译

并打包成 RPM 档案!因此就有不同的打包数出现了!( 注:这个时候原始码其实还是 3.1 那个版本,只是下达编译时的参数不同而已! )
    *   操作硬件平台:

      这是个很好玩的地方,由于 RPM 可以适用在不同的操作平台上,但是由于不同的平台设定的参数还是有所差异性!并且,我们可以针对比较高阶的 CPU 来进行最佳化参数的设定,所以就有所谓

的 i386, i586, i686 与 noarch 等的文件名称出现了!
             
            i386 几乎适用于所有的 x86 平台,不论是旧的 pentum 或者是新的 pentum-IV 与 K7 系列的 CPU等等,都可以正常的工作!那个 i 指的是 Intel 兼容的 CPU 的意思,至于 386

不用说,就是 CPU 的等级啦!
            i586 就是 586 等级的计算机,那是哪些呢?包括 pentum 第一代 MMX CPU, AMD 的 K5, K6 系列 CPU ( socket 7 插脚 ) 等等的 CPU 都算是这个等级;
            i686 在 pentun II 以后的 Intel 系列 CPU ,及 K7 以后等级的 CPU 都属于这个 686 等级!
            noarch 就是没有任何硬件等级上的限制。
              需要额外说明的是, i386 的档案可以在任何的机器上面安装,不论是 586 或者是 686 的机器,但是 i686 则不一定可以使用于 386 或者是 586 的硬件上面,这是因为 i686 的 RPM

档案在编译的时候,主要是针对 686 硬件等级的 CPU 来进行最佳化编译,而 386/586 等级的硬件可能由于无法支持该最佳化参数,所以无法使用呢!另外,在 686 的机器上使用 i686 的档案会比使用 i386 的档案,效能可能比较好一些!无论如何,使用 i386 应该就是比较没有问题的啦!另外,由于不同的 distirbution 会有不同的环境与函式库,所以在 i386 之后也有可能会额外再加上该套件的简写!

五、RPM 的优点及使用方法

    RPM 有以下的优点:

        * RPM 档案本身为已经编译过的 binary 档案,可以让 client 端的使用者免除重新编译的困扰;
        * RPM 档案在被安装之前,RPM 会先检查系统的硬盘容量、操作系统版本等,可避免档案被安装错误;
        * RPM 档案本身提供套件版本信息、相依属性套件名称、套件用途说明、套件所含档案等信息,便于了解套件;
        * RPM 管理的方式使用数据库记录 RPM 档案的相关参数,便于升级、移除、查询与验证。

    为什么 RPM 在使用上很方便呢?我们前面提过, RPM 这个套件管理员所处理的套件,是由套件提供者在特定的 Linux 作业平台上面将该套件编译完成,并且打包好,那使用者只要拿到这个打包好

的套件,然后将里头的档案放置到应该要摆放的目录,不就完成安装啰?!对啦!就是这样!但是有没有想过,我们在前一章 原始码与 Tarball 里面提过的,有些套件是有相关性的,例如要安装网络

卡驱动程序,就得要有 kernel source 与 gcc 及 make 等套件。那么我们的 RPM 套件是否一定可以安装完成呢?!如果该套件安装之后,却找不到他相关的前驱套件,那不是挺麻烦的吗?因为安装好

的套件也无法使用啊!
     
    为了解决这种具有相关性套件之间的问题,就是所谓的套件相依属性,RPM 就在提供套件打包的档案时,同时加入一些讯息登录的功能,这些讯息包括套件的版本、打包套件者、相依属性的套件、

套件的功能说明、该套件的所有档案与目录纪录、等等,然后在 Linux 系统上面亦建立一个 RPM 套件数据库( database ),如此一来,当您要安装某个以 RPM 型态提供的套件时,在安装的过程中,

RPM 会去检验一下数据库里面是否已经存在相关的套件了,如果数据库显示不存在,那么这个 RPM 档案『预设』就不能安装( 会显示一些错误讯息 )。呵呵!没有错,这个就是 RPM 类型的档案最为人

所诟病的『套件的属性相依』问题啦!

RPM 属性相依的克服方式

    虽然 RPM 有套件属性相依的问题,但是 RPM 的优点实在是比缺点要好的多,所以很多使用者还是偏好使用 RPM 来管理自己的套件,在这样的情况下,如何解决 RPM 的属性相依问题呢?最简单的

方式就是在安装 RPM 档案的时候,发生套件相依的问题时,手动去下载前驱套件,先安装好这些套件,然后再安装最终想要安装的套件即可。但是,如此一来很花费使用者的精神与时间,挺麻烦的啦!

有没有比较快速的方法呢?
     
    呵呵!有的,由于 RPM 类型的档案里面含有属性相依的讯息存在,如果我们可以透过分析这些讯息,再让程序自行去寻找未安装的前驱套件,并事先加以安装,如此一来不就解决了属性相依的困扰

了吗?!没错!是这样!这就是目前所谓的 urpmi/apt/yum 等服务的由来啦!这些服务都是透过分析 RPM 档案的相依信息,然后自行取得相依属性套件,自行完成安装的动作,呵呵!相当的方便呢!

这些信息我们会在 服务器架设篇 里面进行介绍,在这个章节当中,我们主要还是以单纯的 RPM 为主喔!



      RPM 的使用其实不难,只要使用 rpm 这个指令即可!鸟哥最喜欢的就是 rpm 指令的查询功能了,可以让我很轻易的就知道某个系统有没有安装鸟哥要的套件呢!此外,我们最好还是得要知道一

下,到底 RPM 类型的档案他们是将套件的相关档案放置在哪里呢?还有,我们说的那个 RPM 的数据库又是放置在哪里呢?
       
      RPM 预设安装的路径
             
            一般来说,RPM 类型的档案在安装的时候,会先去读取档案内记载的设定参数内容,然后将该数据用来比对 Linux 系统的环境( 例如属性相依的套件 ),例如目前 SSH 这个远程联机软件(

请参考服务器篇 )使用的是 OpenSSL 的加密机制,所以,要安装 SSH 的时候,就得要先安装好 OpenSSL 才行啊,如果没有安装 OpenSSL 的话, SSH 就不让您安装了!这些都是 RPM 环境的要求,如

果环境相符就予以安装,如果不符就会显示出不符合的内容所在!等到安装完毕之后, rpm 就会将套件的信息写入:/var/lib/rpm 这个目录中去!所以,往后您在进行查询的时候或者是预计要升级的

时候,相关的信息就会由 /var/lib/rpm 这个目录的内容数据来提供啰!
             
            一般来说,由于 RPM 有数据库来纪录套件相关的信息,所以 RPM 类型的套件所拥有的档案都放置在系统预设放置的目录底下,亦即如同我们在 档案属性与目录配置 一文当中提到的:
                   
                  /etc 一些设定文件放置的目录,例如 /etc/crontab
                  /usr/bin 一些可执行档案
                  /usr/lib 一些程序使用的动态函式库
                  /usr/share/doc 一些基本的软件使用手册与说明文件
                  /usr/share/man 一些 man page 档案
                    好了,底下我们就来针对每个 RPM 的相关指令来进行说明啰!

    RPM 安装( install )

            安装就是 install 嘛!所以啰,使用 rpm 来安装就很简单啦!假设我要安装一个档名为 rp-pppoe-3.1-5.i386.rpm 的档案,那么我可以这样( 记得某些套件可能需要以系统管理员的身份

来安装 ):
             
            [root@test root]# rpm -i rp-pppoe-3.1-5.i386.rpm
             
            不过,这样的参数其实无法显示安装的进度,所以,通常我们会这样下达安装指令:
             
            [root@test root]# rpm -ivh rp-pppoe-3.1-5.i386.rpm
            Preparing...     ####################################### [100%]
               1:rp-pppoe    ####################################### [100%]
            # -i :install 的意思
            # -v :察看更细部的安装信息画面
            # -h :以安装信息列显示安装进度,例如上面的 # 字符号!
             
            # 如果要安装两个以上的套件时,可以这样:
            [root@test root]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm
            # 后面可以接多个套件!
             
            # 也可以直接由网络上面安装,例如:
            [root@test root]# rpm -ivh http://website.name/path/pkgname.rpm
             
            另外,如果我们在安装的过程当中发现问题,或者已经知道会发生的问题,而还是『执意』要安装这个套件时,可以使用如下的参数『强制』安装上去:
                   
                  --nodeps 使用时机:如果您在安装某个套件时,老是发现 rpm 告诉你『有属性相依的套件尚未安装』,而您又想要直接强制安装这个套件时,可以加上 --nodeps 告知 RPM

不要去检查套件的相依性。
                  危险性:套件会有相依性的原因是因为彼此会使用到对方的机制或功能,如果强制安装而不考虑套件的属性相依,则可能会造成该套件的无法正常使用!
                  --nomd5 使用时间:不想检查 RPM 档案所含的 MD5 信息时。
                  说明:还记得我们在前一章有提到的 MD5 这个指纹辨识吧?!没错,这里指的就是不要检查 RPM 套件的 MD5 信息。但除非您很清楚这个套件的来源,否则不建议使用这个参数。
                  --noscripts 使用时机:不想让该套件自行启用或者自行执行某些系统指令。
                  说明:RPM 的优点除了可以将档案放置到定位之外,还可以自动执行一些前置作业的指令,例如数据库的初始化。如果您不想要让 RPM 帮您自动执行这一类型的指令,就加上他吧!
                  --replacefiles 使用时机:如果在安装的过程当中出现了『某个档案已经被安装在您的系统上面』的信息,又或许出现版本不合的讯息( confilcting files )时,可以使用

这个参数来直接覆盖档案。
                  危险性:覆盖的动作是无法复原的!所以,您必须要很清楚的知道被覆盖的档案是真的不重要喔!否则会欲哭无泪!
                  --replacepkgs 使用时机:重新安装某个已经安装过的套件!
                  --force 这个参数其实就是 --replacefiles 与 --replacepkgs 的综合体!
                  --test 使用时机:想要测试一下该套件是否可以被安装到使用者的 Linux 环境当中。范例为:
                  rpm -ivh pkgname.i386.rpm --test
                    一般来说,安装的指令大约就是这些了。通常鸟哥建议直接使用 -ivh 就好了,如果安装的过程中发现问题,一个一个去将问题找出来,尽量不要使用『暴力安装法』,因为可能

会发生很多不可预期的问题呢!除非您很清楚的知道使用上面的参数后,安装的结果是您预期的!
              RPM 升级与更新
             
            使用 RPM 来升级真是太简单了!就以 -Uvh 或 -Fvh 来升级即可( 注:vh 的功能仍是在于显示细部信息与安装进度而已 )!不过,这两种升级方式是不太一样的:
                   
                  -Uvh 后面接的套件即使没有安装过,则系统将予以直接安装;若后面接的套件有安装过旧版,则系统自动更新至新版;
                  -Fvh 如果后面接的套件并未安装到您的 Linux 系统上,则该套件不会被安装;亦即只有安装至您 Linux 系统内的套件会被『升级』!
                    由上面的说明来看,如果您想要大量的升级系统旧版本的套件时( 例如刚安装完操作系统,而想要更新套件至最新 ),使用 -Fvh 则是比较好的作法。但是需要注意的是,如果您

使用的是 Fvh ,偏偏您的机器上尚无这一个套件,那么很抱歉,该套件并不会被安装在您的 Linux 主机上面,所以请重新以 ivh 来安装吧!
             
            通常有的朋友在进行整个操作系统的旧版套件修补时,喜欢这么进行:
             
               1. 先到各发展商的 errata 网站或者是国内的 FTP 映像站捉下来最新的 RPM 档案;
               2. 使用 -Fvh 来将您的系统内曾安装过的套件进行修补与升级!( 真是方便呀!)
             
            当然啰,升级也是可以利用 --nodeps/--force 等等的参数啦!

    RPM 查询

            RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm 这个目录下的数据库档案啦!另外, RPM 也可以查询档案内的信息喔!那如何去查询呢?我们底下以简单的范例来说明:
                   
                  -q  套件 仅查询后面的套件名称是否已经阿安装,例如:
                  rpm -q logrotate
                  -ql 套件 列出该套件的所有相关目录与档案喔!例如:
                  rpm -ql logrotate
                  -qi 套件 列出该套件的 information (信息),里面的信息可多着呢,包括了套件名称、版本、开发商、SRPM文件名称、打包次数、简单说明信息、套件打包者、安装日期等等

!如果想要详细的知道该套件的数据,用这个参数来了解一下。例如:
                  rpm -qi logrotate
                  -qf 档案 这个参数后面接的可是『档案』吶!不像前面都是接套件喔!这个功能在查询系统的某个档案属于哪一个套件所有的。举例来说,如果想要知道

/etc/logrotate.conf 是那个套件所提供的,可以这样:
                  rpm -qf /etc/logrotate.conf
                  -qc 套件 查询该套件的设定文件放置的完整目录名称,例如:
                  rpm -qc logrotate
                  -qd 套件 查询该套件的文件说明数据文件放置的完整路径名称,例如:
                  rpm -qd logrotate
                  -qR 套件 列出该套件需要预先安装的档案,亦即有属性相依套件的档案!例如:
                  rpm -qR logrotate
                  -qa 后面什么都不必加入,直接输入 rpm -qa 即可得知目前 Linux 系统上面共以 RPM 的方式安装了多少的套件!
                  -qp[licdR] 档案 上面提到的都与系统的 /var/lib/rpm 内的数据库有关,而这里提到的则是与 RPM 档案本身有关。举例来说,如果我下载了一个档名为 pkgname.i386.rpm

的档案,我想要知道他里面主要的讯息,则:
                  rpm -qpi pkgname.i386.rpm
                  想要知道与他有关的套件,则:
                  rpm -qpR pkgname.i386.rpm
                    常见的查询就是这些了!
例题:
我想要知道我的系统当中,以 c 开头的套件有几个,如何实做?

    rpm -qa | grep ^c | wc -l

我的 WWW 服务器为 Apache ,他使用的 RPM 档名为 httpd 。现在,我想要知道这个套件的所有设定档放置在何处,可以怎么作?

    rpm -qc httpd

承上题,如果查出来的设定档案已经被我改过,但是我忘记了曾经修改过哪些地方,所以想要直接重新安装一次该套件,该如何作?

    假设该套件在网络上的网址为:
    http://web.site.name/path/httpd-x.x.xx.i386.rpm
    则我可以这样做:
    rpm -ivh http://web.site.name/path/httpd-x.x.xx.i386.rpm --replacepkgs

如果我误砍了某个重要档案,例如 /etc/crontab,偏偏不晓得他属于哪一个套件,该怎么办?!

    虽然已经没有这个档案了,不过没有关系,因为 RPM 有纪录在 /var/lib/rpm 当中的数据库啊!所以直接下达:
    rpm -qf /etc/crontab
    就可以知道是那个套件啰!重新安装一次该套件即可!

      RPM 反安装与重建数据库

        反安装就是将套件解除安装啦!要注意的是,『解安装的过程一定要由最上层往下解除』,以 rp-pppoe 为例,这一个套件主要是依据 ppp 这个套件来安装的,所以当您要解除 ppp 的时候,

就必须要先解除 rp-pppoe 才行!否则就会发生结构上的问题啦!这个可以由建筑物来说明,如果你要拆除五、六楼,那么当然要由六楼拆起,否则拆了第五楼,那么上面的楼层难道会悬空?
         
        那么重建数据库呢?由于我们会一直在修改一些档案内容,例如 /etc/xinetd.d 里头的参数档案,加上可能自系统操作的过程中新增、移除等等的动作,导致系统的数据库有点乱,这个时候可

以使用 --rebuilddb 来重建一下 rpm 的数据库!这两个方法的参数如下啰:
         
        [root@test root]# rpm -e logrotate  <==解安装 logrotate 套件
        [root@test root]# rpm --rebuilddb   <==重建数据库

你可能感兴趣的:(rpm)