在上一節當中,我們介紹了 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的來源檔內容囉!