本文由秀依林楓提供友情贊助,首發于爛泥行天下
公司服務器比較多,需要把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
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
二、spec規則文件內容詳解
spec文件是整個rpm包制作的核心,它的作用如同源碼編譯程序時的Makefile文件一樣。
spec文件包含建立一個rpm包必要的信息,包括哪些文件是包的一部分以及它們安裝在哪個目錄等等信息。
注意:spec文件必須由普通用戶創建,并且強烈建議使用vi或者vim命令創建。
我們先來創建一個httpd.spec文件,使用vi命令,如下:
vi httpd.spec
whoami
pwd
通過上圖,我們可以很明顯的看出,目前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
--
注意:星期和月一定要使用英文,并且是簡寫的,否則會報錯。如下:
三、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
--
四、生成相關目錄
要生成rpm包的相關目錄,我們可以通過手工創建,也可以通過rpmbuild命令創建。如下:
rpmbuild httpd.spec
注意:在使用rpmbuild生成rpm包的相關目錄時會報錯,這個不需要去管它。
tree rpmbuild/
通過上圖,我們可以很明顯的看到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/
六、生成RPM包
以上配置完畢后,我們現在就開始生成rpm包,使用rpmbuild命令。如下:
rpmbuild -ba rpmbuild/SPECS/httpd.spec
通過上圖,我們可以很明顯的看出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
通過上圖,我們可以很明顯的看出,通過源碼制作的rpm已經正常安裝。
新聞熱點
疑難解答