1. 程式人生 > >RPM包制作之Spec文件詳解

RPM包制作之Spec文件詳解

res name centos7 source orm group ica xsl configure

看這篇文章的人基本都有一個想法,就是:“勞資不想用YUM的安裝!不是版本太低就是文件分布太野路子”,此時我們需要自己訂制軟件包的需求,我們會把一些源碼包按照我們的需求來做成rpm包,其中的Spec文件是制作RPM包的核心。
下面我們以制作NGINX的RPM開始介紹其制作方法。以下操作在CentOS7.4 64位系統進行(切記,不要把7上的文件裝到6上去)。
?

1.1 起手勢 安裝rpm-build

yum -y install rpm-build

?
新建一個新用戶並切換到用戶上(避免權限的問題)、建立工作車間目錄(官網的說法。。。),並寫進環境變量裏。

[root]# useradd devops    #新建用戶
[root]# su - devops       #切換用戶
[devops]$ echo "%_topdir %(echo $HOME)/rpmbuild" >>  ~/.rpmmacros
[devops]$ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

?
註意: 這幾個新建的文件夾必須要求全部大寫!全部大寫!全部大寫!
??
以下為目錄所對應存放文件的解釋:

  • BUILD:源碼解壓以後放的目錄
  • RPMS:制作完成後的rpm包存放目錄
  • SOURCES:存放源文件,配置文件,補丁文件等放置的目錄【常用】
  • SPECS:存放spec文件,作為制作rpm包的文件,即:nginx.spec……【常用】
  • SRPMS:src格式的rpm包目錄
  • BuiltRoot:虛擬安裝目錄,即在整個install的過程中臨時安裝到這個目錄,把這個目錄當作根來用的,所以在這個目錄下的文件,才是真正的目錄文件。最終,Spec文件中最後有清理階段,這個目錄中的內容將被刪除

?

Spec文件的宏定義:

rpmbuild --showrc | grep topdir #工作車間目錄:_topdir /root/rpmbuild
-14: _builddir %{_topdir}/BUILD
-14: _buildrootdir %{_topdir}/BUILDROOT
-14: _rpmdir %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES
-14: _specdir %{_topdir}/SPECS
-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir /root/rpmbuild

?
rpmbuild --showrc顯示所有的宏,以下劃線開頭:

?

  • 一個下劃線:定義環境的使用情況,
  • 二個下劃線:通常定義的是命令,
    為什麽要定義宏,因為不同的系統,命令的存放位置可能不同,所以通過宏的定義找到命令的真正存放位置
    ?

1.2 理解Spec腳本中各個變量

rpm的配置文檔還算是比較有調理性的,按照標準的格式整理一些信息,包括:軟件基礎信息,以及安裝、卸載前後執行的腳本,對源碼包解壓、打補丁、編譯,安裝路徑和文件引用等,其中需要註意的地方為:虛擬路徑的位置,以及宏的定義。
?
spec腳本包括很多關鍵字,主要有:

Name: 軟件包的名稱,在後面的變量中即可使用%{name}的方式引用
Summary: 軟件包的內容
Version: 軟件的實際版本號,例如:1.12.1等,後面可使用%{version}引用
Release: 發布序列號,例如:1%{?dist},標明第幾次打包,後面可使用%{release}引用
Group: 軟件分組,建議使用:Applications/System
License: 軟件授權方式GPLv2
Source: 源碼包,可以帶多個用Source1、Source2等源,後面也可以用%{source1}、%{source2}引用
BuildRoot: 這個是安裝或編譯時使用的臨時目錄,即模擬安裝完以後生成的文件目錄:%_topdir/BUILDROOT 後面可使用$RPM_BUILD_ROOT 方式引用。
URL: 軟件的URI
Vendor: 打包組織或者人員
Patch: 補丁源碼,可使用Patch1、Patch2等標識多個補丁,使用%patch0或%{patch0}引用
Prefix: %{_prefix} 這個主要是為了解決今後安裝rpm包時,並不一定把軟件安裝到rpm中打包的目錄的情況。這樣,必須在這裏定義該標識,並在編寫%install腳本的時候引用,才能實現rpm安裝時重新指定位置的功能
Prefix: %{_sysconfdir} 這個原因和上面的一樣,但由於%{_prefix}指/usr,而對於其他的文件,例如/etc下的配置文件,則需要用%{_sysconfdir}標識
Requires: 該rpm包所依賴的軟件包名稱,可以用>=或<=表示大於或小於某一特定版本,例如:
libxxx-devel >= 1.1.1 openssl-devel 。 註意:“>=”號兩邊需用空格隔開,而不同軟件名稱也用空格分開

%description: 軟件的詳細說明
%define: 預定義的變量,例如定義日誌路徑: _logpath /var/log/weblog
%prep: 預備參數,通常為 %setup -q
%build: 編譯參數 ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx/……
%install: 安裝步驟,此時需要指定安裝路徑,創建編譯時自動生成目錄,復制配置文件至所對應的目錄中(這一步比較重要!)
%pre: 安裝前需要做的任務,如:創建用戶
%post: 安裝後需要做的任務 如:自動啟動的任務
%preun: 卸載前需要做的任務 如:停止任務
%postun: 卸載後需要做的任務 如:刪除用戶,刪除/備份業務數據
%clean: 清除上次編譯生成的臨時文件,就是上文提到的虛擬目錄
%files: 設置文件屬性,包含編譯文件需要生成的目錄、文件以及分配所對應的權限
%changelog: 修改歷史

??

1.3 制作開始RPM包

?

所需要打包的文件都放在如下目錄:

[devops]$ pwd
$HOME/rpmbuild/SOURCES

?
編寫SPEC文件目錄如下:

[devops]$ pwd
$HOME/rpmbuild/SPEC

?
以下為Nginx Spec file的實例:

cat nginx.spec
%define _prefix /usr/local/nginx    //預定義的prefix目錄
%define _logpath /var/log/weblog    //預定義日誌目錄
Name: nginx 
Version: 1.12.1
Release: 1%{?dist}
Summary: The Nginx HTTP and reverse proxy server
Group: Applications/System
License: GPLv2
URL: https://nginx.org
Packager: Atlantis <[email protected]>
Vendor: XXX-XXX
Source0: %{name}-%{version}.tar.gz  //引用的源碼文件
Source1: nginx.conf                 //引用配置文件
Source2: nginx                      //引用System-V風格的Service服務
Source3: nginx.logrotate            //引用日誌輪轉的配置文件
BuildRoot: %_topdir/BUILDROOT       //虛擬根目錄
Requires: libxslt-devel,openssl-devel,pcre-devel    //所依賴的軟件包

%description
NGINX is the heart of the modern web, powering half of the world’s busiest sites and applications. The company‘s comprehensive application delivery platform combines load balancing, content caching, web serving, security controls, and monitoring in one easy-to-use software package.

%prep                               //編譯前準備工作,這裏指定的就是Setup,有條件也可以指定編譯器
%setup -q

%build                              //編譯參數,這個看到這裏的人基本都懂,沒啥講的,最後一個參數可以使用並行編譯: make -j 6
./configure   --user=nginx   --group=nginx   --prefix=%{_prefix}   --http-log-path=%{_logpath}/access.log   --error-log-path=%{_logpath}/error.log   --pid-path=/var/run/nginx.pid   --with-http_dav_module   --with-http_flv_module   --with-http_realip_module       --with-http_addition_module   --with-http_xslt_module   --with-http_sub_module   --with-http_random_index_module   --with-http_degradation_module   --with-http_secure_link_module   --with-http_gzip_static_module   --with-http_ssl_module   --with-http_stub_status_module   --with-pcre   --with-threads   --with-stream   --with-ld-opt=-Wl,-E
make %{?_smp_mflags}

%install                            //安裝步驟
rm -rf %{buildroot}                 //保證虛擬根的幹凈
make install DESTDIR=%{buildroot}   //install 到虛擬根
%{__install} -p -d -m 0755 %{buildroot}%{_logpath}  //定義一個日誌目錄並賦予其權限,這個文件會在編譯時自動生成,因此要聲明
%{__install} -p -D -m 0644 %{SOURCE1} %{buildroot}%{_prefix}/conf/nginx.conf //復制SOURCE1中的文件到虛擬根中
%{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/nginx //復制SOURCE2中的文件到虛擬根中
%{__install} -p -D -m 0644 %{SOURCE3} %{buildroot}%{_prefix}/conf/nginx.logrotate //復制SOURCE3中的文件到虛擬根中

%pre                                //安裝前準備操作
if [ $1 == 1 ]; then                // 這裏的1為安裝;0為卸載
        /usr/sbin/useradd -r nginx -s /sbin/nologin 2> /dev/null
fi

%post                               //安裝後準備操作
if [ $1 == 1 ]; then
        echo "export PATH=/usr/local/nginx/sbin:$PATH" >> /etc/profile
        source /etc/profile
        cp %{_prefix}/conf/nginx.logrotate /etc/logrotate.d/nginx
fi

%preun                              //卸載前準備操作
if [ $1 == 0 ]; then
        /etc/init.d/nginx stop 2>&1 /dev/null
        /usr/sbin/userdel -r nginx 2> /dev/null
fi

%postun
if [ $1 == 0 ]; then                //卸載後準備操作
        rm -f /etc/logrotate.d/nginx
fi

%clean
rm -rf %{buildroot}

%files                              //定義rpm包安裝時創建的相關目錄及文件。在該選項中%defattr (-,root,root)一定要註意。它是指定安裝文件的屬性,分別是(mode,owner,group),-表示默認值,對文本文件是0644,可執行文件是0755。
%defattr(-,root,root,0755)
%{_prefix}
%dir /var/log/weblog
%attr(644,root,root) %{_prefix}/conf/nginx.conf
%attr(755,root,root) /etc/rc.d/init.d/nginx

%changelog
* Fri Feb 22 2019 <XXX@XXX> - 1.12.1-3
- Initial Version
- Update Installtion
- Add Logrotate Feature
- Fix Uninstall Bug With logrotate

# End Of nginx.spec

RPM包制作之Spec文件詳解