本文由秀依林楓提供友情贊助,首發(fā)于爛泥行天下
公司服務(wù)器比較多,需要把a(bǔ)pache源碼包制作成rpm包,然后放到公司內(nèi)網(wǎng)yum源上進(jìn)行下載安裝。apache的rpm包安裝方式比源碼安裝方式比較快,這能節(jié)約不少的時(shí)間。
有關(guān)內(nèi)網(wǎng)yum源的搭建,可以參考《爛泥:yum的使用及配置》這篇文章。
一、安裝rpm-build
查閱相關(guān)資料得知,要把源碼包制作成rpm包需要使用rpm打包工具rpm-build。
rpm-build通過(guò)rpmbuild命令根據(jù)本地源碼包,通過(guò)spec文件中的規(guī)則就可以把源碼包制作成rpm包。
現(xiàn)在我們來(lái)安裝rpm-build包,如下:
yum -y install rpm-build

rpm-build安裝完畢后,我們來(lái)查看rpm-build的rpm包信息。如下:
cd /var/cache/yum/x86_64/6/updates/packages/

注意:yum安裝軟件默認(rèn)是安裝完畢立即刪除的,但是我們可以通過(guò)修改yum.conf文件使其不刪除。
cat /etc/yum.conf

查看rpm-build的rpm包相關(guān)信息,如:軟件名稱、版本、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包沒(méi)有配置文件的話就不會(huì)顯示。
rpm -qpc rpm-build-4.8.0-38.el6_6.x86_64.rpm

查看rpm-build的rpm包的依賴關(guān)系,如下:
rpm -qPR rpm-build-4.8.0-38.el6_6.x86_64.rpm

除此之外,如果想查看這個(gè)文件屬于哪個(gè)rpm 包,我們也可以使用以下命令。如下:
rpm -qf /etc/init.d/iptables

有關(guān)rpm命令的詳細(xì)使用方法,我們也可以通過(guò)man rpm進(jìn)行查看。如下:
man rpm

二、spec規(guī)則文件內(nèi)容詳解
spec文件是整個(gè)rpm包制作的核心,它的作用如同源碼編譯程序時(shí)的Makefile文件一樣。
spec文件包含建立一個(gè)rpm包必要的信息,包括哪些文件是包的一部分以及它們安裝在哪個(gè)目錄等等信息。
注意:spec文件必須由普通用戶創(chuàng)建,并且強(qiáng)烈建議使用vi或者vim命令創(chuàng)建。
我們先來(lái)創(chuàng)建一個(gè)httpd.spec文件,使用vi命令,如下:
vi httpd.spec
whoami
pwd

通過(guò)上圖,我們可以很明顯的看出,目前httpd.spec文件中已經(jīng)有spec文件的選項(xiàng)。我們所需要做的就是根據(jù)這些選項(xiàng)來(lái)填寫該spec文件,填寫完畢后保存即可。
注意:在新建一個(gè)spec文件時(shí),系統(tǒng)會(huì)默認(rèn)創(chuàng)建一個(gè)spec文件模版。只是該模版是空的,如果沒(méi)有填寫內(nèi)容的話,是無(wú)法保存該文件的。
下面我們就開(kāi)始講解spec文件的相關(guān)選項(xiàng),spec文件內(nèi)容一般分為如下幾個(gè)部分:
定義rpm包的信息、定義源碼包、定義rpm包的依賴關(guān)系、打包前的工作、編譯并安裝rpm包、安裝之后生成的文件、安裝前后需要執(zhí)行的腳本、軟件變更日志
2.1定義rpm包的信息
rpm包信息,主要定義用戶查詢r(jià)pm包信息時(shí)所顯示的內(nèi)容。它包含rpm包的功能描述、軟件版本、版權(quán)信息和軟件授權(quán)類型等等。
詳細(xì)信息如下:
Name定義該rpm包的名字,必須要填寫。
Version定義該rpm包的版本號(hào),建議和源碼包的名稱保持一致。
Release定義rpm本身的版本號(hào),使用默認(rèn)值即可。
Summary定義關(guān)于該rpm包的一些介紹。
%description定義關(guān)于該rpm包的一些描述信息。
Group標(biāo)識(shí)軟件包所屬類型。
License軟件授權(quán)類型,比如GPL、Commercial、Shareware。
URL定義軟件作者的主頁(yè)。
rpm包信息中最重要的是NVR,也就是name、version、release。因?yàn)樽詈笊傻膔pm包的名稱就是根據(jù)這三項(xiàng)來(lái)的。
rpm名稱形式,如下:name-version-release.rpm。
2.2定義源碼包
Source0用來(lái)定義制作rpm包時(shí)所需要的源碼包。如果制作rpm包時(shí),有多個(gè)源碼包,那么使用source和數(shù)字混合,比如:
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包的依賴關(guān)系
rpm包在制作過(guò)程中會(huì)依賴基本庫(kù),而rpm包在安裝時(shí)有時(shí)也需要其他軟件包。這些我們都可以通過(guò)以下選項(xiàng)進(jìn)行控制。
BuildRequires定義制作rpm包時(shí),所依賴的基本庫(kù)。該選項(xiàng)可有可無(wú)。
Requires定義安裝該rpm包時(shí),所依賴的軟件包。該選項(xiàng)可有可無(wú)。
注意:
在這里要重點(diǎn)說(shuō)明一點(diǎn),Requires定義所依賴的軟件包,在進(jìn)行yum安裝時(shí)的情況。
我們?cè)谑褂脃um安裝軟件A時(shí),yum會(huì)在下載完A的rpm包后,對(duì)該rpm包進(jìn)行檢查(rpm包中會(huì)給出安裝該rpm包安裝時(shí),所依賴的基礎(chǔ)庫(kù)和軟件)。
如果檢查出,A的安裝還要依賴軟件B,那么此時(shí)yum就會(huì)自動(dòng)下載并安裝B。B安裝完畢后,就會(huì)繼續(xù)安裝A。如果是內(nèi)網(wǎng)yum源的話,我們只需要把B放在內(nèi)網(wǎng)yum源即可。
如果檢查出,A的安裝不需要其他軟件的支持,那么yum會(huì)自動(dòng)安裝A。
2.4編譯并安裝rpm包
這一步是非常重要,類似與源碼安裝的的./configure、make、make install。主要包括%build、%install等選項(xiàng)。如下:
%build定義編譯軟件包時(shí)的操作
%install定義安裝軟件包,使用默認(rèn)值即可。
BuildRoot定義安裝或編譯時(shí)使用的虛擬目錄,建議使用默認(rèn)值即可。如下:
%(mktemp-ud%{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
該參數(shù)非常重要,因?yàn)樵谏蓃pm包的過(guò)程中,執(zhí)行make install時(shí)就會(huì)把軟件安裝到上述的路徑中。在打包的時(shí)候,同樣依賴虛擬目錄為根目錄進(jìn)行操作。
2.5安裝之后生成的文件
rpm包在進(jìn)行安裝時(shí),會(huì)創(chuàng)建相關(guān)的目錄及文件,我們就可以在此定義。
%files定義rpm包安裝時(shí)創(chuàng)建的相關(guān)目錄及文件。
在該選項(xiàng)中%defattr (-,root,root)一定要注意。它是指定安裝文件的屬性,分別是(mode,owner,group),-表示默認(rèn)值,對(duì)文本文件是0644,可執(zhí)行文件是0755。
2.6安裝前后需要執(zhí)行的腳本
%prep指定rpm包安裝前執(zhí)行的腳本。在對(duì)軟件進(jìn)行打包前,我們還進(jìn)行其他操作。比如解壓tar.gz文件。%prep主要與%setup –q命令配合使用,建議使用默認(rèn)值即可。
%post指定rpm包安裝后執(zhí)行的腳本。我們?cè)诎惭b完畢rpm包后,執(zhí)行軟件初始化的動(dòng)作,就可以通過(guò)%post來(lái)達(dá)到目的。比如:apache在安裝后,將apachectl拷貝成httpd等操作。默認(rèn)spec模版文件不存在此選項(xiàng)。
%preun指定rpm包卸載前執(zhí)行的腳本,該選項(xiàng)主要用于軟件升級(jí)的時(shí)候會(huì)執(zhí)行。默認(rèn)spec模版文件不存在此選項(xiàng)。
%postun指定rpm包卸載后執(zhí)行的腳本。默認(rèn)spec模版文件不存在此選項(xiàng)。
2.7軟件變更日志
%changelog主要用于軟件的變更日志。該選項(xiàng)可有可無(wú)。
如果使用%changelog選項(xiàng)的話,一定要以*開(kāi)頭,以- -結(jié)尾。時(shí)間格式為,如下:
* 星期 月 日 年 XXX
--
示例為:
* Tue Mar 03 2015 ilanni2.2.27
--
注意:星期和月一定要使用英文,并且是簡(jiǎn)寫的,否則會(huì)報(bào)錯(cuò)。如下:

三、httpd.spec文件示例
下面就以系統(tǒng)提供的spec文件為模版,把a(bǔ)pache源碼包制作成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<ilanni@ilanni.com> 2.2.27
--

四、生成相關(guān)目錄
要生成rpm包的相關(guān)目錄,我們可以通過(guò)手工創(chuàng)建,也可以通過(guò)rpmbuild命令創(chuàng)建。如下:
rpmbuild httpd.spec

注意:在使用rpmbuild生成rpm包的相關(guān)目錄時(shí)會(huì)報(bào)錯(cuò),這個(gè)不需要去管它。
tree rpmbuild/

通過(guò)上圖,我們可以很明顯的看到rpmbulid命令已經(jīng)生成相關(guān)的目錄。
每個(gè)目錄的作用,如下:
BUILD用于存放解壓后的文件。
BUILDROOT用安裝或編譯時(shí)使用的虛擬目錄。
RPMS用于存放由rpmbuild制作好的二進(jìn)制包。
SOURCES用于存放源代碼、補(bǔ)丁、圖標(biāo)等文件。
SPECS用于存放用于管理rpm制作進(jìn)程的spec文件。
SRPMS用于存放由rpmbuild制作好的源碼包。
五、把文件拷貝到指定目錄
相關(guān)目錄創(chuàng)建完畢后,現(xiàn)在我們需要把相關(guān)apache的源碼文件以及spec文件復(fù)制指定的目錄。如下:
cp httpd-2.2.27.tar.gz rpmbuild/SOURCES/
cp httpd.spec rpmbuild/SPECS/

六、生成RPM包
以上配置完畢后,我們現(xiàn)在就開(kāi)始生成rpm包,使用rpmbuild命令。如下:
rpmbuild -ba rpmbuild/SPECS/httpd.spec


通過(guò)上圖,我們可以很明顯的看出rpm包已經(jīng)制作成功。
新生成的rpm包存放在rpmbuild/RPMS/目錄下,而源碼rpm包則存放在rpmbuild/SRPMS/目錄下。
注意:rpmbuild –ba命令的意思是編譯后做成*.rpm包和src.rpm包。
七、測(cè)試生成RPM包
rpm包制作完成后,我們來(lái)測(cè)試該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

通過(guò)上圖,我們可以很明顯的看出,通過(guò)源碼制作的rpm已經(jīng)正常安裝。
新聞熱點(diǎn)
疑難解答
圖片精選