RPM套件使用说明

发表于:2007-07-04来源:作者:点击数: 标签:
RPM 目前使用最广泛的套件管理程式之一,利用资料库管理的方式来进行套件的安装,具有相当容易的操作介面,而且套件查询验证的功能相当强大,不过麻烦的地方在於他的属性相依的问题; 什么是 RPM 、 SRPM ? RPM 全名是『 RedHat Package Manager 』简称则为
RPM
    目前使用最广泛的套件管理程式之一,利用资料库管理的方式来进行套件的安装,具有相当容易的操作介面,而且套件查询验证的功能相当强大,不过麻烦的地方在於他的属性相依的问题;

什么是 RPM 、 SRPM ?
    RPM 全名是『 RedHat Package Manager 』简称则为 RPM 啦!顾名思义,当初这个套件管理的程式是由 Red Hat 这家公司发展出来的,但其实在很多的其他套件也有相类似的套件管理程式。不过由於 RPM 使用上很方便,所以就成了目前最热门的套件管理程式啦!那么什么是 RPM 呢?说的简单一点, RPM 是以一种资料库记录的方式来将你所需要的套件安装到你的 Linux 主机的一套管理程式。他最大的特点就是将您要安装的套件先包装好了,透过包装好的套件里头预设的资料库记录,记录这个套件要安装的时候必须要的相依属性模组(就是你的 Linux 主机需要先存在的几个必须的套件),当安装在你的 Linux 主机时, RPM 会先依照套件里头的纪录资料查询 Linux 主机的相依属性套件是否满足,若满足则予以安装,若不满足则不予安装。那么安装的时候就将该套件的资讯整个写入 RPM 的资料库中,以便未来的查询、验证与反安装!这样一来的优点是:
 
    由於已经编译完成并且打包完毕,所以安装上很方便;
    由於套件的资讯都已经记录在 Linux 主机的资料库上,很方便查询、升级与反安装;
 
    但是这也造成很大的困扰,由於 RPM 程式是已经包装好的资料,也就是说,里面的资料已经都『编译完成』了!所以,安装的时候一定需要当初安装时的主机环境才能安装,也就是说,当初建立这个套件的安装环境必须也要在你的主机上面出现才行!例如 rp-pppoe 这个 ADSL 拨接套件,他必须要在 ppp 这个套件存在的环境下才能进行安装!如果你的主机并没有 ppp 这个套件,那么很抱歉,除非您先安装 ppp 否则 rp-pppoe 就是不让你安装的(当然您可以强制安装,但是通常都会有点问题发生就是了!)。所以,通常不同的 distribution 所释出的 RPM 档案,并不能用在其他的 distribution 里面,举例来说, Red Hat 释出的 RPM 档案,通常无法直接在 Mandrake 上面进行安装的,更有甚者,不同版本之间也无法互通,例如 Mandrake 9.0 的 RPM 档案就无法直接套用在 8.2 上面!因此,这样可以发现他的缺点是:
 
    安装的环境必须与打包时的环境需求一致或相当;
    需要满足套件的相依属性需求;
    反安装时需要特别小心,最底层的套件不可先移除,否则可能造成整个系统的问题!
 
    那怎么办?呵呵!还好,还有 SRPM 这个东西! SRPM 是什么呢?他也是一种 RPM 啦!但是由於里面连同当初编译之前的原始码都在里头,所以可以进行重新编译的动作。通常 SRPM 的附档名是 ****.src.rpm 这一种档案格式。由於 SRPM 包含了原始码及参数设定档案,所以在安装之前则必须重新的编译建立起包装的资讯档案套件才行!当然罗,如果在编译的过程中发生了问题,也可以藉由里头的原始码更动来修正问题的所在呢!所以说, RPM 与 SRPM 最大的差异就是在於有没有包含原始码的程式啦!
 

--------------------------------------------------------------------------------

什么是 i386, i586, i686, noarch
    好啦!现在我们已经知道 RPM 与 SRPM 的格式了,分别为:
    xxxxxxxxx.rpm  <==RPM 的格式,已经包装完成的 rpm 档案;
    xxxxx.src.rpm  <==SRPM的格式,包含为编译的原始码资讯。
 
    OK!那么 rpm 档案有没有什么版本或者是套件名称的称呼呢?有的,你可以这样来看待一个 rpm 的档案,例如:
    rp-pppoe-2.6-5.i386.rpm
   rp-pppoe            -      2.6         -       5          .      i386        .rpm
第一个部分是套件名称这是套件的版本资讯 这是释出版本的次数 这是适合的硬体平台 附档名而已 
 
    这样子可以很清楚的发现该套件的名称、版本资讯、打包次数与操作的硬体平台!好了,来谈一谈每个不同的地方吧:
 
    套件名称:当然就是每一个套件的名称了!
     
    版本资讯:每一次更新版本就需要有一个版本的资讯,否则如何知道这一版是新是旧?这里通常又分为主版本跟次版本,反正版本很多啦!
     
    释出版本次数:也就是编译的次数啦!那么为何需要重复的编译呢?这是由於同一版的套件中,可能由於有某些 bug 或者是安全上的顾虑,所以必须要重新设定当初打包时候的设定参数,设定完成之後重新编译并打包成 RPM 档案!因此就有不同的打包数出现了!
     
    操作硬体平台:这是个很好玩的地方,由於 RPM 可以适用在不同的操作平台上,但是由於不同的平台设定的参数还是有所差异性!所以就有所谓的 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 的机器,但是 i386 则不一定可以使用於 586 或者是 686 的硬体上面,另外,在 686 的机器上使用 i686 的档案会比使用 i386 的档案在执行上,效能可能比较好一些!无论如何,使用 i386 应该就是比较没有问题的啦!另外,由於不同的 distirbution 会有不同的环境与函式库,所以在 i386 之後也有可能会额外再加上该套件的简写!
 
好了!接下来我们来谈一谈安装的时候所需要使用到的目录!
 

SRPM 与 RPM 工作时候所需要的安装目录
SRPM 的编译过程:
    刚刚提到 SRPM 里头含有的是未经编译的原始码,所以我们需要将 SRPM 进行编译打包的动作!那么编译是在哪里进行呢?由於编译的时候会将原始码解压缩出来,并且将附有的参数控制选项也同时的解开,所以就有一些资料会出现了,那么这些资料放在哪里呢?你可以到你的 /usr/src 这个目录里面去查看一下,通常每个 distribution 提供的目录都不太相同,以 Mandrake 9.0 为例,他是以 /usr/src/RPM 为工作目录, Red Hat 是以 /usr/src/redhat 为工作目录, Openlinux 则是以 /usr/src/openlinux 为工作目录!无论如何,反正就是在 /usr/src 这个目录下就对了!好了,既然我们是在 Mandrake 9.0 ,所以就到 /usr/src/RPM 里头去看一看呦:
     
    /usr/src/RPM/SPEC:这个目录当中放置的是该套件的设定档,例如这个套件的资讯参数、设定项目等等都放置在这里;
    /usr/src/RPM/SOURCE:这个目录当中放置的是该套件的原始档(*.tar.gz的档案)以及 config 这个设定档;
    /usr/src/RPM/BUILD:在编译的过程中,有些暂存的资料都会放置在这个目录当中;
    /usr/src/RPM/RPMS:经过编译之後,并且顺利的编译成功之後,将打包完成的档案放置在这个目录当中。里头有包含了 i386, i586, i686, noarch.... 等等的次目录。
 
    此外,在编译的过程当中,可能会发生不明的错误,或者是设定的错误,这个时候就会在 /tmp 底下产生一个相对应的错误档,您可以根据该错误档进行除错的工作呢!等到所有的问题都解决之後,也编译成功了,那么刚刚解压缩之後的档案,就是在 /usr/src/RPM/SPEC, SOURCE, BUILD 等等的档案都会被杀掉,而只剩下放置在 /usr/src/RPM/RPMS 底下的档案了!
 
RPM 的安装过程:
    RPM 在安装的时候,会先去读取 套件 内的设定参数内容,就是刚刚我们在 /usr/src/RPM/SPEC 的相关资讯啦!然後将该资料用来比对 Linux 系统的环境,这些环境包括了这个欲安装的套件的前驱套件,例如目前 postfix 这个 e-mail 套件当中,大都支援了cyrus-sasl 这个套件的身份认证功能,所以,要安装 postfix 就必需先安装 cyrus-sasl 这个套件,否则 postfix 就不让你安装了!还有类似版本的资讯等等,这些都是 RPM 环境的要求,如果环境相符就予以安装,如果不符就会显示出不符合的内容所在!等到安装完毕之後, rpm 就会将套件的资讯写入:/var/lib/rpm 这个目录中去!所以,往後您在进行查询的时候或者是预计要升级的时候,相关的资讯就会由 /var/lib/rpm 这个目录的内容资料来提供罗!此外,在安装 RPM 的套件时,这些套件通常会使用到底下的目录:
 
    /etc    一些设定档放置的目录,例如 /etc/samba
    /usr/bin   一些可执行档案
    /usr/lib   一些程式使用的动态函式库
    /usr/share/doc  一些基本的软体使用手册与说明档
    /usr/share/man  一些 man page 档案
 
    底下我们先针对 RPM 的相关指令来进行说明罗!


--------------------------------------------------------------------------------

RPM 的指令使用:安装、升级与更新、查询、验证、反安装与重建资料库
RPM 提供了『安装』、『升级与更新』、『查询』、『验证』、『反安装与重建资料库』等功能,底下我们一个一个来说明吧!

--------------------------------------------------------------------------------

安装:
从无到有就是安装啦!那么安装的方式为何呢?若是 RPM 则使用 ivh 啦!如果是 SRPM 就使用 rebuild 或是 recompiler 罗!
   [root @test /root]# rpm --rebuild   rp-pppoe-2.6-5.src.rpm  <==SRPM
    [root @test /root]# rpm --recompile rp-pppoe-2.6-5.src.rpm  <==SRPM
    [root @test /root]# rpm -ivh        rp-pppoe-2.6-5.i386.rpm <==RPM
 
    --rebuild:这个参数会将後面的 SRPM 进行『编译』与『打包』的动作,但是并没有安装,当您使用 --rebuild 的时候,最後通常会发现一行字体:
     
    Wrote: /usr/src/RPM/RPMS/i386/rp-pppoe-2.6-5.i386.rpm
 
    这个就是编译完成的 RPM 档案罗!那么这个档案就可以用来安装啦!安装的时候请加绝对路径来安装即可!
     
    --recompile:这个动作会直接的『编译』『打包』并且『安装』罗!请注意, rebuild 仅『编译并打包』而已,而 recompile 不但进行编译跟打包,还同时进行『安装』了!
     
    -ivh:就是用来安装 RPM 的参数而在这个参数之下,由於会有一些『相依属性』的问题,或者是曾经安装过的档案的问题,所以您可以再加以下的参数来『强制』安装:
    --nodeps:不考虑相依属性的关系,给他强制的安装下去;
    --replacepkgs:如果这个套件之前安装过,您想要覆盖这个套件,那么不需要反安装後再安装,可以直接加上 --replacepkgs 强制覆盖;
    --replacefiles:那么如果这个套件安装完毕之後,曾经被你修改过档案呢?就是安装过程中会出现『confilcting files 』的话,那么直接以 --replacefiles 覆盖掉这种档案吧!
   [root @test /root]# rpm -ivh rp-pppoe-2.6-5.i386.rpm
    [root @test /root]# rpm -ivh --nodeps       rp-pppoe-2.6-5.i386.rpm <==不考虑相依模组
    [root @test /root]# rpm -ivh --replacepkgs  rp-pppoe-2.6-5.i386.rpm <==直接覆盖掉曾安装过的套件
    [root @test /root]# rpm -ivh --replacefiles rp-pppoe-2.6-5.i386.rpm <==直接覆盖掉被修改过的问题档案
 

--------------------------------------------------------------------------------

升级:
    使用 RPM 来升级真是太简单了!就以 Uvh 来升级即可!但是在比较大量的升级版本中,使用 Fvh 则是比较好的作法。但是需要注意的是,如果您使用的是 Fvh ,偏偏您的机器上尚无这一个套件,那么很抱歉,该套件并不会被安装在您的 Linux 主机上面,所以请重新以 ivh 来安装吧!
   [root @test /root]# rpm -Uvh rp-pppoe-2.6-5.i386.rpm 
    [root @test /root]# rpm -Fvh *.rpm       <==所有在你 Linux 主机上面安装过的套件才升级
 
    注意的是, Uvh 是升级您所写入的套件,至於 Fvh 则是『仅升级在您的系统里面存在的套件』,所以有的朋友在大量的进行套件版本修补的时候,他们都是这样做的:
  
    先到各发展商的  errata 网站上捉下来最新的 i386 档案;
    使用 -Fvh 来将您的系统内曾安装过的套件进行修补与升级!(真是方便呀!)
 

--------------------------------------------------------------------------------

查询:
    查询也是 RPM 的重要功能之一,因为他提供了这个套件的版本、用途等资讯,是相当有用的!那么如何查询呢?底下列出只要的查询参数:
    1. 从系统查询(由 /var/lib/rpm 资料库取得的资料)
    [root @test /root]# rpm -q rp-pppoe                 <==仅列出 rp-pppoe 这个套件的版本;
    [root @test /root]# rpm -qa                         <==列出所有安装过的套件与版本;
    [root @test /root]# rpm -qi rp-pppoe                <==列出 rp-pppoe 这个套件的详细资讯
    [root @test /root]# rpm -ql rp-pppoe                <==列出 rp-pppoe 这个套件安装的档案与路径;
    [root @test /root]# rpm -qf /etc/rc.d/init.d/pppoe  <==查询 pppoe 这个档案属於哪一个套件?
    2. 由档案查询档案的内容
    [root @test /root]# rpm -qpi rp-pppoe-2.6-5.src.rpm  <==查询这个套件的详细资讯;
    [root @test /root]# rpm -qpl rp-pppoe-2.6-5.src.rpm  <== 查询这个套件里面有多少的档案内容存在
 
 
    查询套件:查询安装过的套件可以使用 -q 即可知道他的套件版本,但是如果忘记套件的全名,那么可以使用
    rpm -qa | grep pakagename 来选择出适当的套件!
    若使用 -qi 则可以了解这个套件的主要资讯!
    寻找套件档案:常常我们忘记一个套件内容含有的档案时,可以使用 -ql 来查询该套件,会列出相当多的档案呦!
    由档案寻找套件:这是最长发生的问题,就是您『误砍』了某个档案,偏偏不知道他是哪一个套件的,呵呵!那么你可以请跟你同样系统的朋友,使用 -qf 来查询该档案所属的套件,然後重新安装该套件就可以就回来啦!
 

--------------------------------------------------------------------------------

验证:
    验证的功能主要在於提供系统管理员一个有用的管理机制!作用的方式是『使用 /var/lib/rpm 底下的资料库内容来比对目前 Linux 系统的环境下的所有套件档案』也就是说,当您有资料不小心遗失,或者是因为您误杀了某个套件的档案,或者是不小心不知道修改到某一个套件的档案内容,就用这个简单的方法来验证一下原本的档案系统吧!好让您了解这一阵子到底是修改到哪些档案资料了!
  [root @test /root]# rpm -V rp-pppoe   <==单纯检查 rp-pppoe 这个已安装套件的档案内容与原先是否相同
   [root @test /root]# rpm -Va           <==检查所有的 /var/lib/rpm 底下的资料库与 Linux 系统下是否相同的档案!

范例:
    [root @test /root]# rpm -V xinet
    S.5....T c /etc/xinetd.d/echo
    S.5....T c /etc/xinetd.d/echo-udp
    S.5....T c /etc/xinetd.d/time
    S.5....T c /etc/xinetd.d/time-udp
   
在档案名称前面的参数说明
    S :file Size differs(档案的容量大小已被改变)
    M :Mode differs (includes permissions and file type)(档案的类型或档案的属性,如是否可执行等参数已被改变)
    5 :MD5 sum differs(MD5 这一种加密防骇的属性已被改变)
    D :Device major/minor number mis-match(装置名称已被改变)
    L :readLink(2) path mis-match(Link 属性已被改变)
    U :User ownership differs(档案的所属人已被改变)
    G :Group ownership differs(档案的所属群组已被改变)
    T :mTime differs(档案的建立时间已被改变)

    [root@test RPM]# rpm -ql crontabs   <==查询 crontabs 有哪些档案?
    /etc/cron.daily
    /etc/cron.hourly
    /etc/cron.monthly
    /etc/cron.weekly
    /etc/crontab
    [root@test RPM]# rpm -V crontabs    <==这些档案有哪些已经被修改了?
    S.5....T c /etc/crontab
 
 
    例如上面的范例中,我们知道了 crontabs 有五个档案或目录,其中,如果验证一下的话,就会发现 /etc/crotab 已经被改过了?那么如果该档案的变更是『预期中的』,那么就没有什么大问题,但是如果该档案是『非预期的』,那么是否被入侵了呢?呵呵!得注意注意罗!
--------------------------------------------------------------------------------

反安装与重建资料库:
    反安装就是将套件解除安装啦!要注意的是,『解安装的过程一定要由最上层往下解除』,以 rp-pppoe 为例,这一个套件主要是依据 ppp 这个套件来安装的,所以当您要解除 ppp 的时候,就必须要先解除 rp-pppoe 才行!否则就会发生结构上的问题啦!这个可以由建筑物来说明,如果你要拆除五、六楼,那么当然要由六楼拆起,否则拆了第五楼,那么上面的楼层难道会悬空?
 
    那么重建资料库呢?由於我们会一直在修改一些档案内容,例如 /etc/xinetd.d 里头的参数档案,加上可能自系统操作的过程中新增、移除等等的动作,导致系统的资料库有点乱,这个时候可以使用 --rebuilddb 来重建一下 rpm 的资料库!这两个方法的参数如下罗
   [root @test /root]# rpm -e re-pppoe  <==解安装 rp-pppoe 
    [root @test /root]# rpm --rebuilddb  <==重建资料库

原文转自:http://www.ltesting.net