構建RPM之SPEC詳解


一.簡單說明

在centos/rhel的系統使用中,我們會涉及自己構建一些rpm包在centos/rhel的系統中進行安裝,這里涉及rpm打包環境的部署、SPEC文件的編寫相關,下面我們具體進行說明。

二.部署rpm打包環境

2.1 安裝rpm-build的相關rpm包

yum -y install rpm-build rpmdevtools

2.2 生成打包目錄結構

[root@centos7 ~]# rpmdev-setuptree
[root@centos7 rpmbuild]# ls /root/rpmbuild/
BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS

目錄解釋:

  • BUILD:源碼解壓后存放的目錄
  • RPMS:制作完成后的RPM存放目錄
  • SOURCES:存放源文件,配置文件,補丁文件等放置的目錄
  • SPECS:存放SPEC文件,制作RPM包的目錄
  • SRPMS:src格式的RPM包目錄
  • BUILDROOT:虛擬安裝目錄,在整個install的過程中臨時安裝到此目錄,把這個目錄當做根來使用。所有在這個目錄下的文件才是真正的目錄文件,最后SPEC文件中有清理階段,這個目錄下的內容將被刪除。

2.3 改變打包目錄

這里在2.2章節我們默認生成的rpmbuild目錄在/root目錄下,如果我們想將構建RPM包的打包目錄改變其它目錄,可以參照如下方式進行:
例如,我們將rpmbuild目錄移動到/home目錄:

[root@centos7 ~]# mv /root/rpmbuild /home 
[root@centos7 ~]# vi /root/.rpmmacros
[root@centos7 ~]# vi /root/.rpmmacros 
# 這里改變%_topdir的目錄為新移動的rpm構建目錄
%_topdir /home/rpmbuild

%_smp_mflags %( \
    [ -z "$RPM_BUILD_NCPUS" ] \\\
        && RPM_BUILD_NCPUS="`/usr/bin/nproc 2>/dev/null || \\\
                             /usr/bin/getconf _NPROCESSORS_ONLN`"; \\\
    if [ "$RPM_BUILD_NCPUS" -gt 16 ]; then \\\
        echo "-j16"; \\\
    elif [ "$RPM_BUILD_NCPUS" -gt 3 ]; then \\\
        echo "-j$RPM_BUILD_NCPUS"; \\\
    else \\\
        echo "-j3"; \\\
    fi )

%__arch_install_post \
    [ "%{buildarch}" = "noarch" ] || QA_CHECK_RPATHS=1 ; \
    case "${QA_CHECK_RPATHS:-}" in [1yY]*) /usr/lib/rpm/check-rpaths ;; esac \
    /usr/lib/rpm/check-buildroot
%debug_package %{nil}

改變后,我們可以通過如下的命令查看工作目錄的路徑:

[root@centos7 rpmbuild]# rpmbuild --showrc | grep topdir
-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	/home/yushengyin/rpmbuild

三.SPEC文件詳解

RPM包的SPEC文件有許多配置信息,包含:軟件基礎信息、安裝卸載前后執行的腳本、對源碼包打補丁、解壓、編譯、安裝等。
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: 修改歷史

四.構建RPM包

這里,我們制作一個RPM包用於配置centos7.x各系統之間的無密鑰訪問:

4.1 創建ssh-no-rsa的源文件

[root@centos7 SOURCES]# mkdir ssh-no-rsa-1.0.0
# 將涉及到的無密鑰訪問的文件移動到源碼目錄
[root@centos7 SOURCES]# cp -a {authorized_keys,id_rsa.pub,id_rsa} ssh-no-rsa-1.0.0

4.2 創建一個spec文件

[root@centos7 SPECS]# touch ssh-no-rsa-1.0.0.spec
[root@centos7 SPECS]# vim ssh-no-rsa-1.0.0.spec
[root@centos SPECS]# cat ssh-no-rsa-1.0.0.spec 
#----------------------------------------------------------------------------------------------------------------------------------
Name:		ssh-no-rsa
Version:        1.0.0
Release: 	0
Summary:        kubernetes system config 
License: 	Shareware
Source0: 	%{name}-%{version}

# 這里我們定義一個無密鑰訪問時密鑰的存放目錄
%define sshdir /root/.ssh

%description
ssh and other config

%install
# 創建上面定義的無密鑰存放目錄,注意使用-d
install -d -m 0700 %{buildroot}%{sshdir}
# 安裝無密鑰訪問的文件到指定的目錄
install -D -p -m 0755 %{SOURCE0}/authorized_keys %{buildroot}%{sshdir}/authorized_keys
install -D -p -m 0755 %{SOURCE0}/id_rsa.pub %{buildroot}%{sshdir}/id_rsa.pub
install -D -p -m 0755 %{SOURCE0}/id_rsa %{buildroot}%{sshdir}/id_rsa

%pre
rm -rf %{sshdir}/{authorized_keys,id_rsa.pub,id_rsa}

%postun
rm -rf %{sshdir}

%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"

%files 
%attr(-,root,root) %{sshdir}/*


%changelog
* Mon Apr 20 2020 yuhaohao <yuhaohaozz@163.com>
- 1.配置無密鑰訪問

4.3 構建rpm包

[root@centos7 SPECS]# rpmbuild -bb ssh-no-rsa-1.0.0.spec
# 構建成功后,查看構建的RPM
[root@centos7 SPECS]# ls /home/rpmbuild/RPMS/x86_64/ssh-no-rsa-1.0.0-0.x86_64.rpm 
/home/rpmbuild/RPMS/x86_64/ssh-no-rsa-1.0.0-0.x86_64.rpm
# 查看RPM包內容
[root@centos7 SPECS]# rpm -qpl /home/rpmbuild/RPMS/x86_64/ssh-no-rsa-1.0.0-0.x86_64.rpm
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_rsa.pub

4.4 驗證安裝

[root@centos ~]# rpm -ivh ssh-no-rsa-1.0.0-0.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:ssh-no-rsa-1.0.0-0               ################################# [100%]

0K,到這里我們成功創建了一個RPM。

總結:RPM包的構建本身是個比較簡單的過程,但是還是要結合實際的業務需求去定制。定制時,需要考慮整個安裝流程需要考慮流程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM