Chinaunix首页 | 论坛 | 博客
  • 博客访问: 236068
  • 博文数量: 39
  • 博客积分: 2108
  • 博客等级: 大尉
  • 技术积分: 432
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-03 16:02
文章存档

2010年(38)

2009年(1)

我的朋友

分类: LINUX

2010-04-27 12:50:25

Linux鸟哥私房菜学习笔记:RPM与SRPM套件管理  
---
RPM=Red Hat Package Manager, RPM 

+++
RPM文件名:
 rp-pppoe -  3.1    -   5  .   i386    .rpm 
 套件名称   套件的版本信息   释出的次数   适合的硬件平台  附文件名 

RPM与SRPM分别为: 
 xxxxxxxxx.rpm  <==RPM 的格式,已经经过编译且包装完成的 rpm 档案;
 xxxxx.src.rpm  <==SRPM的格式,包含未编译的原始码信息。

+++
系统保存所有rpm套件信息目录:/var/lib/rpm

+++
RPM 安装( install )
假设我要安装一个档名为 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

可以使用如下的参数『强制』安装上去(可以忽略):   
--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 系统内的套件会被『升级』!

+++
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

承上题,如果查出来的设定档案已经被我改过,但是我忘记了曾经修改过哪些地方,所以想要直接重新安装一次该套件,该如何作? 
假设该套件在网络上的网址为: 则我可以这样做: 
rpm -ivh --replacepkgs

如果我误砍了某个重要档案,例如 /etc/crontab,偏偏不晓得他属于哪一个套件,该怎么办?!
虽然已经没有这个档案了,不过没有关系,因为 RPM 有纪录在 /var/lib/rpm 当中的数据库啊!所以直接下达: 
rpm -qf /etc/crontab 
就可以知道是那个套件,重新安装一次该套件即可!

+++
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 』的意思,也就是档案的类型,档案类型有底下这几类: 
? c :设定档(config file) 
? d :文件数据文件(documentation) 
? g :鬼档案~通常是该档案不被某个套件所包含,较少发生!(ghost file) 
? l :授权档案(license file) 
? r :自述文件(read me) 

经过验证的功能,您就可以知道那个档案被更动过。那么如果该档案的变更是『预期中的』,那么就没有什么大问题,但是如果该档案是『非预期的』,那么是否被入侵了呢?呵呵!得注意注意啰!

+++
数字签证
---
再来,由于数字签证的盛行,我们 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)
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-----
这样就能看到相关的信息!

+++
RPM 反安装与重建数据库
---
[root@test root]# rpm -e logrotate  <==解安装 logrotate 套件 
[root@test root]# rpm --rebuilddb   <==重建数据库

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

===
SRPM 的使用 (介绍如何直接安装SRPM 的档案,及如何修改SRPM 里面原始码的相关设定值,及该如何订正与重新编译呢?!)
---
(***注意:新版的(Red Hat 7.3以后)rpm 已经将 RPM 与 SRPM 的指令分开了,SRPM 使用的是rpmbuild 这个指令,而不是 rpm 喔!)

rpmbuild --rebuild/recompile 文件名

--rebuild 这个参数会将后面的 SRPM 进行『编译』与『打包』的动作,最后会产生 RPM 的档案(尚未安装到系统上)
(当您使用 --rebuild 的时候,最后通常会发现一行字体: Wrote: /usr/src/RPM/RPMS/i386/pkgname.i386.rpm。这个就是编译完成的 RPM 档案啰!那么这个档案就可以用来安装啦!安装的时候请加绝对路径来安装即可!)

--recompile 这个动作会直接的『编译』『打包』并且『安装』啰!
(请注意, rebuild 仅『编译并打包』而已,而 recompile 不但进行编译跟打包,还同时进行『安装』了!)

一般来说,如果编译的动作顺利的话,那么编译过程所产生的中间暂存盘都会被自动删除,如果发生任何错误,则该中间档案会被保留在系统上,等待使用者的除错动作!那么,该如何除错呢?!如果想要自行除错,就得要知道利用 SRPM 的时候,系统会动用到哪些重要的目录了!底下我们就来谈一谈当处理 SRPM 时,系统会使用到的目录。

+++
SRPM 使用的路径与需要的套件 
  
SRPM 既然含有 source code ,那么其中必定有设定档啰,所以首先我们必需要知道,这个 SRPM 在进行编译的时候,会使用到哪些目录呢?***在/usr/src中有每个distribution 提供的目录,如Mandrake 9.0的工作目录为/usr/src/RPM, Red Hat的工作目录为/usr/src/redhat, Openlinux 则是以 /usr/src/openlinux 为工作目录!无论如何,反正就是在 /usr/src 这个目录下就对了!
  
/usr/src/redhat/SPEC --放置的是该套件的设定档,例如这个套件的信息参数、设定项目等等都放置在这里;
/usr/src/redhat/SOURCE --放置的是该套件的原始档(*.tar.gz的档案)以及config 这个设定档;
/usr/src/redhat/BUILD --在编译的过程中,有些暂存的数据都会放置在这个目录当中;
/usr/src/redhat/RPMS --经过编译之后,并且顺利的编译成功之后,将打包完成的档案放置在这个目录当中。里头有包含了 i386, i586, i686, noarch.... 等等的次目录。
/var/tmp --编译的过程当中,发生错误时生成的文件,可以根据该错误档进行除错的工作呢!
 
此外,在编译的过程当中,可能会发生不明的错误,或者是设定的错误,这个时候就会在 /tmp 底下产生一个相对应的错误档,您可以根据该错误档进行除错的工作呢!等到所有的问题都解决之后,也编译成功了,那么刚刚解压缩之后的档案,就是在 /usr/src/redhat/SPEC, SOURCE, BUILD 等等的档案都会被杀掉,而只剩下放置在/usr/src/redhat/RPMS 底下的档案了! 
  
由于 SRPM 需要重新编译,而编译的过程当中,我们至少需要有 make 与其相关的程序,及 gcc, c, c++ 等其它的编译用的程序语言来进行编译,所以,如果您在安装的过程当中没有选取软件开发工具之类的套件,呵呵!得重新拿出你的光盘,然后再安装喔!哈哈!只是得要克服一大堆的属性相依的问题就是了~嗯!还是建议您再次的看一下如何安装吧!

+++
设定档的主要内容
---
刚刚我们在上面提过了,SRPM还可以更改一些设定的内容,那么要如何修改这些设定的内容呢?
我们以简单的 rp-pppoe 这个套件来说明好了,你可以连上 Internet 上面的 rp-pppoe 官方网站下载 SRPM ,或者由以下的方式来下载这个套件(请注意底下的档案是 2004/04 最新的档案数据,有可能在您看到本文时,这个套件已经更新了,所以请直接上底下的网址来下载吧!)。至于基本的过程如下: 
  
1. 下载 SRPM 软件: 
[root@test root]# wget \ 
>
  
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: rp-pppoe-3.5.tar.gz 
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之后,系统就会自动的去检查啦!这就是『相依属性』的主要来源啰!
  
上面几个资料通常都必需要写啦!但是如果你的软件没有相依属性的关系时,那么就可以不需要那个Requires啰!
  
? %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 那个段落,将他修改成您所需要的样子,就可以啰!

+++
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目录之下!3

再来则是要编辑那个很重要的*.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:      
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/SRPM/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         :
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 最麻烦的地方有几点: 

? 反安装: 
Tarball 最麻烦的地方就在于他的『解安装』了!相当的讨厌!如果是简单的直接将所有的套件安装在一个目录下的话,例如/usr/local/mrtg 时,那么解安装还算简单,就是将该路径杀掉就 OK 啦!但是如果是类似 sendmail 这一种呢?他的路径都是已经放置死的( 需要在 /etc/sendmail.cf、/etc/mail 底下 )那么追踪反安装的路径就很烦人;
? 在线查询: 
如果您的安装路径是在 /usr/local 底下的话,那么执行档会被放置到 /usr/local/bin ,或者是 /usr/local/sbin 底下,参数档会放在 /usr/local/etc 底下,在线查询档案会放在 /usr/local/man 底下,所以在设定上面还有查询上面还算简单( 路径设定一下即可! ),不过,如果你是将套件安装在单独的路径下呢?例如 /usr/local/mrtg 底下,那么执行档变成了 /usr/local/mrtg/bin 底下,最麻烦的地方就是 man page ( 在线查询 )放置的地点会变成在/usr/local/mrtg/man 底下了!糟糕!那么预设的 man page 路径就找不到该说明文件啰!这个时候就必须要手动的将该路径加入 /etc/man.conf 这个档案中!而且执行文件放置的路径也没有指定,可以经由 (1)Link 的方式或者 
(2)设定 PATH 环境变量的方式将该路径加进去啦!确实是比较麻烦的啦!

所以说,RPM 与 Tarball 各有其优缺点,不过,如果有 RPM 的话,那么优先权还是在于 RPM 安装上面,毕竟管理上比较便利,但是如果套件的架构差异性太大,或者是无法解决相依属性的问题,那么与其花大把的时间与精力在解决属性相依的问题上,还不如直接以 tarball 来安装,轻松又惬意!

+++
重点回顾 
? RPM 的全名是 Red Hat Package Manager,原本是由 Red Hat 公司所发展的,流传甚广; 
? RPM 类型的套件中,所含有的套件是经过编译后的 binary file ,所以可以直接安装在使用者端( Client )的系统上,不过,也由于如此,所以 RPM 对于安装者的环境要求相当严格; 
? RPM 除了将套件安装至使用者的系统上之外,还会将该套件的版本、名称、档案与目录配置、系统需求等等均记录于数据库( /var/lib/rpm )当中,方便未来的查询与升级、移除; 
? RPM 可针对不同的硬件等级来加以编译,制作出来的档案可于附档名( i386, i586, i686 )来分辨; 
? RPM 最大的问题为套件之间的相依性问题; 
? SRPM 为 Source RPM ,内含的档案为 Source code 而非为 binary file ,所以安装 SRPM 时还需要经过 compile ,不过,SRPM 最大的优点就是可以让使用者自行修改设定参数( makefile/configure 的参数 ),以符合使用者自己的 Linux 环境; 

+++
课后练习 
1. 简单说明 RPM 与 SRPM 的异同? 
2. 查询系统上的 RPM 套件数据时,系统由何处取得该套件的讯息?(/var/lib/rpm/*) 
3. 假设我想要安装一个套件,例如 pkgname.i386.rpm ,但却老是发生无法安装的问题,请问我可以加入哪些参数来强制安装他? 
4. 承上题,您认为强制安装之后,该套件是否可以正常执行?为什么? 
5. 有些人使用 OpenLinux 3.1 Server 安装在自己的 P-166 MMX ,却发现无法安装,在查询了该原版光盘的内容,发现里面的文件名称为 ***.i686.rpm 。请问,无法安装的可能原因为何? 
6. 请问我使用 rpm -Fvh *.rpm 及 rpm -Uvh *.rpm 来升级时,,两者有何不同?
阅读(1793) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~