鸟哥的 Linux ADSL 私房菜


RPM SRPM 套件管理员
最近更新日期:2004/04/20
 
在上一章当中,我们介绍了以 Tarball 的方式来安装我们的套件,同时也说明了 Source code 与执行档之间的关系。不过,如果每次安装套件都需要进行编译的动作,那么实在很没效率!这个时候,由 Red Hat 公司所开发出来的套件管理程序( Red Hat Package Manager, RPM )可就帮了大忙了!RPM 除了可以用来安装套件之外,还可以进行查询、升级、反安装、以及其它验证等等的功能,这些功能让我们在管理系统的套件上,更显的方便呢!此外,我们也可以利用 RPM 的原理来『自行创造自己的 RPM 档案』呢!
 
由于 RPM 实在是太好用了,目前主要的 Linux distributions 都是使用 RPM 来管理他们的套件,例如 Mandrake 与 Red Hat ,所以,您不能不知道 RPM 是什么东西?该如何利用他,以及熟悉相关的功能!赶紧来参详参详!
 
前言
  :什么是 RPM 与 SRPM
  :什么是 i386, i586, i686, noarch
  :RPM 的优点
  :RPM 属性相依的克服方式
RPM 套件管理程序
  :RPM 预设安装的路径
  :RPM 安装
  :RPM 升级与更新
  :RPM 查询
  :RPM 验证与数位签章
  :RPM 反安装与重建数据库
SRPM 的使用
  :利用系统默认值安装 SRPM 档案
  :SRPM 使用的路径与需要的套件
  :设定档的主要内容
  :SRPM 的编译指令
一个打包自己套件的范例
要选择 RPM 还是 Tarball
重点回顾
参考资源
课后练习

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

什么是 RPM 与 SRPM
RPM 全名是『 RedHat Package Manager 』简称则为 RPM 啦!顾名思义,当初这个套件管理的程序是由 Red Hat 这家公司发展出来的,但其实在很多的其它套件也有相类似的套件管理程序。不过由于 RPM 使用上很方便,所以就成了目前最热门的套件管理程序啦!
 
那么什么是 RPM 呢?说的简单一点, RPM 是以一种数据库记录的方式来将你所需要的套件安装到你的 Linux 主机的一套管理程序。他最大的特点就是将您要安装的套件先编译过( 如果需要的话 )并且打包好了,透过包装好的套件里头预设的数据库记录,记录这个套件要安装的时候必须要的相依属性模块( 就是你的 Linux 主机需要先存在的几个必须的套件 ),当安装在你的 Linux 主机时, RPM 会先依照套件里头的纪录数据查询 Linux 主机的相依属性套件是否满足,若满足则予以安装,若不满足则不予安装。那么安装的时候就将该套件的信息整个写入 RPM 的数据库中,以便未来的查询、验证与反安装!这样一来的优点是:
  1. 由于已经编译完成并且打包完毕,所以安装上很方便( 不需要再重新编译 );
  2. 由于套件的信息都已经记录在 Linux 主机的数据库上,很方便查询、升级与反安装;
但是这也造成很大的困扰,由于 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 的用处了!

什么是 i386, i586, i686, noarch
好啦!现在我们已经知道 RPM 与 SRPM 的格式了,分别为:
 
xxxxxxxxx.rpm  <==RPM 的格式,已经经过编译且包装完成的 rpm 档案;
xxxxx.src.rpm  <==SRPM的格式,包含未编译的原始码信息。
 
那么我们怎么知道这个套件的版本、适用的平台、打包的次数呢?呵呵!只要透过档名就可以知道了!例如 rp-pppoe-3.1-5.i386.rpm 这的档案的意义为:
 
rp-pppoe -  3.1    -   5  .   i386    .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 安装( install )

RPM 查询
验证的功能主要在于提供系统管理员一个有用的管理机制!作用的方式是『使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有套件档案』也就是说,当您有数据不小心遗失,或者是因为您误杀了某个套件的档案,或者是不小心不知道修改到某一个套件的档案内容,就用这个简单的方法来验证一下原本的档案系统吧!好让您了解这一阵子到底是修改到哪些档案数据了!验证的方式很简单:
 
-V  套件 验证一下这个套件的所有档案是否有被更动过,只有被更动过的档案才会被列出来。例如:
rpm -V logrotate
-Va 列出目前系统当中所有被更动过的档案。例如:
rpm -Va
-Vp 套件 列出该套件上面可能已经被更动过的档案,例如:
rpm -Vp pkgname.i386.rpm
-Vf 档案 查阅一下某个档案是否被更动过,例如:
rpm -Vf /etc/logrotate.conf
 
好了,那么我怎么知道到底我的档案被更动过的内容是什么?呵呵!简单的说明一下吧!例如,我们检查一下 logrotate 这个套件:
 
# 先看一下 logrotate 有几个档案?
[root@test root]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.6.8
/usr/share/doc/logrotate-3.6.8/CHANGES
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
# 呵呵!共有 8 个档案喔!
 
# 再来看一下有几个档案被动过了?!
[root@test root]# rpm -V logrotate
..5....T c /etc/logrotate.conf
 
# 怪怪!前面的几个咚咚是什么呢?!底下说明喔!
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 』的意思,也就是档案的类型,档案类型有底下这几类: 经过验证的功能,您就可以知道那个档案被更动过。那么如果该档案的变更是『预期中的』,那么就没有什么大问题,但是如果该档案是『非预期的』,那么是否被入侵了呢?呵呵!得注意注意啰!
 
再来,由于数字签证的盛行,我们 Linux 的 RPM 也可以利用数字签证来判断待安装的套件档案是否有问题喔!一般我们使用的是 GPG 的金钥( public key )。应用的方法很简单,首先,当我们想要使用某个团体释出的套件时,就需要将他们释出的 GPG 金钥先安装在自己的 Linux 系统上。然后,当安装该团体释出的套件时,就会检查两者的 key 是否相同,如果相同就直接安装,如果不同就会在屏幕上面显示讯息告知您并未安装该团体的 GPG 金钥!
 
安装金钥的方法很简单,例如 Red Hat 本身就有金钥在系统当中,安装如下:
 
[root@test root]# rpm --import /usr/share/rhn/RPM-GPG-KEY
 
那么如何查得这个金钥的相关信息呢?使用的方法很简单:
 
[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) <matthias.saou@est.une.marmotte.net>)
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-----

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

SRPM 的使用
谈完了 RPM 类型的套件之后,再来我们谈一谈包含了 Source code 的 SRPM 该如何使用呢?!假如今天我们由网络上面下载了一个 SRPM 的档案,该如何安装他?又,如果我想要修改这个 SRPM 里面原始码的相关设定值,又该如何订正与重新编译呢?!此外,最需要注意的是,新版的 rpm 已经将 RPM 与 SRPM 的指令分开了,SRPM 使用的是 rpmbuild 这个指令,而不是 rpm 喔!如果您是 Red Hat 7.3 以前的用户,那么请使用 rpm 来替代 rpmbuild 啦!
假设我下载了一个 SRPM 的档案,又不想要修订这个档案内的原始码与相关的设定值,那么我可以直接编译并安装吗?当然可以!利用 rpmbuild 配合参数即可。参数主要有底下两个:
 
--rebuild 这个参数会将后面的 SRPM 进行『编译』与『打包』的动作,最后会产生 RPM 的档案,但是产生的 RPM 档案并没有安装到系统上。当您使用 --rebuild 的时候,最后通常会发现一行字体:
Wrote: /usr/src/RPM/RPMS/i386/pkgname.i386.rpm
这个就是编译完成的 RPM 档案啰!那么这个档案就可以用来安装啦!安装的时候请加绝对路径来安装即可!
--recompile 这个动作会直接的『编译』『打包』并且『安装』啰!请注意, rebuild 仅『编译并打包』而已,而 recompile 不但进行编译跟打包,还同时进行『安装』了!
一般来说,如果编译的动作顺利的话,那么编译过程所产生的中间暂存盘都会被自动删除,如果发生任何错误,则该中间档案会被保留在系统上,等待使用者的除错动作!那么,该如何除错呢?!如果想要自行除错,就得要知道利用 SRPM 的时候,系统会动用到哪些重要的目录了!底下我们就来谈一谈当处理 SRPM 时,系统会使用到的目录。

设定档的主要内容
刚刚我们在上面提过了,SRPM还可以更改一些设定的内容,那么要如何修改这些设定的内容呢?我们以简单的 rp-pppoe 这个套件来说明好了,你可以连上 Internet 上面的 rp-pppoe 官方网站下载 SRPM ,或者由以下的方式来下载这个套件(请注意底下的档案是 2004/04 最新的档案数据,有可能在您看到本文时,这个套件已经更新了,所以请直接上底下的网址来下载吧!http://www.roaringpenguin.com/pppoe/)。至于基本的过程如下:
 
1. 下载 SRPM 软件:
[root@test root]# wget \
> http://www.roaringpenguin.com/products/rp-pppoe/rp-pppoe-3.5-1.src.rpm
 
2. 将 SRPM 解开在/usr/src/redhat 底下的目录当中
[root@test root]# rpm –i rp-pppoe-3.5-1.src.rpm
 
3. 观察一下有哪些原始码呢?
[root@test root]# cd /usr/src/redhat/SOURCES
[root@test SOURCE]# ls –l
-rw-rw-r--    1 root     root       189321 Jul  8 22:38 rp-pppoe-3.5.tar.gz
# 呵呵!上面显示我们的原始码就是这个档案啦!
 
好了,来看看我们的设定参数档,亦即是在 /usr/src/redhat/SPECS 内的 *.spec 档案啰!
 
观察一下预设的设定档案内容:
[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: http://www.roaringpenguin.com/pppoe/rp-pppoe-3.5.tar.gz
Url: http://www.roaringpenguin.com/pppoe/
Packager: David F. Skoll <dfs@roaringpenguin.com>
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 <shige@cin.nihon-u.ac.jp>
- merged rp-pppeo.spec and rp-pppoe-gui.spec

 
注意到的是rp-pppoe.sepc这个档案,这是主要的将SRPM编译成RPM的设定文件,他的基本规则可以这样看:
  1. 整个档案的开头以Summary为开始,这部份的设定都是最基础的说明内容;
  2. 然后每个不同的段落之间,都以%来做为开头,例如%prep与%install等;
我们来谈一谈几个常见的SRPM设定段落: 好了,那么如果您有自订的信息想要加入的话,就选择你要加入的那个段落,将他修改一下吧!例如,如果你在设定Makefile的时候,希望能够多一些额外的参数设定,那么就找到 %setup 那个段落,将他修改成您所需要的样子,就可以啰!

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那个目录底下就对啦!

一个打包自己套件的范例
这个就有趣了!我们自己来编辑一下自己制作的RPM怎么样?会很难吗?完全不会!这里简单的以一个小例子来说明喔!请注意,这个 真的只是一个小例子,所以不要觉得奇怪喔!其中,比较需要注意的,由于在上面的步骤说明中,我们知道在将SRPM编译成为RPM的时候,会以tar这支程 式来将档案解开,因此,我们在进行来源档案的建立时,就必需要将他打包成为一个tar.gz的tarball的档案才行
假设我们编辑了一支script,内容是这样:
 
[root@test root]# cd /usr/src/redhat/SOURCES
[root@test SOURCES]# vi showvbird.sh
#!/bin/bash
# This file is just used to demo the RPM packaging.
# the only thing is showing the hostname.
HOST=`/bin/hostname`
/bin/echo $HOST
 
[root@test SOURCES]# chmod 755 showvbird.sh
[root@test SOURCES]# tar –zcvf showvbird.tar.gz showvbird.sh
# 注意了,我们必需要将他打包才行!
 
上面的动作中,我们编辑了一个shell script档案,档名为showvbird.sh,并且将他打包成为具有gzip压缩的tarball档案,也就是showvbird.tar.gz这 样的档案才行!请注意,这个showvbird.tar.gz档案『必需』放置在SOURCES目录之下!
再来则是要编辑那个很重要的*.spec档案啰!你可以这样简单的编写一下:
 
[root@test root]# cd /usr/src/redhat/SPECS
[root@test SPECS]# vi showvbird.spec
Summary:   This is a demo RPM package.
Name:      showvbird
Version:   1.0
Release:   1
Copyright: GPL
Group:     VBird's Home
Source:    showvbird.tar.gz   <==这个就是刚刚建立起来的Tarball档案!
Url:       http://linux.vbird.org
Packager:  VBird

%description
This package is just a demo RPM.

%prep
%setup –c
%install
install -m 755 showvbird.sh /usr/local/bin/showvbird.sh

%files
/usr/local/bin/showvbird.sh

 
好了!开始给他编译并打包成为RPM档案啦!
 
[root @test SPECS]# rpmbuild -bb showvbird.spec
….(略)
Wrote: /usr/src/redhat/RPMS/i586/showvbird-1.0-1.i586.rpm
 
最后这个被打包成功的档案就被放置在/usr/src/redhat/RPMS/i586/showvbird-1.0-1.i586.rpm啰!然后给他安装一下:
 
[root@test SPECS]# rpm –ivh /usr/src/RPM/RPMS/i586/showvbird-1.0-1.i586.rpm
Preparing...                ########################################### [100%]
   1:showvbird              ########################################### [100%]

[root @test SPECS]# rpm –qi showvbird
Name        : showvbird                    Relocations: (not relocateable)
Version     : 1.0                          Vendor: (none)
Release     : 1                            Build Date: Wed 06 Nov 2002 11:27:17 PM CST
Install date: Wed 06 Nov 2002 11:27:42 PM CST      Build Host: test.linux.org
Group       : VBird's Home                 Source RPM: showvbird-1.0-1.src.rpm
Size        : 143                          License: GPL
Packager    : VBird
URL         : http://linux.vbird.org
Summary     : This is a demo RPM package.
Description :
This package is just a demo RPM.

[root @test SPECS]# showvbird.sh
test.linux.org
[root @test SPECS]# rpm –ql showvbird
/usr/local/bin/showvbird.sh       <==嘿嘿!已经记录起来了!自己的软件耶!

 
用很简单的方式,就可以将自己的软件或者程序给他修改与设定妥当!很不错吧!以后您就可以自行设定你的RPM啰!当然,也可以手动修改您的SRPM的来源档内容啰!

要选择 RPM 还是 Tarball?
优先选择 RPM:
这一直是个有趣的问题:如果我要升级的话,或者是全新安装一个新的套件,那么该选择 RPM 还是 Tarball 来安装呢?!基本上,如果有 RPM 可以提供给您的 distribution 来安装,并且没有严重的相依属性的问题时,呵呵!选择 RPM 来安装会是一个比较好的解决方案, Why ?这是由于刚刚上面就提到的 RPM 的好处 啦!可以具有档案与数据均有纪录的优点这就是上面提到的 /var/lib/rpm 这个目录里面的数据库,这个记录可以让你在管理上更为便利,包括上面提到的 RPM 的升级、安装、验证与移除等等。尤其是在查询上面!可以让你在管理你的系统上面更为便利。但是 RPM 也不是没有缺点的,包括最为大家所抱怨连连的『属性相依』的问题,每一个不同版本之间,就必须要以不同的 RPM 档案来安装!此外,如果要升级『某一个套件』而已时,通常还需要连带其它的套件也必须要一起升级才行,否则会有问题!此外,当一个套件经过了『大幅度的修改』之后,通常旧的 RPM 与新的 RPM 之间已经几乎无法『完全兼容』时,呵呵!那么升级或者是移除的手续可是会累坏人的!例如最近朋友们常常问到的 Apache 1.3.xx 与 2.0.xx 的版本升级问题!由于架构上面差异性太大,加上版本属性相依问题,所以很难得到一个完满的解决方案,这个时候 RPM 就不那么合适了。( 除非您要一个一个的将 Apache 移除,连同其相依的套件,然后再将 Apache 一个一个的安装,包括新套件的相依套件! ^_^ .....我是不会这么做的啦 )
简易方法:
如果 RPM 档案并不是这么容易取得的话,这个时候 Tarball 的方式就特别适合您的安装了!这是因为 Tarball 可以自行设定编译时的参数,此外,也可以自行设定『安装路径』,相当的适合于想要安装『多个不同版本的同一个套件』的情况( 说穿了就是测试机器 )!这是怎么说呢?!由于 RPM 必须要配合系统里面其它的相依属性的套件,所以基本上,他的安装路径( 就是每个档案的放置路径 )理论上是必须要放在固定的目录的,就是不能随意的改变他的安装路径。因此,当有两个不同版本的相同套件想要测试的时候,大概一定就得将原先的版本移除之后,才能安装使用新的版本啰!( 此外,由于相依的套件几乎都已经包含在 tarball 当中了,所以安装上面其实并不难啦)
相对于 RPM 的制式格式, tarball 可就灵活多了!你可以自行编译套件并且将他安装在不同的路径,只要在启动的时候选择正确的版本,那么不同版本的套件可以同时的存在于一个系统当中,而且可以透过选择启动的档案来启动不同的版本。当然啰!你也可以让 tarball 的安装与 RPM 的安装同时存在于一个系统当中,但是需要特别留意的是,你在启动该套件的时候,千万记得你的启动路径!免得启动到了错误的版本了!呵呵!( 这也是一个系统存在不同多个版本的套件容易发生的错误!希望大家都能够了解这个问题呢! )
所以说,为了避免这种路径上的错误困扰,基本上,我们都希望 Tarball 的安装路径可以设定在 Linux 原本就规划要给大家安装的路径『 /usr/local 』这个路径下!这样可以省去相当多寻找档案的时间!而且在管理上面也会比较容易!呵呵!
不过, Tarball 最麻烦的地方有几点: 所以说,RPM 与 Tarball 各有其优缺点,不过,如果有 RPM 的话,那么优先权还是在于 RPM 安装上面,毕竟管理上比较便利,但是如果套件的架构差异性太大,或者是无法解决相依属性的问题,那么与其花大把的时间与精力在解决属性相依的问题上,还不如直接以 tarball 来安装,轻松又惬意!

重点回顾
参考资源
刚刚最前面说过了,套件升级最主要的考虑就是『安全性』啦!所以请随时注意安全性方面的问题!目前国内的主要安全网站为:『台湾网络危机处理小组』这个组织,请随时注意上面发布的新闻!另外,如果跟鸟哥一样使用的是 Red Hat 的 distrubution 的话,那么 Red Hat 的 Errata 网页则不可不光临!好啦!底下列出几个 RPM 相关的网页与 Red Hat 的 Errata 网页提供大家参考啰!

课后练习
RPM SRPM 套件管理员

2002/08/21:第一次完成
2003/02/11:重新编排与加入 FAQ
2004/04/11:已经完成了 Source code 与 Tarball ,开始进行 RPM 与 SRPM 的介绍!(需要耗时多日啊!因为又要进兵营去了!)
2004/04/20:终于给他熬出来啦!又是过了两个休假期间~啊!给我退伍令、其余免谈!

2002/12/04 以来统计人数


Designed by VBird during 2001-2004.  Aerosol Lab.