Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2490744
  • 博文数量: 609
  • 博客积分: 10061
  • 博客等级: 上将
  • 技术积分: 5920
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-25 08:30
文章分类

全部博文(609)

文章存档

2010年(13)

2009年(39)

2008年(558)

我的朋友

分类: LINUX

2008-07-19 11:14:16

RPM 与 SRPM 套件管理员

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

   1. 由于已经编译完成并且打包完毕,所以安装上很方便( 不需要再重新编译 );
   2. 由于套件的信息都已经记录在 Linux 主机的数据库上,很方便查询、升级与反安装;
缺点为:
   1. 安装的环境必须与打包时的环境需求一致或相当;
   2. 需要满足套件的相依属性需求;
   3. 反安装时需要特别小心,最底层的套件不可先移除,否则可能造成整个系统的问题!
 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 档案。
     通常一个套件在释出的时候,都会同时释出该套件的 RPM 与 SRPM 。我们现在知道 RPM 档案必须要在相同的 Linux 环境下才能够安装,而 SRPM 既然是原始码的格式,自然我们就可以透过修改 SRPM 内的参数设定档,然后重新编译产生能适合我们 Linux 环境的 RPM 档案,如此一来,不就可以将该套件安装到我们的系统当中,而不必与原作者打包的 Linux 环境相同了。
1.2  什么是 i386, i586, i686, noarch     
      一个例子:
  rp-pppoe -  3.1    -   5  .   i386    .rpm
 套件名称   套件的版本信息   释出的次数   适合的硬件平台  附文件名
  noarch表示:没有任何硬件等级上的限制。
2 RPM 套件管理程序
   2.1 RPM 预设安装的路径
           安装完毕之后, rpm 就会将套件的信息写入:/var/lib/rpm 这个目录中去。
    /etc     一些设定文件放置的目录,例如 /etc/crontab
    /usr/bin     一些可执行档案
    /usr/lib     一些程序使用的动态函式库
    /usr/share/doc     一些基本的软件使用手册与说明文件
    /usr/share/man     一些 man page 档案
   2.2 RPM 安装( install)
        rpm参数
        -i :install 的意思
        -v :察看更细部的安装信息画面
        -h :以安装信息列显示安装进度,例如上面的 # 字符号!
                    其它参数
       --nodeps     使用时机:如果您在安装某个套件时,老是发现 rpm 告诉你『有属性相依的套件尚未安装』,而您又想要直接强制安装这个套件时,可以加上 --nodeps 告知 RPM 不要去检查套件的相依性。
                    危险性:套件会有相依性的原因是因为彼此会使用到对方的机制或功能,如果强制安装而不考虑套件的属性相依,则可能会造成该套件的无法正常使用!
       --nomd5     使用时间:不想检查 RPM 档案所含的 MD5 信息时。
       --noscripts     使用时机:不想让该套件自行启用或者自行执行某些系统指令。
       --replacefiles     使用时机:如果在安装的过程当中出现了『某个档案已经被安装在您的系统上面』的信息,又或许出现版本不合的讯息( confilcting files )时,可以使用这个参数来直接覆盖档案。
                  危险性:覆盖的动作是无法复原的!所以,您必须要很清楚的知道被覆盖的档案是真的不重要喔!否则会欲哭无泪!
       --replacepkgs     使用时机:重新安装某个已经安装过的套件!
       --force     这个参数其实就是 --replacefiles 与 --replacepkgs 的综合体!
        --test     使用时机:想要测试一下该套件是否可以被安装到使用者的 Linux 环境当中。范例为:
   2.3 RPM 升级与更新
    -Uvh     后面接的套件即使没有安装过,则系统将予以直接安装;若后面接的套件有安装过旧版,则系统自动更新至新版;
    -Fvh     如果后面接的套件并未安装到您的 Linux 系统上,则该套件不会被安装;亦即只有安装至您 Linux 系统内的套件会被升级。
   2.4   RPM 查询
        查询的地方是在 /var/lib/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
   2.5  RPM 验证与数位签章
        作用的方式是使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有套件档案。
   V  套件     验证一下这个套件的所有档案是否有被更动过,只有被更动过的档案才会被列出来。例如:
   rpm -V logrotate
   -Va     列出目前系统当中所有被更动过的档案。例如:
   rpm -Va
   -Vp 套件     列出该套件上面可能已经被更动过的档案,例如:
   rpm -Vp pkgname.i386.rpm
   -Vf 档案     查阅一下某个档案是否被更动过,例如:
   rpm -Vf /etc/logrotate.conf

        例如:
      [songbei6@localhost ~]$ rpm -V setup
      S.5....T c /etc/printcap
      S.5....T c /etc/profile
      ..?..... c /etc/securetty        

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
  档案的建立时间已被改变

   所以,如果当一个档案所有的信息都被更动过,那么他的显示就会是:
 SM5DLUGT c filename
  至于那个 c 代表的是『 Config file 』的意思,也就是档案的类型,档案类型有底下这几类:
    * c :设定档(config file)
    * d :文件数据文件(documentation)
    * g :鬼档案~通常是该档案不被某个套件所包含,较少发生!(ghost file)
    * l :授权档案(license file)
    * r :自述文件(read me)

  2.6 GPG 的金钥( public key )的安装
    [root@test root]# rpm --import ******RPM-GPG-KEY
           GPG的查询:
[root@test root]# rpm -qa | grep gpg
gpg-pubkey-e30di49b-392ksif1
gpg-pubkey-dkdf93ke-35698248
[root@test root]# rpm -qi gpg-pubkey-e30di49b-392ksif1
Name        : gpg-pubkey   Relocations: (not relocateable)
Version     : e30di49b          Vendor: (none)
Release     : 392ksif1      Build Date: Mon 29 Sep 2003 07:29:13 PM CST
Install Date: Mon 29 Sep 2003 07:29:13 PM CST      Build Host: localhost
Group       : Public Keys   Source RPM: (none)
Size        : 0                License: pubkey
Signature   : (none)
Summary     : gpg(Matthias Saou (Thias) )
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.2 (beecrypt-2.2.0)

mQGiBDlgvfERBADevsErSu+DAnE90dFPnpEX20elyZAmuRExGbcUJWSoJynohtGCa9fW6JY8
zm/Dm2dC8f1sSNQ2w7CFG7XRBfyQcL4AqrNKbOMeCl66Tgj+NURUHsnVyU3ASXROxVQ4/yJ6
9PVFomj0sealdEyDXDQoXhvgyI26qe3rriKBefCbRwCg+TdHq5I8B/9X7QLnWg7sZk7iI7sD
/27S9r4PS+FU9N26BvdgOvGeW6+1O/oqAU6HB+EFeGw0+uNbLjxPy1A9R5+M/FBZBMeyTO0S
83RVrnNfp5qzfAn8uo4EWg8eb1w==
=Sm+P
-----END PGP PUBLIC KEY BLOCK-----
2.7 RPM 反安装与重建数据库
       解安装的过程一定要由最上层往下解除。
         [root@test root]# rpm -e logrotate  <==解安装 logrotate 套件
        [root@test root]# rpm --rebuilddb   <==重建数据库

3. SRPM 的使用
 3.1  利用系统默认值安装 SRPM 档案
     利用 rpmbuild 配合参数即可。参数主要有底下两个:
    --rebuild     这个参数会将后面的 SRPM 进行『编译』与『打包』的动作,最后会产生 RPM 的档案,但是产生的 RPM 档案并没有安装到系统上。当您使用 --rebuild 的时候,最后通常会发现一行字体:
    Wrote: /usr/src/RPM/RPMS/i386/pkgname.i386.rpm
    这个就是编译完成的 RPM 档案啰!那么这个档案就可以用来安装啦!安装的时候请加绝对路径来安装即可!
    --recompile     这个动作会直接的『编译』『打包』并且『安装』啰!请注意, rebuild 仅『编译并打包』而已,而 recompile 不但进行编译跟打包,还同时进行『安装』了。
 3.2 SRPM 使用的路径与需要的套件
/usr/src/redhat/SPEC     这个目录当中放置的是该套件的设定档,例如这个套件的信息参数、设定项目等等都放置在这里;
/usr/src/redhat/SOURCE     这个目录当中放置的是该套件的原始档(*.tar.gz的档案)以及 config 这个设定档;
/usr/src/redhat/BUILD     在编译的过程中,有些暂存的数据都会放置在这个目录当中;
/usr/src/redhat/RPMS     经过编译之后,并且顺利的编译成功之后,将打包完成的档案放置在这个目录当中。里头有包含了 i386, i586, i686, noarch.... 等等的次目录。
   3.3 设定档的主要内容
  观察一下预设的设定档案内容:
[root@test root]# cd /usr/src/redhat/SPECS
[root@test SPECS]# vi rp-pppoe.spec
  
# 没错!这个就是SRPM的预设设定内容档案啰,进去修改一下,里面的数据有点像这样:
Summary: PPP Over Ethernet (xDSL support)
Name: rp-pppoe
Version: 3.5
%if %(%{expand:test %{_vendor} != mandrake ; echo $?})
Release: 1mdk
%else
Release: 1
%endif
Copyright: GPL
Group: System Environment/Daemons
Source:
Url:
Packager: David F. Skoll
BuildRoot: /tmp/pppoe-build
Vendor: Roaring Penguin Software Inc.
Requires: ppp >= 2.3.7

# LIC: GPL
%description
PPPoE (Point-to-Point Protocol over Ethernet) is a protocol used by
many ADSL Internet Service Providers. Roaring Penguin has a free
client for Linux systems to connect to PPPoE service providers.

The client is a user-mode program and does not require any kernel
modifications. It is fully compliant with RFC 2516, the official PPPoE
specification.

%prep
%setup
cd src
./configure --mandir=%{_mandir}

%build
cd src
make
cd ../gui
make

%install
cd src
make install RPM_INSTALL_ROOT=$RPM_BUILD_ROOT
cd ../gui
make install RPM_INSTALL_ROOT=$RPM_BUILD_ROOT

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
%doc doc/CHANGES doc/HOW-TO-CONNECT doc/LICENSE doc/KERNEL-MODE-PPPOE README SERVPOET
%config(noreplace) /etc/ppp/pppoe.conf

注:中间还有很多信息,被我省略掉了!知道了就好喔!

%changelog
* Thu Jul 21 2001 Shigechika AIKAWA
- merged rp-pppeo.spec and rp-pppoe-gui.spec
 
注意到的是rp-pppoe.sepc这个档案,这是主要的将SRPM编译成RPM的设定文件,他的基本规则可以这样看:

   1. 整个档案的开头以Summary为开始,这部份的设定都是最基础的说明内容;
   2. 然后每个不同的段落之间,都以%来做为开头,例如%prep与%install等;

我们来谈一谈几个常见的SRPM设定段落:

    * 系统整体信息方面:
             
            Summary     主要的套件说明,例如上表中,我们说明了他是ppp的拨接用途啦!
            Name     这个就是套件的名称;
            Version     这个是套件的版本信息;
            Release     这个是该版本打包的次数说明,在Mandrake里面,会自动的帮你设定打包的次数喔!就是1mdk那个咚咚;
            Copyright     这个套件的授权模式,我们是使用GPL啦!
            Group     这个套件的发展团体名称;
            Source     这个套件的来源,如果是网络上下载的套件,通常一定会有这个信息来告诉大家这个原始档的来源!
            Url     这个原始码的主要官方网站; Packager:这个套件是经由谁来打包的呢?
            Vender     发展的厂商哪;
            ExclusiveArch     这个是说明这个套件的适合安装的硬件,通常预设为i386,当然,你也可以调整为i586啦等等的!
            Requires     如果你这个套件还需要其它的套件的支持,那么这里就必需写上来,则当你制作成RPM之后,系统就会自动的去检查啦!这就是『相依属性』的主要来源啰!
             
          
   * %description
        将您的套件做一个简短的说明!这个也是必需要的。
   * %prep
       这部份的设定在于『尚未进行设定或安装之前,你要编译完成的RPM帮你事先做的事情』,就是prepare的简写,那么他的工作事项主要有:
          1. 寻找套件所需要的目录是否已经存在?确认用的.
         2. 事先建立您的套件所需要的目录,或者事先需要进行的任务;
         3. 如果待安装的Linux系统内已经有安装的时候可能会被覆盖掉的档案时,那么就必需要进行备份(backup)的工作了.
   * %setup
      这个段落就是在建立我们在Tarball当中说明的那个Makefile档案.所以呢,当然就是执行./config之类的设定档案!那么如果你要自己新增自己的参数,就可以在这个地方加入你的设定值!如果你的软件本身没有这方面的需要,里面就不需要编写内容.
   * %build
    build就是建立!所以,这个段落就是在谈怎么make编译成为可执行的程序.
    * %install
      编译完成(build)之后,就是要安装了。安装就是写在这里,也就是类似Tarball里面的make install的意思啰!
    * %files
      这个套件安装的档案都需要写到这里来,当然包括了『目录』喔!所以连同目录请一起写到这个段落当中!以备查验呢!^_^
    * %changelog
      这个主要则是在记录这个套件曾经的更新纪录啰!
    好了,那么如果您有自订的信息想要加入的话,就选择你要加入的那个段落,将他修改一下吧!例如,如果你在设定Makefile的时候,希望能够多一些额外的参数设定,那么就找到 %setup 那个段落,将他修改成您所需要的样子,就可以了。
 3.3 SRPM 的编译指令
 修改完成后,自然就是要将他编译成可以安装的RPM档案了。这个时候我们就可以直接在/usr/src/redhat/SPECS底下下达:
 
[root@test SPECS]# rpmbuild -bb rp-pppoe.spec  <==编译成RPM档案
[root@test SPECS]# rpmbuild -ba rp-pppoe.spec  <==打包成SRPM档案
 
这个时候系统就会这样做:

   1. 先进入到BUILD这个目录中,在Mandrake 9.0当中就是/usr/src/RPM/BUILD,在Red Hat底下就是/usr/src/redhat/BUILD这个目录;
   2. 依照*.spec档案内的Name与Version设定定义出工作的目录名称,以我们上面的例子为例,那么系统就会在BUILD目录中先删除rp-pppoe-3.5的目录,再重新建立一个rp-pppoe-3.5的目录,并进入该目录;
   3. 在新建的目录里面,针对SOURCES目录下的来源档案,也就是*.spec里面的Source设定的那个档案,以tar进行解压缩,以我们这个例子来说,则会在/usr/src/redhat/BUILD/rp-pppoe-3.5当中,将 /usr/src/redhat/SOURCES/rp-pppoe-3.5.tar.gz进行解压缩。
   4. 然后就开始%setup的工作;
   5. 再来开始%build及%install的设定与编译。
   6. 最后将完成打包的档案给他放置到该放置的地方去,如果你的规定的硬件是在i386的系统,那么最后编译成功的*.i386.rpm档案就会被放置在/usr/src/RPM/RPMS/i386里面啰!如果是i586那么自然就是 /usr/src/redhat/RPMS/i586目录下!
  最后的结果数据会放置在RPMS那个目录底下。

#摘自《鸟哥的Linux私房菜》 
阅读(850) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~