Linux 基礎學習篇 - Mandrake 9

第十八章、動手製作 SRPM - for Mandrake 9

鳥哥的第一本書籍的主要內容,內容稍微與書籍不太一樣了!

最近更新時間: 2003/02/11

鳥哥的第一本書大約是在 2002 年的年底左右出版的,內容幾乎都是 Linux 基礎學習,一點也沒有談到伺服器的部份!這也是後來的雛型! 不過內容錯誤的地方很多,導致在 2003 年的年底推出了『基礎學習篇增訂版』的內容,大致上就是處理掉一些比較有嚴重錯誤的部份。 不過,因為 Linux 的版本變化非常快速,因此,寫完了這些文件之後,鳥哥還是持續在網站上更新文件內容,導致原本書籍內容的資料與網站資料差異太大! 這個問題直到鳥哥在 2008 年左右才發現!糟糕了!舊版的文件資料已經遺失~覺得相當扼腕~

因此,在底下的文件內容與當初的書籍內容雖然大同小異,不過章節的編排卻是有所不同!再花時間去一個一個處理,似乎也不太符合成本效益! 鳥哥僅是想要將自己以前的文件記錄下來而已,同時將過時的 big5 編碼改回 utf8 編碼,再加上可以支援 RWD 的樣式而已啦! 內容已經不多做編排~因此,如果內容文件你看不懂,那也是應該的! ^_^

建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。最新文章請前往鳥站首頁查閱囉!

SRPM 需要的套件:

在上一節當中,我們介紹了 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 使用到的目錄:

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:在編譯的過程中,有些暫存的資料都會放置在這個目錄當中;
  • /usr/src/redhat/RPMS:經過編譯之後,並且順利的編譯成功之後,將打包完成的檔案放置在這個目錄當中。裡頭有包含了 i386, i586, i686, noarch.... 等等的次目錄。
此外,在編譯的過程當中,可能會發生不明的錯誤,或者是設定的錯誤,這個時候就會在 /tmp 底下產生一個相對應的錯誤檔,您可以根據該錯誤檔進行除錯的工作呢!等到所有的問題都解決之後,也編譯成功了,那麼剛剛解壓縮之後的檔案,就是在 /usr/src/redhat/SPEC, SOURCE, BUILD 等等的檔案都會被殺掉,而只剩下放置在 /usr/src/redhat/RPMS 底下的檔案了!

設定檔的主要內容:

剛剛我們在上面提過了,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.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設定段落:
  • 系統整體資訊方面:

  •  
    • 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]# rpm -bb rp-pppoe.spec  <==編譯成RPM檔案
[root @test SPECS]# rpm -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   <==這個就是剛剛建立起來的 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的來源檔內容囉!
修改歷史:
  • 2002/12/04:第一次完成
  • 2003/02/11:重新編排與加入 FAQ
  • 2004/04/19:本網頁已不再繼續維護更新,請參考:RPM 與 SRPM 套件管理員
伺服器篇文件
各版本彙整說明
CentOS 6.x