Linux下RPM打包流程分享

本文主要和大家分享linux下rpm打包流程,希望能幫助到大家。

開始前的準(zhǔn)備

安裝rpmbuild軟件包

  • yum -y install rpm-build

    生成相關(guān)目錄

要生成rpm相關(guān)目錄,可以手動(dòng)創(chuàng)建,也可以通過rpmbuild命令創(chuàng)建。如:

[root@yang data]# rpmbuild zabbix_agentd_ops.spec   error: File /root/rpmbuild/SOURCES/zabbix-3.0.3.tar.gz: No such file or directory    有報(bào)錯(cuò),無需理會(huì),可以看到rpmbuild目錄已經(jīng)創(chuàng)建完成    [root@yang ~]# tree rpmbuild/  rpmbuild/  ├── BUILD  ├── BUILDROOT  ├── RPMS  ├── SOURCES  ├── SPECS  └── SRPMS

編寫SPEC文件

SPEC關(guān)鍵字

Name: 軟件包的名稱,后面可使用%{name}的方式引用

Summary: 軟件包的內(nèi)容概要

Version: 軟件的實(shí)際版本號(hào),例如:1.0.1等,后面可使用%{version}引用

Release: 發(fā)布序列號(hào),例如:1linuxing等,標(biāo)明第幾次打包,后面可使用%{release}引用

Group: 軟件分組,建議使用標(biāo)準(zhǔn)分組

License: 軟件授權(quán)方式,通常就是GPL

Source: 源代碼包,可以帶多個(gè)用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用

BuildRoot: 這個(gè)是安裝或編譯時(shí)使用的“虛擬目錄”,考慮到多用戶的環(huán)境,一般定義為:%{tmppath}/{name}-%{version}-%{release}-root或%{tmppath}/%{name}-%{version}-%{release}-buildroot-%%__id_u} -n}.該參數(shù)非常重要,因?yàn)樵谏蓃pm的過程中,執(zhí)行make install時(shí)就會(huì)把軟件安裝到上述的路徑中,在打包的時(shí)候,同樣依賴“虛擬目錄”為“根目錄”進(jìn)行操作。后面可使用$RPM_BUILD_ROOT 方式引用。

URL: 軟件的主頁(yè)

Vendor: 發(fā)行商或打包組織的信息,例如RedFlag Co,Ltd

Disstribution: 發(fā)行版標(biāo)識(shí)

Patch: 補(bǔ)丁源碼,可使用Patch1、Patch2等標(biāo)識(shí)多個(gè)補(bǔ)丁,使用%patch0或%{patch0}引用

Prefix: %{_prefix} 這個(gè)主要是為了解決今后安裝rpm包時(shí),并不一定把軟件安裝到rpm中打包的目錄的情況。這樣,必須在這里定義該標(biāo)識(shí),并在編寫%install腳本的時(shí)候引用,才能實(shí)現(xiàn)rpm安裝時(shí)重新指定位置的功能

Prefix: %{sysconfdir} 這個(gè)原因和上面的一樣,但由于%{prefix}指/usr,而對(duì)于其他的文件,例如/etc下的配置文件,則需要用%{_sysconfdir}標(biāo)識(shí)

Build Arch: 指編譯的目標(biāo)處理器架構(gòu),noarch標(biāo)識(shí)不指定,但通常都是以/usr/lib/rpm/marcros中的內(nèi)容為默認(rèn)值

Requires: 該rpm包所依賴的軟件包名稱,可以用>=或= 1.0.20 zlib ?※“>=”號(hào)兩邊需用空格隔開,而不同軟件名稱也用空格分開,還有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是針對(duì)不同階段的依賴指定

Provides: 指明本軟件一些特定的功能,以便其他rpm識(shí)別

Packager: 打包者的信息

%description 軟件的詳細(xì)說明

SPEC腳本主體

%prep?預(yù)處理腳本

%setup -n %{name}-%{version}**?把源碼包解壓并放好通常是從/usr/src/asianux/SOURCES里的包解壓到/usr/src/asianux/BUILD/%{name}-%{version}中。一般用%setup -c就可以了,但有兩種情況:一就是同時(shí)編譯多個(gè)源碼包,二就是源碼的tar包的名稱與解壓出來的目錄不一致,此時(shí),就需要使用-n參數(shù)指定一下了。

%patch?打補(bǔ)丁通常補(bǔ)丁都會(huì)一起在源碼tar.gz包中,或放到SOURCES目錄下。一般參數(shù)為:

  • %patch -p1 使用前面定義的Patch補(bǔ)丁進(jìn)行,-p1是忽略patch的第一層目

  • %Patch2 -p1 -b xxx.patch 打上指定的補(bǔ)丁,-b是指生成備份文件

補(bǔ)充

  • %setup 不加任何選項(xiàng),僅將軟件包打開。?

  • %setup -n newdir 將軟件包解壓在newdir目錄。?

  • %setup -c 解壓縮之前先產(chǎn)生目錄。?

  • %setup -b num 將第num個(gè)source文件解壓縮。?

  • %setup -T 不使用default的解壓縮操作。?

  • %setup -T -b 0 將第0個(gè)源代碼文件解壓縮。?

  • %setup -c -n newdir 指定目錄名稱newdir,并在此目錄產(chǎn)生rpm套件。?

  • %patch 最簡(jiǎn)單的補(bǔ)丁方式,自動(dòng)指定patch level。?

  • %patch 0 使用第0個(gè)補(bǔ)丁文件,相當(dāng)于%patch ?p 0。?

  • %patch -s 不顯示打補(bǔ)丁時(shí)的信息。?

  • %patch -T 將所有打補(bǔ)丁時(shí)產(chǎn)生的輸出文件刪除。

%configure?這個(gè)不是關(guān)鍵字,而是rpm定義的標(biāo)準(zhǔn)宏命令。意思是執(zhí)行源代碼的configure配置,在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進(jìn)行?,使用標(biāo)準(zhǔn)寫法,會(huì)引用/usr/lib/rpm/marcros中定義的參數(shù)。另一種不標(biāo)準(zhǔn)的寫法是,可參考源碼中的參數(shù)自定義,例如:

引用CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}

%build?開始構(gòu)建包,在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進(jìn)行make的工作

%install?開始把軟件安裝到虛擬的根目錄中.在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進(jìn)行make install的操作。這個(gè)很重要,因?yàn)槿绻@里的路徑不對(duì)的話,則下面%file中尋找文件的時(shí)候就會(huì)失敗。?常見內(nèi)容有:

  • %makeinstall?這不是關(guān)鍵字,而是rpm定義的標(biāo)準(zhǔn)宏命令。也可以使用非標(biāo)準(zhǔn)寫法:make DESTDIR=$RPM_BUILD_ROOT install或引用make prefix=$RPM_BUILD_ROOT install

  • 需要說明的是,這里的%install主要就是為了后面的%file服務(wù)的。所以,還可以使用常規(guī)的系統(tǒng)命令:引用install -d $RPM_BUILD_ROOT/和cp -a * $RPM_BUILD_ROOT/

%clean ? ? ? ?清理臨時(shí)文件

%pre ?? ? ? ? ?rpm安裝前執(zhí)行的腳本

%post ? ? ? ?rpm安裝后執(zhí)行的腳本

%preun ? ?? ? ?rpm卸載前執(zhí)行的腳本

%postun ? ?rpm卸載后執(zhí)行的腳本

%files 定義那些文件或目錄會(huì)放入rpm中

%defattr (-,root,root)**?指定包裝文件的屬性,分別是(mode,owner,group),-表示默認(rèn)值,對(duì)文本文件是0644,可執(zhí)行文件是0755

%changelog ? ??變更日志

實(shí)例:

%define zabbix_user zabbix                    #自定義宏,名字為zabbix_user值為zabbix,%{zabbix_user}引用  Name:    zabbix                                #軟件包的名字,后面可用%{name}引用  Version:    3.0.3                            #軟件的實(shí)際版本號(hào),可使用%{version}引用  Release:    1%{?dist}                        #發(fā)布序列號(hào),標(biāo)明第幾次打包      Summary:    zabbix_agentd                    #軟件包內(nèi)容概要    Group:        zabbix                            #軟件包分組  License:    GPL                                #授權(quán)許可方式  URL:        www.yang.com                    #軟件的主頁(yè)  Source0:    zabbix-3.0.3.tar.gz                #源代碼包,可以有Source0,Source1等源    BuildRequires:        gcc, gcc-c++            #制作rpm包時(shí),所依賴的基本庫(kù)  Requires:    gcc, gcc-c++, chkconfig            #安裝rpm包時(shí),所依賴的軟件包    %description                                #定義rpm包的描述信息  Zabbix agentd 3.0.3    %pre                                        #rpm包安裝前執(zhí)行的腳本  grep zabbix /etc/passwd > /dev/null  if [ $? != 0 ]   then useradd zabbix -M -s /sbin/nologin  fi  [ -d /etc/zabbix   ]||rm -rf /etc/zabbix*      %post                                        #rpm包安裝后執(zhí)行的腳本  sed -i "/^ServerActive=/cServerActive=172.30.17.35" /etc/zabbix/etc/zabbix_agentd.conf  sed -i "/^Server=/cServer=172.30.17.35" /etc/zabbix/etc/zabbix_agentd.conf  sed -i "/Timeout=3/cTimeout=30" /etc/zabbix/etc/zabbix_agentd.conf  sed -i "/HostMetadata=/cHostMetadata=PostgreSQL" /etc/zabbix/etc/zabbix_agentd.conf  sed -i "/^Hostname=/cHostname=PostgreSQL" /etc/zabbix/etc/zabbix_agentd.conf  echo "UnsafeUserParameters=1" >>/etc/zabbix/etc/zabbix_agentd.conf  echo "EnableRemoteCommands=1" >>/etc/zabbix/etc/zabbix_agentd.conf  echo "Include=/etc/zabbix/etc/zabbix_agentd.conf.d/*.conf" >>/etc/zabbix/etc/zabbix_agentd.conf  chkconfig zabbix_agentd on    %preun                                        #rpm卸載前執(zhí)行的腳本  systemctl stop zabbix_agentd  %postun                                        #rpm卸載后執(zhí)行的腳本  userdel  zabbix  rm -rf /etc/zabbix*  %prep                                        #這個(gè)宏開始  %setup -q                                    #解壓并cd到相關(guān)目錄      %build                                        #定義編譯軟件包時(shí)的操作  ./configure --prefix=/etc/%{name}-%{version}   --enable-agent  make -j16 %{?_smp_mflags}    %install                                    #定義安裝軟件包,使用默認(rèn)值即可  test -L %{buildroot}/etc/%{name} && rm -f %{buildroot}/etc/%{name}  install -d %{buildroot}/etc/profile.d  install -d %{buildroot}/etc/init.d  make install DESTDIR=%{buildroot}  echo 'export PATH=/etc/zabbix/bin:/etc/zabbix/sbin:$PATH' > %{buildroot}/etc/profile.d/%{name}.sh  ln -sf /etc/%{name}-%{version}             %{buildroot}/etc/%{name}  cp %{_buildrootdir}/postgresql.conf         %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/postgresql.conf  cp %{_buildrootdir}/tcp_connections.sh      %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh  cp %{_buildrootdir}/iostat-collect.sh          %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh   cp %{_buildrootdir}/iostat-parse.sh          %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh  cp %{_buildrootdir}/iostat-zabbix.conf      %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf   cp %{_buildrootdir}/zabbix_agentd         %{buildroot}/etc/init.d/zabbix_agentd    %files                                        #定義rpm包安裝時(shí)創(chuàng)建的相關(guān)目錄及文件。在該選項(xiàng)中%defattr (-,root,root)一定要注意。它是指定安裝文件的屬性,分別是(mode,owner,group),-表示默認(rèn)值,對(duì)文本文件是0644,可執(zhí)行文件是0755。  /etc/%{name}  /etc/%{name}-%{version}/*  /etc/init.d/zabbix_agentd  /etc/profile.d/%{name}.sh    %changelog                                    #主要用于軟件的變更日志。該選項(xiàng)可有可無  %clean   rm -rf %{buildroot}                         #清理臨時(shí)文件

RPM包制作拓展

如果想為zabbix增加啟動(dòng)控制腳本或一些其他的配置文件,可以將其放在SOURCE下,然后復(fù)制過去

  • 將啟動(dòng)腳本放在SOURCE目錄

      [root@yang ~/rpmbuild/SOURCES]# ll        total 15116        -rwxr-xr-x 1 root root      362 Aug  1 12:03 hostmonitor.conf        -rwxr-xr-x 1 root root      505 Aug  1 12:03 iostat-collect.sh        -rwxr-xr-x 1 root root      953 Aug  1 12:03 iostat-parse.sh        -rw-r--r-- 1 root root      772 Aug  1 12:03 iostat-zabbix.conf        -rwxr-xr-x 1 root root      813 Aug  1 12:03 nginx_monitor.sh        -rw-r--r-- 1 root root    14868 Aug  1 12:03 postgresql.conf        -rw-r--r-- 1 root root       77 Aug  1 12:03 process.discovery        -rw-r--r-- 1 root root      552 Aug  1 12:03 redis_check.conf        -rw-r--r-- 1 root root      356 Aug  1 12:03 redis_cluster_check.py        -rw-r--r-- 1 root root      363 Aug  1 12:03 redis_multiport_check.py        -rwxr-xr-x 1 root root      783 Aug  1 12:03 tcp_connections.sh        -rw-r--r-- 1 root root      852 Aug  1 12:03 userparameter_nginx.conf        -rw-r--r-- 1 root root      172 Aug  1 12:03 userparameter_process.conf        -rw-r--r-- 1 root root 15407273 Jul 20 10:53 zabbix-3.0.3.tar.gz        -rwxr-xr-x 1 root root     2182 Aug  1 12:03 zabbix_agentd
  • 編輯 SPEC文件

    • Source0下增加如下:

        Source0:        zabbix-3.0.3.tar.gz          Source1:        zabbix_agentd          Source2:        nginx_monitor.sh          Source3:        userparameter_nginx.conf          Source4:        hostmonitor.conf          Source5:        process.discovery          Source6:        userparameter_process.conf          Source7:        redis_check.conf          Source8:        redis_cluster_check.py          Source9:        redis_multiport_check.py          Source10:       tcp_connections.sh          Source11:       iostat-collect.sh          Source12:       iostat-parse.sh          Source13:       iostat-zabbix.conf
  • 安裝區(qū)域增加如下行:

        make install DESTDIR=%{buildroot}          install -p -D -m 0755 %{SOURCE1}        %{buildroot}/etc/init.d/zabbix_agentd          install -p -D         %{SOURCE2}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/nginx_monitor.sh          install -p -D         %{SOURCE3}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_nginx.conf          install -p -D         %{SOURCE4}        %{buildroot}/etc/nginx/conf.d/hostmonitor.conf          install -p -D         %{SOURCE5}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/process.discovery          install -p -D         %{SOURCE6}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_process.conf          install -p -D         %{SOURCE7}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_check.conf          install -p -D         %{SOURCE8}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_cluster_check.py          install -p -D         %{SOURCE9}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_multiport_check.py          install -p -D         %{SOURCE10}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh          install -p -D         %{SOURCE11}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh          install -p -D         %{SOURCE12}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh          install -p -D         %{SOURCE13}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf
  • %file區(qū)域增加如下行:

        %files          %defattr (-,root,root,0755)          /etc/%{name}          /etc/%{name}-%{version}/*          /etc/profile.d/%{name}.sh          /etc/nginx/conf.d/hostmonitor.conf          %attr(0755,root,root) /etc/rc.d/init.d/zabbix_agentd

以下為完整的SPEC文件:

Name:    zabbix      Version:    3.0.3          Release:    1%{?dist}  Summary:    zabbix_agentd    Group:        zabbix  License:    GPL  URL:        www.yang.com  Source0:    zabbix-3.0.3.tar.gz  Source1:    zabbix_agentd  Source2:    nginx_monitor.sh  Source3:    userparameter_nginx.conf  Source4:    hostmonitor.conf  Source5:    process.discovery  Source6:    userparameter_process.conf  Source7:    redis_check.conf  Source8:    redis_cluster_check.py  Source9:    redis_multiport_check.py  Source10:    tcp_connections.sh  Source11:    iostat-collect.sh  Source12:    iostat-parse.sh  Source13:    iostat-zabbix.conf    BuildRequires:        gcc, gcc-c++  Requires:    gcc, gcc-c++, chkconfig    %description  Zabbix agentd 3.0.3    %pre  grep zabbix /etc/passwd > /dev/null  if [ $? != 0 ]   then useradd zabbix -M -s /sbin/nologin  fi  [ -d /etc/zabbix   ]||rm -rf /etc/zabbix  [ -d /etc/zabbix   ]||rm -rf /etc/zabbix-3.0.3      %post  sed -i "/^ServerActive=/cServerActive=172.30.17." /etc/zabbix/etc/zabbix_agentd.conf  sed -i "/^Server=/cServer=172.30.17." /etc/zabbix/etc/zabbix_agentd.conf  sed -i "/Timeout=3/cTimeout=30" /etc/zabbix/etc/zabbix_agentd.conf  sed -i "/HostMetadata=/cHostMetadata=OPS-TMP" /etc/zabbix/etc/zabbix_agentd.conf  sed -i "/^Hostname=/cHostname=OPS-TMP" /etc/zabbix/etc/zabbix_agentd.conf  echo "UnsafeUserParameters=1" >>/etc/zabbix/etc/zabbix_agentd.conf  echo "EnableRemoteCommands=1" >>/etc/zabbix/etc/zabbix_agentd.conf  echo "Include=/etc/zabbix/etc/zabbix_agentd.conf.d/*.conf" >>/etc/zabbix/etc/zabbix_agentd.conf  chkconfig zabbix_agentd on    %preun  systemctl stop zabbix_agentd  %postun  userdel  zabbix  rm -rf /etc/zabbix*  %prep  %setup -q      %build  ./configure --prefix=/etc/%{name}-%{version}   --enable-agent  make -j16 %{?_smp_mflags}    %install  test -L %{buildroot}/etc/%{name} && rm -f %{buildroot}/etc/%{name}  install -d %{buildroot}/etc/profile.d  make install DESTDIR=%{buildroot}  install -p -D -m 0755 %{SOURCE1}     %{buildroot}/etc/init.d/zabbix_agentd  install -p -D         %{SOURCE2}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/nginx_monitor.sh  install -p -D         %{SOURCE3}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_nginx.conf  install -p -D         %{SOURCE4}     %{buildroot}/etc/nginx/conf.d/hostmonitor.conf  install -p -D         %{SOURCE5}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/process.discovery  install -p -D         %{SOURCE6}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_process.conf  install -p -D         %{SOURCE7}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_check.conf  install -p -D         %{SOURCE8}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_cluster_check.py  install -p -D         %{SOURCE9}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_multiport_check.py  install -p -D         %{SOURCE10}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh  install -p -D         %{SOURCE11}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh  install -p -D         %{SOURCE12}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh  install -p -D            %{SOURCE13}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf    echo 'export PATH=/etc/zabbix/bin:/etc/zabbix/sbin:$PATH' > %{buildroot}/etc/profile.d/%{name}.sh  ln -sf /etc/%{name}-%{version}             %{buildroot}/etc/%{name}    %files  %defattr (-,root,root,0755)  /etc/%{name}  /etc/%{name}-%{version}/*  /etc/profile.d/%{name}.sh  /etc/nginx/conf.d/hostmonitor.conf  %attr(0755,root,root) /etc/rc.d/init.d/zabbix_agentd  %changelog  %clean   rm -rf %{buildroot}

相關(guān)推薦:

RPM?進(jìn)行安裝、卸載及管理的操作實(shí)例

RPM?進(jìn)行安裝、卸載及管理的操作實(shí)例

RPM?進(jìn)行安裝、卸載及管理的操作實(shí)例

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊8 分享