天天看點

Linux源碼包制作RPM包之Apache

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

<b>一、安裝rpm-build</b>

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

rpm-build通過rpmbuild指令根據本地源碼包,通過spec檔案中的規則就可以把源碼包制作成rpm包。

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

yum -y install rpm-build

Linux源碼包制作RPM包之Apache

rpm-build安裝完畢後,我們來檢視rpm-build的rpm包資訊。如下:

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

Linux源碼包制作RPM包之Apache

注意:yum安裝軟體預設是安裝完畢立即删除的,但是我們可以通過修改yum.conf檔案使其不删除。

cat /etc/yum.conf

Linux源碼包制作RPM包之Apache

檢視rpm-build的rpm包相關資訊,如:軟體名稱、版本、build日期、功能描述、大小等等。如下:

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

Linux源碼包制作RPM包之Apache

檢視rpm-build的rpm包含安裝的目錄和檔案,如下:

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

Linux源碼包制作RPM包之Apache

檢視rpm-build的rpm包的配置檔案,如果該該rpm包沒有配置檔案的話就不會顯示。

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

Linux源碼包制作RPM包之Apache

檢視rpm-build的rpm包的依賴關系,如下:

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

Linux源碼包制作RPM包之Apache

除此之外,如果想檢視這個檔案屬于哪個rpm 包,我們也可以使用以下指令。如下:

rpm -qf /etc/init.d/iptables

Linux源碼包制作RPM包之Apache

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

man rpm

Linux源碼包制作RPM包之Apache

<b>二、</b><b>spec</b><b>規則檔案内容詳解</b><b></b>

spec檔案是整個rpm包制作的核心,它的作用如同源碼編譯程式時的makefile檔案一樣。

spec檔案包含建立一個rpm包必要的資訊,包括哪些檔案是包的一部分以及它們安裝在哪個目錄等等資訊。

<b>注意:spec檔案必須由普通使用者建立,并且強烈建議使用vi或者vim指令建立。</b>

我們先來建立一個httpd.spec檔案,使用vi指令,如下:

vi httpd.spec

whoami

pwd

Linux源碼包制作RPM包之Apache

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

<b>注意:在建立一個spec檔案時,系統會預設建立一個spec檔案模版。隻是該模版是空的,如果沒有填寫内容的話,是無法儲存該檔案的。</b>

下面我們就開始講解spec檔案的相關選項,spec檔案内容一般分為如下幾個部分:

定義rpm包的資訊、定義源碼包、定義rpm包的依賴關系、打包前的工作、編譯并安裝rpm包、安裝之後生成的檔案、安裝前後需要執行的腳本、軟體變更日志

<b>2.1</b><b>定義rpm包的資訊</b><b></b>

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。

<b>2.2</b><b>定義</b><b>源碼包</b><b></b>

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

source0: tbsys-src.tar.gz

source1: tbnet-src.tar.gz

source2: tair-2.1.0-src.tar.gz

<b>注意:</b>

<b>source0</b><b>必須要填寫,而且填寫的名字必須是和下載下傳源碼包名稱要一模一樣,還要注意隻有tar.gz的源碼包,才能制作rpm包。</b>

<b>2.3</b><b>定義rpm包的</b><b>依賴關系</b><b></b>

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

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

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

<b>在這裡要重點說明一點,requires定義所依賴的軟體包,在進行yum安裝時的情況。</b>

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

<b>如果檢查出,a的安裝還要依賴軟體b,那麼此時yum就會自動下載下傳并安裝b。b安裝完畢後,就會繼續安裝a。如果是内網yum源的話,我們隻需要把b放在内網yum源即可。</b>

<b>如果檢查出,a的安裝不需要其他軟體的支援,那麼yum會自動安裝a。</b>

<b>2.4</b><b>編譯并安裝rpm包</b><b></b>

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

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

%install定義安裝軟體包,使用預設值即可。

buildroot定義安裝或編譯時使用的虛拟目錄,建議使用預設值即可。如下:

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

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

<b>2.5</b><b>安裝之後生成的檔案</b><b></b>

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

%files定義rpm包安裝時建立的相關目錄及檔案。

<b>在該選項中%defattr (-,root,root)一定要注意。它是指定安裝檔案的屬性,分别是(mode,owner,group),-表示預設值,對文本檔案是0644,可執行檔案是0755。</b>

<b>2.6</b><b>安裝前後需要執行的腳本</b>

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

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

%preun指定rpm包解除安裝前執行的腳本,該選項主要用于軟體更新的時候會執行。預設spec模版檔案不存在此選項。

%postun指定rpm包解除安裝後執行的腳本。預設spec模版檔案不存在此選項。

<b>2.7</b><b>軟體變更日志</b>

%changelog主要用于軟體的變更日志。該選項可有可無。

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

* 星期 月 日 年 xxx

示例為:

* tue mar 03 2015 ilanni2.2.27

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

Linux源碼包制作RPM包之Apache

<b>三、httpd.spec檔案示例</b>

下面就以系統提供的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

%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&lt;[email protected]&gt; 2.2.27

Linux源碼包制作RPM包之Apache

<b>四、生成相關目錄</b><b></b>

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

rpmbuild httpd.spec

Linux源碼包制作RPM包之Apache

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

tree rpmbuild/

Linux源碼包制作RPM包之Apache

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

每個目錄的作用,如下:

build用于存放解壓後的檔案。

buildroot用安裝或編譯時使用的虛拟目錄。

rpms用于存放由rpmbuild制作好的二進制包。

sources用于存放源代碼、更新檔、圖示等檔案。

specs用于存放用于管理rpm制作程序的spec檔案。

srpms用于存放由rpmbuild制作好的源碼包。

<b>五、把檔案拷貝到指定目錄</b><b></b>

相關目錄建立完畢後,現在我們需要把相關apache的源碼檔案以及spec檔案複制指定的目錄。如下:

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

cp httpd.spec rpmbuild/specs/

Linux源碼包制作RPM包之Apache

<b>六、生成</b><b>rpm</b><b>包</b><b></b>

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

rpmbuild -ba rpmbuild/specs/httpd.spec

Linux源碼包制作RPM包之Apache
Linux源碼包制作RPM包之Apache

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

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

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

<b>七、測試生成</b><b>rpm</b><b>包</b><b></b>

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

Linux源碼包制作RPM包之Apache

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