公司伺服器比較多,需要把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

rpm-build安裝完畢後,我們來檢視rpm-build的rpm包資訊。如下:
cd /var/cache/yum/x86_64/6/updates/packages/
注意:yum安裝軟體預設是安裝完畢立即删除的,但是我們可以通過修改yum.conf檔案使其不删除。
cat /etc/yum.conf
檢視rpm-build的rpm包相關資訊,如:軟體名稱、版本、build日期、功能描述、大小等等。如下:
rpm -qpi rpm-build-4.8.0-38.el6_6.x86_64.rpm
檢視rpm-build的rpm包含安裝的目錄和檔案,如下:
rpm -qpl rpm-build-4.8.0-38.el6_6.x86_64.rpm
檢視rpm-build的rpm包的配置檔案,如果該該rpm包沒有配置檔案的話就不會顯示。
rpm -qpc rpm-build-4.8.0-38.el6_6.x86_64.rpm
檢視rpm-build的rpm包的依賴關系,如下:
rpm -qpr rpm-build-4.8.0-38.el6_6.x86_64.rpm
除此之外,如果想檢視這個檔案屬于哪個rpm 包,我們也可以使用以下指令。如下:
rpm -qf /etc/init.d/iptables
有關rpm指令的詳細使用方法,我們也可以通過man rpm進行檢視。如下:
man rpm
<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
通過上圖,我們可以很明顯的看出,目前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>
<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<[email protected]> 2.2.27
<b>四、生成相關目錄</b><b></b>
要生成rpm包的相關目錄,我們可以通過手工建立,也可以通過rpmbuild指令建立。如下:
rpmbuild httpd.spec
注意:在使用rpmbuild生成rpm包的相關目錄時會報錯,這個不需要去管它。
tree rpmbuild/
通過上圖,我們可以很明顯的看到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/
<b>六、生成</b><b>rpm</b><b>包</b><b></b>
以上配置完畢後,我們現在就開始生成rpm包,使用rpmbuild指令。如下:
rpmbuild -ba rpmbuild/specs/httpd.spec
通過上圖,我們可以很明顯的看出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
通過上圖,我們可以很明顯的看出,通過源碼制作的rpm已經正常安裝。