爛泥:Linux源碼包製作RPM包之Apache

本文首發於爛泥行天下

公司服務器比較多,需要把apache源碼包製作成rpm包,然後放到公司內網yum源上進行下載安裝。apache的rpm包安裝方式比源碼安裝方式比較快,這能節約不少的時間。

有關內網yum源的搭建,可以參考《爛泥:yum的使用及配置》這篇文章。

一、安裝rpm-build

查閱相關資料得知,要把源碼包製作成rpm包需要使用rpm打包工具rpm-build。

rpm-build通過rpmbuild命令根據本地源碼包,通過spec文件中的規則就可以把源碼包製作成rpm包。

現在我們來安裝rpm-build包,如下:

yum -y install rpm-build

clip_p_w_picpath001

rpm-build安裝完畢後,我們來查看rpm-build的rpm包信息。如下:

cd /var/cache/yum/x86_64/6/updates/packages/

clip_p_w_picpath002

注意:yum安裝軟件默認是安裝完畢立即刪除的,但是我們可以通過修改yum.conf文件使其不刪除。

cat /etc/yum.conf

clip_p_w_picpath003

查看rpm-build的rpm包相關信息,如:軟件名稱、版本、build日期、功能描述、大小等等。如下:

rpm -qpi rpm-build-4.8.0-38.el6_6.x86_64.rpm

clip_p_w_picpath004

查看rpm-build的rpm包含安裝的目錄和文件,如下:

rpm -qpl rpm-build-4.8.0-38.el6_6.x86_64.rpm

clip_p_w_picpath005

查看rpm-build的rpm包的配置文件,如果該該rpm包沒有配置文件的話就不會顯示。

rpm -qpc rpm-build-4.8.0-38.el6_6.x86_64.rpm

clip_p_w_picpath006

查看rpm-build的rpm包的依賴關係,如下:

rpm -qpR rpm-build-4.8.0-38.el6_6.x86_64.rpm

clip_p_w_picpath007

除此之外,如果想查看這個文件屬於哪個rpm 包,我們也可以使用以下命令。如下:

rpm -qf /etc/init.d/iptables

clip_p_w_picpath008

有關rpm命令的詳細使用方法,我們也可以通過man rpm進行查看。如下:

man rpm

clip_p_w_picpath009

二、spec規則文件內容詳解

spec文件是整個rpm包製作的核心,它的作用如同源碼編譯程序時的Makefile文件一樣。

spec文件包含建立一個rpm包必要的信息,包括哪些文件是包的一部分以及它們安裝在哪個目錄等等信息。

注意:spec文件必須由普通用戶創建,並且強烈建議使用vi或者vim命令創建。

我們先來創建一個httpd.spec文件,使用vi命令,如下:

vi httpd.spec

whoami

pwd

clip_p_w_picpath010

通過上圖,我們可以很明顯的看出,目前httpd.spec文件中已經有spec文件的選項。我們所需要做的就是根據這些選項來填寫該spec文件,填寫完畢後保存即可。

注意:在新建一個spec文件時,系統會默認創建一個spec文件模版。只是該模版是空的,如果沒有填寫內容的話,是無法保存該文件的。

下面我們就開始講解spec文件的相關選項,spec文件內容一般分爲如下幾個部分:

定義rpm包的信息、定義源碼包、定義rpm包的依賴關係、打包前的工作、編譯並安裝rpm包、安裝之後生成的文件、安裝前後需要執行的腳本、軟件變更日誌

2.1定義rpm包的信息

rpm包信息,主要定義用戶查詢rpm包信息時所顯示的內容。它包含rpm包的功能描述、軟件版本、版權信息和軟件授權類型等等。

詳細信息如下:

Name定義該rpm包的名字,必須要填寫。

Version定義該rpm包的版本號,建議和源碼包的名稱保持一致。

Release定義rpm本身的版本號,使用默認值即可。

Summary定義關於該rpm包的一些介紹。

%description定義關於該rpm包的一些描述信息。

Group標識軟件包所屬類型。

License軟件授權類型,比如GPL、Commercial、Shareware。

URL定義軟件作者的主頁。

rpm包信息中最重要的是NVR,也就是name、version、release。因爲最後生成的rpm包的名稱就是根據這三項來的。

rpm名稱形式,如下:name-version-release.rpm。

2.2定義源碼包

Source0用來定義製作rpm包時所需要的源碼包。如果製作rpm包時,有多個源碼包,那麼使用source和數字混合,比如:

source0: tbsys-src.tar.gz

source1: tbnet-src.tar.gz

source2: tair-2.1.0-src.tar.gz

注意:

Source0必須要填寫,而且填寫的名字必須是和下載源碼包名稱要一模一樣,還要注意只有tar.gz的源碼包,才能製作rpm包。

2.3定義rpm包的依賴關係

rpm包在製作過程中會依賴基本庫,而rpm包在安裝時有時也需要其他軟件包。這些我們都可以通過以下選項進行控制。

BuildRequires定義製作rpm包時,所依賴的基本庫。該選項可有可無。

Requires定義安裝該rpm包時,所依賴的軟件包。該選項可有可無。

注意:

在這裏要重點說明一點,Requires定義所依賴的軟件包,在進行yum安裝時的情況。

我們在使用yum安裝軟件A時,yum會在下載完A的rpm包後,對該rpm包進行檢查(rpm包中會給出安裝該rpm包安裝時,所依賴的基礎庫和軟件)。

如果檢查出,A的安裝還要依賴軟件B,那麼此時yum就會自動下載並安裝B。B安裝完畢後,就會繼續安裝A。如果是內網yum源的話,我們只需要把B放在內網yum源即可。

如果檢查出,A的安裝不需要其他軟件的支持,那麼yum會自動安裝A。

2.4編譯並安裝rpm包

這一步是非常重要,類似與源碼安裝的的./configure、make、make install。主要包括%build、%install等選項。如下:

%build定義編譯軟件包時的操作

%install定義安裝軟件包,使用默認值即可。

BuildRoot定義安裝或編譯時使用的虛擬目錄,建議使用默認值即可。如下:

%(mktemp-ud%{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

該參數非常重要,因爲在生成rpm包的過程中,執行make install時就會把軟件安裝到上述的路徑中。在打包的時候,同樣依賴虛擬目錄爲根目錄進行操作。

2.5安裝之後生成的文件

rpm包在進行安裝時,會創建相關的目錄及文件,我們就可以在此定義。

%files定義rpm包安裝時創建的相關目錄及文件。

在該選項中%defattr (-,root,root)一定要注意。它是指定安裝文件的屬性,分別是(mode,owner,group),-表示默認值,對文本文件是0644,可執行文件是0755。

2.6安裝前後需要執行的腳本

%prep指定rpm包安裝前執行的腳本。在對軟件進行打包前,我們還進行其他操作。比如解壓tar.gz文件。%prep主要與%setup –q命令配合使用,建議使用默認值即可。

%post指定rpm包安裝後執行的腳本。我們在安裝完畢rpm包後,執行軟件初始化的動作,就可以通過%post來達到目的。比如:apache在安裝後,將apachectl拷貝成httpd等操作。默認spec模版文件不存在此選項。

%preun指定rpm包卸載前執行的腳本,該選項主要用於軟件升級的時候會執行。默認spec模版文件不存在此選項。

%postun指定rpm包卸載後執行的腳本。默認spec模版文件不存在此選項。

2.7軟件變更日誌

%changelog主要用於軟件的變更日誌。該選項可有可無。

如果使用%changelog選項的話,一定要以*開頭,以- -結尾。時間格式爲,如下:

* 星期 月 日 年 XXX

--

示例爲:

* Tue Mar 03 2015 ilanni2.2.27

--

注意:星期和月一定要使用英文,並且是簡寫的,否則會報錯。如下:

clip_p_w_picpath011

三、httpd.spec文件示例

下面就以系統提供的spec文件爲模版,把apache源碼包製作成rpm包。apache的spec文件如下:

Name: httpd

Version: 2.2.27

Release: 1%{?dist}

Summary: compiled from 2.2.27 by ilanni

Group: System Environment/Daemons

License: GPL

URL: http://www.ilanni.com

Source0: httpd-2.2.27.tar.gz

BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

BuildRequires: gcc, gcc-c++, openssl-devel

%description

Apache web server. Compiled from 2.2.27 by ilanni

%prep

%setup -q

%build

./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-cgi --enable-ssl --enable-charset-lite --enable-suexec --with-suexec-caller=daemon --with-suexec-docroot=/usr/local/httpd/htdocs

make %{?_smp_mflags}

%install

rm -rf %{buildroot}

make install DESTDIR=%{buildroot}

%clean

rm -rf %{buildroot}

%files

%defattr(-,root,root,-)

/usr/local/httpd/bin/*

/usr/local/httpd/build/*

/usr/local/httpd/cgi-bin/*

%config /usr/local/httpd/conf/*

/usr/local/httpd/error/*

/usr/local/httpd/htdocs/*

/usr/local/httpd/icons/*

/usr/local/httpd/include/*

/usr/local/httpd/lib/*

%dir /usr/local/httpd/logs

%doc /usr/local/httpd/man/*

%doc /usr/local/httpd/manual/*

/usr/local/httpd/modules/*

%post

cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd

sed -i '1a # chkconfig: 2345 85 15' /etc/init.d/httpd

sed -i '2a # description: apache web server' /etc/init.d/httpd

chkconfig --add httpd

%preun

/etc/init.d/httpd stop

chkconfig --del httpd

%changelog

* Tue Mar 3 2015 ilanni<[email protected]> 2.2.27

--

clip_p_w_picpath012

四、生成相關目錄

要生成rpm包的相關目錄,我們可以通過手工創建,也可以通過rpmbuild命令創建。如下:

rpmbuild httpd.spec

clip_p_w_picpath013

注意:在使用rpmbuild生成rpm包的相關目錄時會報錯,這個不需要去管它。

tree rpmbuild/

clip_p_w_picpath014

通過上圖,我們可以很明顯的看到rpmbulid命令已經生成相關的目錄。

每個目錄的作用,如下:

BUILD用於存放解壓後的文件。

BUILDROOT用安裝或編譯時使用的虛擬目錄。

RPMS用於存放由rpmbuild製作好的二進制包。

SOURCES用於存放源代碼、補丁、圖標等文件。

SPECS用於存放用於管理rpm製作進程的spec文件。

SRPMS用於存放由rpmbuild製作好的源碼包。

五、把文件拷貝到指定目錄

相關目錄創建完畢後,現在我們需要把相關apache的源碼文件以及spec文件複製指定的目錄。如下:

cp httpd-2.2.27.tar.gz rpmbuild/SOURCES/

cp httpd.spec rpmbuild/SPECS/

clip_p_w_picpath015

六、生成RPM

以上配置完畢後,我們現在就開始生成rpm包,使用rpmbuild命令。如下:

rpmbuild -ba rpmbuild/SPECS/httpd.spec

clip_p_w_picpath016

clip_p_w_picpath017

通過上圖,我們可以很明顯的看出rpm包已經製作成功。

新生成的rpm包存放在rpmbuild/RPMS/目錄下,而源碼rpm包則存放在rpmbuild/SRPMS/目錄下。

注意:rpmbuild –ba命令的意思是編譯後做成*.rpm包和src.rpm包。

七、測試生成RPM

rpm包製作完成後,我們來測試該rpm包。如下:

cp /home/ilanni/rpmbuild/RPMS/x86_64/httpd-2.2.27-1.el6.x86_64.rpm ./

rpm -ivh httpd-2.2.27-1.el6.x86_64.rpm

clip_p_w_picpath018

通過上圖,我們可以很明顯的看出,通過源碼製作的rpm已經正常安裝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章