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 来升级时,,两者有何不同?