在上一节当中,我们介绍了 RPM 这个既可爱又可恨的家伙,RPM 的可爱在于他的数据库管理方式,很容易去查询与升级,而他的可恨呢?呵呵!就是在于他的 binary 的档案不能再改变他的原始设定内容 ( 就是 *.rpm 的档案不能再重新编译的意思 ),与套件及套件之间的属性相依的问题~还真是伤脑筋吶!
没有关系,现在有解决的方法了!我们可以利用『含有 source code 的 SRPM 』来重新编译 *.rpm 的档案成为我们所希望的样式了!就因为在 SRPM 里面含有的不是 binary 的档案,而是含有 source code ,因此 SRPM 是不能直接拿来安装成为可执行的档案的。必需要将他重新编译,并且打包成为类似 i386, i586, i686 等等 RPM 的档案之后,才能够安装在我们的系统当中哩!这个时候你就应该会想象啦,咦!既然如此的话,那么在编译的过程当中,我们是否可以加入其它的设定参数,来让我们的 SRPM 可以依照我的想法来编译呢!?哈哈!答对了!所以呢,这个时候我们就要来修改别人的 SRPM 以及编译自己的套件啦!
不过这里需要特别留意的就是,因为 SRPM 需要重新编译,而编译的过程当中,我们至少需要有 make 与其相关的程序,及 gcc, c, c++ 等其它的编译用的程序语言来进行编译,所以,如果您在安装的过程当中没有选取软件开发工具之类的套件,呵呵!得重新拿出你的光盘,然后再安装喔!哈哈!只 是得要克服一大堆的属性相依的问题就是了~嗯!还是建议您再次的看一下如何安装吧!
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 里头去看一看呦:
- /usr/src/redhat/SPEC:这个目录当中放置的是该套件的设定档,例如这个套件的信息参数、设定项目等等都放置在这里;
- /usr/src/redhat/SOURCE:这个目录当中放置的是该套件的原始档(*.tar.gz的档案)以及 config 这个设定档;
- /usr/src/redhat/BUILD:在编译的过程中,有些暂存的数据都会放置在这个目录当中;
此外,在编译的过程当中,可能会发生不明的错误,或者是设定的错误,这个时候就会在 /tmp 底下产生一个相对应的错误档,您可以根据该错误档进行除错的工作呢!等到所有的问题都解决之后,也编译成功了,那么刚刚解压缩之后的档案,就是在 /usr/src/redhat/SPEC, SOURCE, BUILD 等等的档案都会被杀掉,而只剩下放置在 /usr/src/redhat/RPMS 底下的档案了!
- /usr/src/redhat/RPMS:经过编译之后,并且顺利的编译成功之后,将打包完成的档案放置在这个目录当中。里头有包含了 i386, i586, i686, noarch.... 等等的次目录。
刚刚我们在上面提过了,SRPM还可以更改一些设定的内容,那么要如何修改这些设定的内容呢?我们以简单的 rp-pppoe 这个套件来说明好了,你可以连上 Internet 上面的 rp-pppoe 官方网站下载 SRPM ,或者由以下的方式来下载这个套件(请注意底下的档案是 2002/11 最新的档案数据,有可能在您看到本文时,这个套件已经更新了,所以请直接上底下的网址来下载吧!http://www.roaringpenguin.com/pppoe/)。至于基本的过程如下:
1. 下载 SRPM 软件:
[root @test root]# wget http://www.roaringpenguin.com/pppoe/rp-pppoe-3.5-1.src.rpm2. 将 SRPM 解开在/usr/src/redhat 底下的目录当中
[root @test root]# rpm –i rp-pppoe-3.5-1.src.rpm3. 观察一下有哪些原始码呢?
[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的设定文件,他的基本规则可以这样看:我们来谈一谈几个常见的SRPM设定段落:
- 整个档案的开头以Summary为开始,这部份的设定都是最基础的说明内容;
- 然后每个不同的段落之间,都以%来做为开头,例如%prep与%install等;
上面几个资料通常都必需要写啦!但是如果你的软件没有相依属性的关系时,那么就可以不需要那个Requires啰!
- 系统整体信息方面:
- Summary:主要的套件说明,例如上表中,我们说明了他是ppp的拨接用途啦!
- Name:这个就是套件的名称;
- Version:这个是套件的版本信息;
- Release:这个是该版本打包的次数说明,在Mandrake里面,会自动的帮你设定打包的次数喔!就是1mdk那个咚咚;
- Copyright:这个套件的授权模式,我们是使用GPL啦!
- Group:这个套件的发展团体名称;
- Source:这个套件的来源,如果是网络上下载的套件,通常一定会有这个信息来告诉大家这个原始档的来源!
- Url:这个原始码的主要官方网站; Packager:这个套件是经由谁来打包的呢?
- Vender:发展的厂商哪;
- ExclusiveArch:这个是说明这个套件的适合安装的硬件,通常预设为i386,当然,你也可以调整为i586啦等等的!
- Requires:如果你这个套件还需要其它的套件的支持,那么这里就必需写上来,则当你制作成RPM之后,系统就会自动的去检查啦!这就是『相依属性』的主要来源啰!
- %description
将您的套件做一个简短的说明!这个也是必需要的。
- %prep
这部份的设定在于『尚未进行设定或安装之前,你要编译完成的RPM帮你事先做的事情』,就是prepare的简写啰!那么他的工作事项主要有:
- 寻找套件所需要的目录是否已经存在?确认用的!
- 事先建立您的套件所需要的目录,或者事先需要进行的任务;
- 如果待安装的Linux系统内已经有安装的时候可能会被覆盖掉的档案时,那么就必需要进行备份(backup)的工作了!
大致的工作就是这些啦!
- %setup
这个段落就是在建立我们在Tarball当中说明的那个Makefile档案啦!所以呢,当然就是执行./config之类的设定档案啰!那么如果你要自己新增自己的参数,就可以在这个地方加入你的设定值!如果你的软件本身没有这方面的需要,里面就不需要编写内容啰!
- %build
build就是建立啊!所以当然啰,这个段落就是在谈怎么make编译成为可执行的程序啰!
- %install
编译完成(build)之后,就是要安装啦!安装就是写在这里,也就是类似Tarball里面的make install的意思啰!
- %files
这个套件安装的档案都需要写到这里来,当然包括了『目录』喔!所以连同目录请一起写到这个段落当中!以备查验呢!^_^好了,那么如果您有自订的信息想要加入的话,就选择你要加入的那个段落,将他修改一下吧!例如,如果你在设定Makefile的时候,希望能够多一些额外的参数设定,那么就找到 %setup 那个段落,将他修改成您所需要的样子,就可以啰!
- %changelog
这个主要则是在记录这个套件曾经的更新纪录啰!
再来呢?嗯!没错,修改完成了,自然就是要将他编译成可以安装的RPM档案啦!这个时候我们就可以直接在/usr/src/redhat/SPECS底下下达:
[root @test SPECS]# rpm -bb rp-pppoe.spec <==编译成RPM档案
[root @test SPECS]# rpm -ba rp-pppoe.spec <==打包成SRPM档案
这个时候系统就会这样做:整个步骤大概就是这样子!最后的结果数据会放置在RPMS那个目录底下就对啦!
- 先进入到BUILD这个目录中,在Mandrake 9.0当中就是/usr/src/RPM/BUILD,在Red Hat底下就是/usr/src/redhat/BUILD这个目录;
- 依照*.spec档案内的Name与Version设定定义出工作的目录名称,以我们上面的例子为例,那么系统就会在BUILD目录中先删除rp-pppoe-3.5的目录,再重新建立一个rp-pppoe-3.5的目录,并进入该目录;
- 在新建的目录里面,针对SOURCES目录下的来源档案,也就是*.spec里面的Source设定的那个档案,以tar进行解压缩,以我们这个例子来 说,则会在/usr/src/redhat/BUILD/rp-pppoe-3.5当中,将/usr/src/redhat/SOURCES/rp- pppoe-3.5.tar.gz进行解压缩啦!
- 然后就开始%setup的工作;
- 再来开始%build及%install的设定与编译!
- 最后将完成打包的档案给他放置到该放置的地方去,如果你的规定的硬件是在i386的系统,那么最后编译成功的*.i386.rpm档案就会被放置在 /usr/src/RPM/RPMS/i386里面啰!如果是i586那么自然就是/usr/src/redhat/RPMS/i586目录下啰!
这个就有趣了!我们自己来编辑一下自己制作的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 <==这个就是刚刚建立起来的 arball档案!
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]# rpm -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的来源档内容啰!