linux制作RPM包


制作rpm包

1.制作流程
1.1 前期工作

1)創建打包用的目錄rpmbuild/{BUILD,SPECS,RPMS, SOURCES,SRPMS}

建議使用普通用戶,在用戶家目錄中創建

2)確定好制作的對象,是源碼包編譯打包還只是一些庫文件打包

3)編寫SPEC文件

4)開始制作

1.2 RPM制作過程

1)讀取並解析 filename.spec 文件

2)運行 %prep 部分來將源代碼解包到一個臨時目錄,並應用所有的補丁程序。

3)運行 %build 部分來編譯代碼。

4)運行 %install 部分將代碼安裝到構建機器的目錄中。

5)讀取 %files 部分的文件列表,收集文件並創建二進制和源 RPM 文件。

6)運行 %clean 部分來除去臨時構建目錄。

補充說明:

BUILD目錄:制作車間,二進制tar.gz包的解壓后存放的位置,並在此目錄進行編譯安裝

SPECS目錄:存放SPEC文件

RPMS目錄:存放制作好的rpm包

SOURCES目錄:存放源代碼

SRPMS目錄:存放編譯好的二進制rpm包

BUILDROOT目錄:此目錄是在BUILD目錄中執行完make install之后生成的目錄,里面存放的是編譯安裝好的文件,他是./configure中—prefix指定path的根目錄

1.3制作工具:rpmbuild

制作過程的幾個狀態

rpmbuild -bp 執行到%prep

rpmbuild -bc 執行到%build中的config

rpmbuild -bi 執行至%build中的install

rpmbuild -ba 編譯后做成rpm包和src.rpm包

rpmbuild -bs 僅制作src.rpm包

rpmbuild -bb 僅制作rpm包

 

2.SPEC文件
2.1 spec文件參數:

自定義軟件包基本參數:

Name 軟件包名字

Version 軟件包版本

Release 軟件包修訂號

Summary 軟件包簡單描述

Group 軟件包所屬組。必須是系統定義好的組

License 軟件授權方式,通常就是GPL

Vendor 軟件包發型廠商

Packager 軟件包打包者

URL 軟件包的url

Source 定義打包所需的源碼包,可以定義多個,后面使用%{SOURCE}調用

Patch 定義補丁文件,后面可以使用%{Patch}調用

BuildRoot 定義打包時的工作目錄

BuildRequires 定義打包時依賴的軟件包

Requires 定義安裝時的依賴包,形式為Package name 或者 Package >= version

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

%{_sysconfdir} 這個原因和上面的一樣,但由於%{_prefix}指/usr,而對於其他的文件,例如/etc下的配置文件,則需要用%{_sysconfdir}標識

%package 定義一個子包

%description 詳細描述信息

 

自定義打包參數;

%prep 預處理段,默認是解壓源碼包,可以自定義shell命令和調用RPM宏命令

%post rpm安裝后執行的命令,可以自定義shell命令和調用RPM宏命令

%preun rpm卸載前執行的命令,可以自定義shell命令和調用RPM宏命令

%postun rpm卸載后執行的命令,可以自定義shell命令和調用RPM宏命令

%patch 打補丁階段

%build 編譯安裝段,此段包含./configure和 make 安裝階段

%install 安裝階段,會把編譯好的二進制文件安裝到BUILDROOT為根的目錄下

%files 文件段,定義軟件打包時的文件,分為三類--說明文檔(doc),配置文件(config)及執行程序,還可定義文件存取權限,擁有者及組別。其路徑為相對路徑

%changelog 定義軟件包修改的日志

 

 

2.2補充:

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硬件支持)

 

%setup 的用法

%setup 不加任何選項,僅僅打開源碼包

%setup -n newdir 將軟件包解壓至新目錄(重命名解壓的包),默認

%setup -c 解壓縮之前先產生目錄。

%setup -b num 將第num個source文件解壓縮。

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

%setup -T -b 0 將第0個源代碼文件解壓縮。

%setup -c -n newdir 指定目錄名稱newdir,並在此目錄產生rpm套件。

%setup -q 解壓不輸出信息

%Patch用法

先使用Patch{n}定義補丁包,然后使用%patch{n}或者%{patch{n}}來調用打補丁

補丁號命名規則

0-9 Makefile、configure 等的補丁

10-39 指定功能或包含他的文件的補丁

40-59 配置文件的補丁

60-79 字體或字符補丁

80-99 通過 xgettexize 得到的目錄情況的補丁

100- 其他補丁

%patch 最簡單的補丁方式,自動指定patch level。

%patch 0 使用第0個補丁文件,相當於%patch -p 0。

%patch -s 不顯示打補丁時的信息。

%patch -T 將所有打補丁時產生的輸出文件刪除

%patch -b name 在打補丁之前,將源文件加入name,缺省為.org

 

%file用法

%defattr (-,root,root) 指定包裝文件的屬性,分別是(mode,owner,group),-表示默認值,對文本文件是0644,可執行文件是0755

%attr(600,work,work) 指定特定的文件目錄權限

fattr (-,root,root)

 

本段是文件段,用於定義構成軟件包的文件列表,那些文件或目錄會放入rpm中,分為三類-說明文檔(doc),配置文件(config)及執行程序,還可定義文件存取權限,擁有者及組別。

 

這里會在虛擬根目錄下進行,千萬不要寫絕對路徑,而應用宏或變量表示相對路徑。

※特別需要注意的是:%install部分使用的是絕對路徑,而%file部分使用則是相對路徑,雖然其描述的是同一個地方。千萬不要寫錯。

%files -f %{name}.lang tui

file1 #文件中也可以包含通配符,如*

file2

directory #所有文件都放在directory目錄下

%dir /etc/xtoolwait #僅是一個空目錄/etc/xtoolwait打進包里

%doc 表示這是文檔文件,因此如安裝時使用--excludedocs將不安裝該文件,

%doc /usr/X11R6/man/man1/xtoolwait.* #安裝該文檔

%doc README NEWS #安裝這些文檔到/usr/share/doc/%{name}-%{version} 或者 /usr/doc或者

%docdir #定義說明文檔的目錄,例如/root,在這一語句后,所有以/root開頭的行都被定義為說明文件。

%config /etc/yp.conf #標志該文件是一個配置文件,升級過程中,RPM會有如下動作。

%config(missisgok) /etc/yp.conf 此配置文件可以丟失,即使丟失了,RPM在卸載軟件包時也不認為這是一個錯誤,並不報錯。一般用於那些軟件包安裝后建立的符號鏈接文件,

/etc/rc.d/rc5.d/S55named文件,此類文件在軟件包卸載后可能需要刪除,所以丟失了也不要緊。

%config(noreplace) /etc/yp.conf

#該配置文件不會覆蓋已存在文件(RPM包中文件會以.rpmnew存在於系統,卸載時系統中的該配置文件會以.rpmsave保存下來,如果沒有這個選項,安裝時RPM包中文件會以.rpmorig存在於系統 )

覆蓋已存在文件(沒被修改),創建新的文件加上擴展后綴.rpmnew(被修改)

%{_bindir}/*

%config /etc/aa.conf

%ghost /etc/yp.conf #該文件不應該包含在包中,一般是日志文件,其文件屬性很重要,但是文件內容不重要,用了這個選項后,僅將其文件屬性加入包中。

%attr(mode, user, group) filename #控制文件的權限如%attr(0644,root,root) /etc/yp.conf

如果你不想指定值,可以用-

%config %attr(-,root,root) filename #設定文件類型和權限

fattr(-,root,root) #設置文件的默認權限,-表示默認值,對文本文件是0644,可執行文件是0755

%lang(en) %{_datadir}/locale/en/LC_MESSAGES/tcsh* #用特定的語言標志文件

%verify(owner group size) filename #只測試owner,group,size,默認測試所有

%verify(not owner) filename #不測試owner,測試其他的屬性

所有的認證如下:

group: 認證文件的組

maj: 認證文件的主設備號

md5: 認證文件的MD5

min: 認證文件的輔設備號

mode: 認證文件的權限

mtime: 認證文件最后修改時間

owner: 認證文件的所有者

size: 認證文件的大小

symlink:認證符號連接

如果描述為目錄,表示目錄中出%exclude外的所有文件。

%files

fattr(-,root,root)

%doc

%{_bindir}/*

%{_libdir}/liba*

%{_datadir}/file

%{_infodir}/*

%{_mandir}/man[15]/*

%{_includedir}

%exclude %{_libdir}/debug

(%exclude 列出不想打包到rpm中的文件。※小心,如果%exclude指定的文件不存在,也會出錯的。)

如果把

%files

fattr(-,root,root)

%{_bindir}

寫成

%files

fattr(-,root,root)

/usr/bin

則打包的會是根目錄下的/usr/bin中所有的文件。

%files libs

fattr(-,root,root)

%{_libdir}/*so.*

%files devel

�fattr(-,root,root)

%{_includedir}/*

 

install的用法

-b:為每個已存在的目的地文件進行備份;

-d:創建目錄,類似mkdir -p

-D:創建目的地前的所有目錄,然后將來源復制到目的地。復制文件

-g:自行設置所屬的組;

-m:自行設置權限,而不是默認的rwxr-xr-x

-o:自行設置所有者

-p:以來源文件的修改時間作為相應的目的地的文件屬性

%pre %post %pretun %postun 用法

rpm提供了一種信號機制:不同的操作會返回不同的信息,並放到默認變量$1中

 

0代表卸載、1代表安裝、2代表升級

if [“$1” = “0” ] ;then

comond

fi

用於判斷rpm的動作

2.3 典型的spec文件案例:

Name: xywy-varnish
Version: 4.1.0
Release: 1%{?dist}
Summary: varnish rpm package
Group: System environment/Daemons
License: GPL
URL: https://www.varnish-cache.org/
Source: /home/fuzj/rpmbuild/SOURCES/varnish-4.1.0.tar.gz
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires: pcre pcre-devel python-docutils
Requires: pcre pcre-devel python-docutils
%description
%prep
%setup -q
%build
./configure --prefix=/usr/local/xywy/varnish --enable-dependency-tracking --enable-debuggin-symbols --enable-developer-warnigs
make %{?_smp_mflags}
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
mkdir -p %{buildroot}/usr/local/xywy/varnish/etc
install /home/fuzj/rpmbuild/SOURCES/default.vcl %{buildroot}/usr/local/xywy/varnish/etc

%clean
rm -rf %{buildroot
%files
%defattr(-,www,www,-)
/usr/local/xywy/varnish/bin
/usr/local/xywy/varnish/sbin
/usr/local/xywy/varnish/include
/usr/local/xywy/varnish/lib
/usr/local/xywy/varnish/share
/usr/local/xywy/varnish/var
/usr/local/xywy/varnish/etc
%changelog

3.技巧:
1)如果要避免生成debuginfo包:這個是默認會生成的rpm包。則可以使用下面的命令
echo '%debug_package %{nil}' >> ~/.rpmmacros

2)配置 RPM 在構建時使用新的目錄結構,而不是默認的目錄結構:
echo "%_topdir $HOME/rpmbuild" > ~/.rpmmacros

 

 

4.使用FPM制作RPM包
1)安裝:

yum -y install ruby rubygems ruby-devel 安裝ruby 和gem

gem install fpm 安裝fpm工具

 

2)准備編譯安裝好的源碼包

/usr/local/libiconv

 

3)打包:

fpm -f -s dir -t rpm -n beyond-libiconv --epoch=0 -v '1.14' -C /usr/local --iteration 1.el6 ./libiconv-1.14

 

參數解釋

 

-f 強制輸出,如果文件已存在,將會覆蓋源文件

-s 指定源文件為目錄 dir

-t 指定制作的包類型(rpm,deb solaris etc)

-n 指定制作的包名

-- epoch 指定時間戳

-v 指定軟件版本

-C 指定軟件安裝的目錄

--iteration 指定軟件的適用平台

./libiconv-1.14 本次打包的文件

 

 

附加參數:

-e 可以在打包之前編譯 spec文件

-d 指定依賴的軟件包 用法 –d ‘Package’ 或 –d ‘Package > version’

--description 軟件包描述

-p 生成的package文件輸出位置

--url 說明軟件包的url

--post-install :軟件包安裝完成之后所要運行的腳本;和”--after-install” 意思一樣

--pre-install :軟件包安裝完成之前所要運行的腳本;和”--before-install” 意思一樣

--post-uninstall :軟件包卸載完成之后所要運行的腳本;和”--after-remove”意思一樣

--pre-uninstall:軟件包卸載完成之前所要運行的腳本;和”--before-remove”意思一樣

 

fpm打包php案例:

fpm -f -s dir -t rpm -n beyond-php --epoch=0 -v '5.2.14' -C /usr/local/ -p ./ --iteration 1.el6 -d 'beyond-libiconv' -d 'beyond-libmcrypt' -d 'beyond-mcrypt' -d 'beyond-mhash' -d 'libxml2' -d 'libxml2-devel' -d 'zlib' -d 'zlib-devel' -d 'libpng' -d 'libpng-devel' -d 'freetype' -d 'freetype-devel' -d 'autoconf' -d 'gd' -d 'gd-devel' -d 'libjpeg' -d 'libjpeg-devel' -d 'curl' -d 'curl-devel' -d 'mysql-devel' -d 'openssl' -d 'openssl-devel' -d 'openldap-devel' -d 'libtool-ltdl' -d 'libtool-ltdl-devel' --url http://sa.beyond.com/source/php-5.2.14.tar.gz --license GPL --post-install ./preinstall.sh /usr/local/php


免責聲明!

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



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