首頁 > 軟體

RPM包製作之Spec檔案引數詳解

2020-06-16 16:39:00

看這篇文章的人基本都有一個想法,就是:“勞資不想用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 <XXX@XXX.com>
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

IT145.com E-mail:sddin#qq.com