制作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