Centos RPM包製做原理

   有時候爲了部署本身的包更方便一些,咱們會製做本身的RPM包,製做RPM包都有哪些步驟呢,學習這些步驟就是本文的目的。在Centos下製做RPM包依賴rpm-build這個包,因此須要提早安裝好該軟件包。 node

RPM生成要素 python

  1. 生成rpm所用的文件列表或者源代碼
  2. 根據文件列表或者源代碼生成rpm規範,也就是spec文件
  3. 根據spec文件加工源碼/文件的工具rpmbuild


在redhat下,rpm包的默認製做路徑在/usr/src/redhat下: 數據庫

/usr/src/redhat
--BUILD #編譯以前,如解壓包後存放的路徑
--BUILDROOT #編譯後存放的路徑
--RPMS #打包完成後rpm包存放的路徑
--SOURCES #源包所放置的路徑
--SPECS #spec文檔放置的路徑
--SPRMS #源碼rpm包放置的路徑
   centos並無該目錄,這可咋辦,其實在那個目錄製做rpm是沒有關係的,只要設置好配置文件就行。通常咱們都把源碼打包成tar.gz格式而後存放於SOURCES路徑下,而在SPECS路徑下編寫spec文檔,經過命令打包後,默認會把打包後的rpm包放在RPMS下,而源碼包會被放置在SRPMS下。


先看看rpmbuild命令的用法: centos

1 從spec文檔創建有如下選項:
編輯器

-bp  #只執行spec的%pre 段(解開源碼包並打補丁,即只作準備)
-bc  #執行spec的%pre和%build 段(準備並編譯)
-bi  #執行spec中%pre,%build與%install(準備,編譯並安裝)
-bl  #檢查spec中的%file段(查看文件是否齊全)
-ba  #創建源碼與二進制包(經常使用)
-bb  #只創建二進制包(經常使用)
-bs  #只創建源碼包
2 從tarball包創建,與spec相似

-tp #對應-bp
-tc #對應-bc
-ti #對應-bi
-ta #對應-ba
-tb #對應-bb
-ts #對應-bs
3 從源碼包創建

--rebuild  #創建二進制包,通-bb
--recompile  #同-bi
* rpmbuild的其餘參數

--buildroot=DIRECTORY   #肯定以root目錄創建包
--clean  #完成打包後清除BUILD下的文件目錄
--nobuild  #不進行%build的階段
--nodeps  #不檢查創建包時的關聯文件
--nodirtokens
--rmsource  #完成打包後清除SOURCES
--rmspec #完成打包後清除SPEC
--short-cricuit
--target=CPU-VENDOR-OS #肯定包的最終使用平臺


再來看看spec文件編寫規則 ide

spec的關鍵字 函數

Name:用來定義軟件包的名稱,後面可使用%{name}的方式引用,不能包含空格,且必須惟一
Summary: 軟件包的內容概要,只能用一句話來歸納
Version: 軟件的實際版本號,具體命令需跟源包一致,後面可使用%{version}使用,不容許出現連字符'-',會被認爲非法字符
Release: 發佈序列號,具體命令需跟源包一致,後面可使用%{release}使用,通常是一個整數,也是rpm包版本信息的一部分
License: 軟件受權方式,一般就是GPL
Source: 源代碼包,能夠帶多個用Source一、Source2等源,後面也能夠用%{source1}、%{source2}引用
buildroot在rpmbuild在製做rpm包的時候,會把編譯生成的二進制文件和庫文件先安裝到一個臨時目錄,而後再結合spec文件從這個臨時目錄中提取文件 ,壓縮生成rpm文件,這個臨時目錄就是buildroot所標示的目錄
BuildRoot: 這個是安裝或編譯時使用的「虛擬目錄」,考慮到多用戶的環境,通常定義爲:%{_tmppath}/%{name}-%{version}-%{release}-root
	   該參數很是重要,由於在生成rpm的過程當中,執行make install時就會把軟件安裝到上述的路徑中,在打包的時候,一樣依賴「虛擬目錄」爲「根目錄」進行操做。後面可以使用$RPM_BUILD_ROOT 方式引用。
URL: 軟件的主頁
Vendor: 發行商或打包組織的信息,例如RedFlag Co,Ltd
Disstribution: 發行版標識
Group: 軟件分組,建議使用標準分組
		-----------------------------------------
		軟件包所屬類別,具體類別有:
		Amusements/Games (娛樂/遊戲)
		Amusements/Graphics(娛樂/圖形)
		Applications/Archiving (應用/文檔)
		Applications/Communications(應用/通信)
		Applications/Databases (應用/數據庫)
		Applications/Editors (應用/編輯器)
		Applications/Emulators (應用/仿真器)
		Applications/Engineering (應用/工程)
		Applications/File (應用/文件)
		Applications/Internet (應用/因特網)
		Applications/Multimedia(應用/多媒體)
		Applications/Productivity (應用/產品)
		Applications/Publishing(應用/印刷)
		Applications/System(應用/系統)
		Applications/Text (應用/文本)
		Development/Debuggers (開發/調試器)
		Development/Languages (開發/語言)
		Development/Libraries (開發/函數庫)
		Development/System (開發/系統)
		Development/Tools (開發/工具)
		Documentation (文檔)
		System Environment/Base(系統環境/基礎)
		System Environment/Daemons (系統環境/守護)
		System Environment/Kernel (系統環境/內核)
		System Environment/Libraries (系統環境/函數庫)
		System Environment/Shells (系統環境/接口)
		User Interface/Desktops(用戶界面/桌面)
		User Interface/X (用戶界面/X窗口)
		User Interface/X Hardware Support (用戶界面/X硬件支持)
		----------------------------------------------------
Patch: 補丁源碼,可以使用Patch一、Patch2等標識多個補丁,使用%patch0或%{patch0}引用
prefix主要用於定義可從新定義安裝位置的包,也就是在安裝時能夠經過--prefix來定義包的安裝路徑
Prefix: %{_prefix} 這個主要是爲了解決從此安裝rpm包時,並不必定把軟件安裝到rpm中打包的目錄的狀況。這樣,必須在這裏定義該標識,並在編寫%install腳本的時候引用,才能實現rpm安裝時從新指定位置的功能
Prefix: %{_sysconfdir} 這個緣由和上面的同樣,但因爲%{_prefix}指/usr,而對於其餘的文件,例如/etc下的配置文件,則須要用%{_sysconfdir}標識
Requires: 該rpm包所依賴的軟件包名稱,能夠用>=或<=表示大於或小於某一特定版本,「>=」號兩邊需用空格隔開,而不一樣軟件名稱也用空格分開
Conflicts: 該包與哪些軟件包衝突
Provides: 該包提供了什麼,一般是包名或者虛擬包名
Packager: 打包者的信息,能夠是名字或者郵件地址
%dscription 軟件的詳細說明,描述信息能夠有多行,若是提供的描述信息是以空格開始的,則該信息單獨顯示在一行,若是信息前沒有空格,則認爲描述信息是一個段落
2 spec的主體,主體中也包括了不少關鍵字和描述

%prep 預處理腳本,

%setup -n %{name}-%{version} 把源碼包解壓並放好
  注:可根據你的源碼的名字格式,來確認解壓後名字的格式,不然可能致使install的時候找不到對應的目錄

◎補充一下
%setup 不加任何選項,僅將軟件包打開。
%setup -n newdir 將軟件包解壓在newdir目錄。
%setup -c 解壓縮以前先產生目錄。
%setup -b num 將第num個source文件解壓縮。
%setup -T 不使用default的解壓縮操做。
%setup -T -b 0 將第0個源代碼文件解壓縮。
%setup -q 指不顯示輸出(quietly)
%setup -c -n newdir 指定目錄名稱newdir,並在此目錄產生rpm套件。
%patch 最簡單的補丁方式,自動指定patch level。
%patch 0 使用第0個補丁文件,至關於%patch ?p 0。
%patch -s 不顯示打補丁時的信息。
%patch -T 將全部打補丁時產生的輸出文件刪除。

%build 開始構建包
在/usr/src/redhat/BUILD/%{name}-%{version}目錄中進行make的工做 ,常見寫法:
make %{?_smp_mflags} OPTIMIZE="%{optflags}"
都是一些優化參數,定義在/usr/lib/rpm/marcros中
%install 開始把軟件安裝到虛擬的根目錄中
在/usr/src/redhat/BUILD/%{name}-%{version}目錄中進行make install的操做。這個很重要,由於若是這裏的路徑不對的話,則下面%file中尋找文件的時候就會失敗。 常見內容有:
%makeinstall 這不是關鍵字,而是rpm定義的標準宏命令。也可使用非標準寫法:
make DESTDIR=$RPM_BUILD_ROOT install
或
make prefix=$RPM_BUILD_ROOT install

%clean 清理臨時文件
一般內容爲:
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"


※注意區分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
$RPM_BUILD_ROOT是指開頭定義的BuildRoot,而$RPM_BUILD_DIR一般就是指/usr/src/redhat/BUILD,其中,前面的纔是%file須要的。

%pre rpm安裝前執行的腳本
%post rpm安裝後執行的腳本
%preun rpm卸載前執行的腳本
%postun rpm卸載後執行的腳本
%preun %postun 的區別是什麼呢?
前者在升級的時候會執行,後者在升級rpm包的時候不會執行
%files 定義那些文件或目錄會放入rpm中
這裏會在虛擬根目錄下進行,千萬不要寫絕對路徑,而應用宏或變量表示相對路徑。若是描述爲目錄,表示目錄中除%exclude外的全部文件。

%deffattr (-,root,root) 指定包裝文件的屬性,分別是(mode,owner,group),-表示默認值,對文本文件是0644,可執行文件是0755
%exclude 列出不想打包到rpm中的文件
※當心,若是%exclude指定的文件不存在,也會出錯的。
%changelog 變動日誌
3 spec文檔中經常使用的幾個宏(變量)

1. RPM_BUILD_DIR:    /usr/src/redhat/BUILD
2. RPM_BUILD_ROOT:   /usr/src/redhat/BUILDROOT
3. %{_sysconfdir}:   /etc
4. %{_sbindir}:     /usr/sbin
5. %{_bindir}:       /usr/bin
6. %{_datadir}:      /usr/share
7. %{_mandir}:       /usr/share/man
8. %{_libdir}:       /usr/lib64
9. %{_prefix}:       /usr
10. %{_localstatedir}:   /usr/var

    其實以上參數值都是在/usr/lib/rpm/macros文件中定義的,筆者在第一次製做rpm包時直接修改的該文件的值,其實最好不要修改該文件的值,只須要在家目錄定義本身須要的值便可。 工具

 下一篇開始實戰,go... post

相關文章
相關標籤/搜索