#######################################################若有轉載,請務必保留本文連接及版權信息##歡迎廣大運維同仁一塊兒交流linux/unix網站運維技術!##QQ:335623998##E-mail:335623998@qq.comhtml
##博客: http://dreamway.blog.51cto.com/linux
##weibo:http://weibo.com/zhaixiangpangit
##################################################### 如何定製RPM包 http://dreamway.blog.51cto.com/1281816/1110822 前言:此文以生產案例應用經過HAProxy1.4.22源碼包爲例定製生成rpm包,並加入內部YUM Server倉庫,便於之後的軟件包安裝 1 、製做RPM包linux系統環境# cat /etc/redhat-release CentOS release 5.8 (Final) # uname -r 2.6.18-308.el5 # uname -m x86_64
2、構建前的準備建立rpmbuild所需的目錄結構,一般安裝好的Cent0S5.8系統已經建立好目錄結構,以下:github
# ls /usr/src debug kernels redhat # ls /usr/src/redhat/ BUILD RPMS SOURCES SPECS SRPMS
root用戶製做RPM包使用/usr/src/redhat/下的目錄便可若是使用普通用戶,則手工建立好目錄便可,命令以下數據庫
# mkdir -p /home/zxp/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
目錄說明:BUILD: 用於編譯軟件包時,源碼的臨時存放空間。
RPMS: 製做好的二進制包的輸出位置。
SOURCES: 源碼的位置。
SPECS: spec文件存放的位置。
SRPMS: 製做好的源碼RPM包的輸出位置,該包安裝時仍須要先編譯。3、SPEC文件詳解構建一個標準的 RPM 包,就須要在目錄SPECS下建立.spec文件,裏面包含即將被安裝的軟件的全部詳細信息。而後對這個文本在系統中執行rpmbuild命令,系統會按照.spec內容設置的步驟自動生成最終的 RPM 包。3.1 SPEC文件 語法詳解(以HAProxy爲例)vim
# cat haproxy.spec Summary: HA-Proxy is a TCP/HTTP reverse proxy for high availability environments #軟件摘要信息 Name: haproxy #軟件名稱 Version: 1.4.22 #軟件版本 Release: 20130106_hexun_as5 #軟件分支版本License: GPL #軟件版權 Group: System Environment/Daemons #軟件所屬分類URL: http://haproxy.1wt.eu/ #軟件主頁 Source0: http://haproxy.1wt.eu/download/1.4/src/%{name}-%{version}.tar.gz #源碼位置BuildRoot: %{_tmppath}/%{name}-%{version}-root #安裝目錄BuildRequires: pcre-devel #編譯依賴軟件包Requires: /sbin/chkconfig, /sbin/service #安裝依賴軟件包 %description #軟件詳細的描述信息 HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments. Indeed, it can: - route HTTP requests depending on statically assigned cookies - spread the load among several servers while assuring server persistence through the use of HTTP cookies - switch to backup servers in the event a main one fails - accept connections to special ports dedicated to service monitoring - stop accepting connections without breaking existing ones - add/modify/delete HTTP headers both ways - block requests matching a particular pattern It needs very little resource. Its event-driven architecture allows it to easily handle thousands of simultaneous connections on hundreds of instances without risking the system's stability. # %prep定義了構建前要作的準備,一般是%setup定義如何解包 %prep %setup -q # We don't want any perl dependecies in this RPM: %define __perl_requires /bin/true #定義不使用perl依賴關係 %build #編譯源碼命令,一般是./configure && make,根據具體包安裝方法而定%{__make} ARCH=%{_target_cpu} TARGET=linux26 %install #安裝階段 [ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot} %{__install} -d %{buildroot}%{_sbindir} %{__install} -d %{buildroot}%{_sysconfdir}/rc.d/init.d %{__install} -d %{buildroot}%{_sysconfdir}/%{name} %{__install} -d %{buildroot}%{_mandir}/man1/ %{__install} -s %{name} %{buildroot}%{_sbindir}/ %{__install} -c -m 644 examples/%{name}.cfg %{buildroot}%{_sysconfdir}/%{name}/ %{__install} -c -m 755 examples/%{name}.init %{buildroot}%{_sysconfdir}/rc.d/init.d/%{name} %{__install} -c -m 755 doc/%{name}.1 %{buildroot}%{_mandir}/man1/ %clean #清理BUILD目錄階段 [ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot} %post #安裝後製定的腳本 /sbin/chkconfig --add %{name} %preun #卸載前執行的腳本if [ $1 = 0 ]; then /sbin/service %{name} stop >/dev/null 2>&1 || : /sbin/chkconfig --del %{name} fi %postun #卸載後執行的腳本if [ "$1" -ge "1" ]; then /sbin/service %{name} condrestart >/dev/null 2>&1 || : fi %files #文件列表,主要是設置安裝rpm包後的文件、目錄屬性%defattr(-,root,root) #定義默認屬性 %doc CHANGELOG TODO examples/*.cfg doc/haproxy-en.txt doc/haproxy-fr.txt doc/architecture.txt doc/configuration.txt #指定軟件文檔%doc %{_mandir}/man1/%{name}.1* #指定man幫助文檔 %attr(0755,root,root) %{_sbindir}/%{name} #單獨指定目錄屬性 %dir %{_sysconfdir}/%{name} #定義軟件安裝目錄 %attr(0644,root,root) %config(noreplace) %{_sysconfdir}/%{name}/%{name}.cfg #單獨指定文件屬性 %attr(0755,root,root) %config %{_sysconfdir}/rc.d/init.d/%{name} #單獨指定文件屬性 %changelog #軟件升級日誌 * Tue Aug 14 2012 Willy Tarreau <w@1wt.eu> - updated to 1.4.22 …………略……………… * Thu Oct 16 2003 Simon Matter <simon.matter@invoca.ch> - initial build
3、獲取spec文件方法(三種方法)3.1 方法1:經過src.rpm包獲取下載&安裝相應的src.rpm包數組
# cd SRPMS/ # wget http://1wt.eu/tools/haproxy/src/devel/haproxy-1.2.3-1.src.rpm # rpm -ivh haproxy-1.2.3-1.src.rpm 1:haproxy ########################################### [100%]
這裏的「安裝」是指把xxx.src.rpm中的tar.gz、patches、xxx.spec等文件分別輸出到/usr/src/redhat/的SOURCES、SPECS等子目錄中查看生成的文件服務器
# ls /usr/src/redhat/{SOURCES,SPECS} /usr/src/redhat/SOURCES: haproxy-1.2.3.tar.gz /usr/src/redhat/SPECS: haproxy.spec
找到spec文件,進行備份、修改cookie
# cd /usr/src/redhat/SPECS # cd /usr/src/redhat/SPECS # cp haproxy.spec haproxy.spec_bak$(date +%F) # ls haproxy.spec haproxy.spec_bak2013-01-06
3.2 方法2:新建spec文件再目錄SPECS下,建立一個新的spec文件,根據spec文件語法規範編寫,這個難度較高,適用於本身開發的軟件。3.3 方法3:從源碼包中獲取已有spec文件 (推薦的方法)運維
# tar zxf haproxy-1.4.22.tar.gz # cd haproxy-1.4.22 # ll haproxy.spec -rw-rw-r-- 1 root root 7442 Aug 14 15:09 haproxy.spec #cd haproxy-1.4.22/examples/ # ls haproxy.spec
將spec放入目錄SPECS
# cp haproxy.spec /usr/src/redhat/SPECS/
備份
# cp haproxy.spec haproxy.spec.$(date +%F)
本文采用此方法獲取spec4、編輯spec
# pwd /usr/src/redhat/SPECS # vim haproxy.spec
修改先後內容對比(後面爲原文件)
[root@study02 SPECS]# diff haproxy.spec haproxy.spec.2013-01-07 4c4 < Release: 20130106_hexun_as5 --- > Release: 1 36c36 < %{__make} ARCH=%{_target_cpu} TARGET=linux26 --- > %{__make} USE_PCRE=1 DEBUG="" ARCH=%{_target_cpu} TARGET=linux26
5、下載HAProxy源碼包下載源碼包並放入SOURCES目錄中
# pwd /usr/src/redhat/SOURCES # wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.22.tar.gz # ls haproxy-1.4.22.tar.gz
6、建立RPM 包經過rpmbuild命令來解析SPEC文件生成對應的RPM包6.1 確認rpmbuild 已經安裝
# yum install rpm-build -y
6.2 安裝依賴包在build rpm包的系統上安裝pcre-devel
# yum -y install pcre-devel
6.3開始build rpm:
# rpmbuild -v -ba SPECS/haproxy.spec
6.4 看到以下內容即建立過程,紅色內容爲build包位置
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.44698 + umask 022 + cd /usr/src/redhat/BUILD + + export LANG + unset DISPLAY + cd /usr/src/redhat/BUILD + rm -rf haproxy-1.4.22 + /bin/gzip -dc /usr/src/redhat/SOURCES/haproxy-1.4.22.tar.gz + tar -xf - + STATUS=0 …………略……………… Wrote: /usr/src/redhat/SRPMS/haproxy-1.4.22-20130106_hexun_as5.src.rpm Wrote: /usr/src/redhat/RPMS/x86_64/haproxy-1.4.22-20130106_hexun_as5.x86_64.rpm Wrote: /usr/src/redhat/RPMS/x86_64/haproxy-debuginfo-1.4.22-20130106_hexun_as5.x86_64.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.75459 + umask 022 + cd /usr/src/redhat/BUILD + cd haproxy-1.4.22 + '[' /var/tmp/haproxy-1.4.22-root '!=' / ']'+ /bin/rm -rf /var/tmp/haproxy-1.4.22-root + exit 0 #注意輸出status爲0 即建立過程錯誤
7、檢驗RPM包7.1 使用 Mock 和 Koji 去測試 RPM 包詳見 Fedora 新軟件維護者指南7.2 列出RPM軟件包內的文件信息
# rpm -qpl /usr/src/redhat/RPMS/x86_64/haproxy-1.4.22-20130106_hexun_as5.x86_64.rpm /etc/haproxy /etc/haproxy/haproxy.cfg /etc/rc.d/init.d/haproxy /usr/sbin/haproxy /usr/share/doc/haproxy-1.4.22 /usr/share/doc/haproxy-1.4.22/CHANGELOG /usr/share/doc/haproxy-1.4.22/TODO /usr/share/doc/haproxy-1.4.22/acl-content-sw.cfg /usr/share/doc/haproxy-1.4.22/architecture.txt /usr/share/doc/haproxy-1.4.22/auth.cfg /usr/share/doc/haproxy-1.4.22/build.cfg /usr/share/doc/haproxy-1.4.22/configuration.txt /usr/share/doc/haproxy-1.4.22/content-sw-sample.cfg /usr/share/doc/haproxy-1.4.22/cttproxy-src.cfg /usr/share/doc/haproxy-1.4.22/examples.cfg /usr/share/doc/haproxy-1.4.22/haproxy-en.txt /usr/share/doc/haproxy-1.4.22/haproxy-fr.txt /usr/share/doc/haproxy-1.4.22/haproxy.cfg /usr/share/doc/haproxy-1.4.22/option-http_proxy.cfg /usr/share/doc/haproxy-1.4.22/tarpit.cfg /usr/share/doc/haproxy-1.4.22/test-section-kw.cfg /usr/share/doc/haproxy-1.4.22/url-switching.cfg /usr/share/man/man1/haproxy.1.gz
7.3 列出RPM軟件包的描述信息
# rpm -qpi /usr/src/redhat/RPMS/x86_64/haproxy-1.4.22-20130106_hexun_as5.x86_64.rpm Name : haproxy Relocations: (not relocatable) Version : 1.4.22 Vendor: (none) Release : 20130106_hexun_as5 Build Date: Mon 07 Jan 2013 09:36:21 AM CST Install Date: (not installed) Build Host: study02 Group : System Environment/Daemons Source RPM: haproxy-1.4.22-20130106_hexun_as5.src.rpm Size : 1275757 License: GPL Signature : (none) URL : http://haproxy.1wt.eu/ Summary : HA-Proxy is a TCP/HTTP reverse proxy for high availability environments Description : HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments. Indeed, it can: - route HTTP requests depending on statically assigned cookies - spread the load among several servers while assuring server persistence through the use of HTTP cookies - switch to backup servers in the event a main one fails - accept connections to special ports dedicated to service monitoring - stop accepting connections without breaking existing ones - add/modify/delete HTTP headers both ways - block requests matching a particular pattern It needs very little resource. Its event-driven architecture allows it to easily handle thousands of simultaneous connections on hundreds of instances without risking the system's stability.
7.4 rpm方式安裝驗證
[root@study01 tools]# rpm -ivh haproxy-1.4.22-20130106_hexun_as5.x86_64.rpm Preparing... ########################################### [100%] 1:haproxy ########################################### [100%] [root@study01 tools]# ls haproxy-1.4.22-20130106_hexun_as5.x86_64.rpm [root@study01 tools]# ls /etc/haproxy/ #安裝目錄及主配置文件 haproxy.cfg [root@study01 tools]# ll /etc/rc.d/init.d/haproxy #服務啓動文件-rwxr-xr-x 1 root root 2553 Jan 7 09:36 /etc/rc.d/init.d/haproxy [root@study01 tools]# ll /etc/init.d/haproxy -rwxr-xr-x 1 root root 2553 Jan 7 09:36 /etc/init.d/haproxy [root@study01 tools]# rpm -qf /etc/init.d/haproxy #查看軟件所屬軟件包 haproxy-1.4.22-20130106_hexun_as5
至此定製RPM包已經制做完畢,接下來咱們就能夠把經常使用的應用軟件源碼包都製做爲rpm包放入yum倉庫,之後部署軟件就很便捷了。
8、將定製的RPM加入yum倉庫 所需工具createrepo 、yum-arch 詳見很早之前寫的yum server搭建文章 《 CentOS基於 http服務 搭建yum 源 服務器 》 http://bbs.linuxtone.org/thread-4439-1-1.html 8.1 在yum server上配置[root@hxinstall 5ASU8]# cd /opt/ftp/pub/os/Linux/Centos/x86_64/Centos5.8/ [root@hxinstall Centos5.8]# ls dvd install # cd RPMS.hexun/ # ls haproxy-1.4.22-20130106_hexun_as5.x86_64.rpm
8.2 建立repodata 數據庫包含rpm 包的詳細信息,依賴關係等
[root@hxinstall RPMS.hexun]# createrepo /opt/ftp/pub/os/Linux/Centos/x86_64/Centos5.8/RPMS.hexun 1/1 - haproxy-1.4.22-20130106_hexun_as5.x86_64.rpm Saving Primary metadata Saving file lists metadata Saving other metadata
8.3 RPM包分析在目錄下產生 heaers 目錄
# yum-arch -l /opt/ftp/pub/os/Linux/Centos/x86_64/Centos5.8/RPMS.hexun # ls haproxy-1.4.22-20130106_hexun_as5.x86_64.rpm headers repodata
注意:每添加新的軟件包,都須要執行此兩個命令使其生效。8.4 yum 客戶端安裝定製版HAProxy8.4.1 配置yum添加定製軟件包yum倉庫
cat << EOF >> /etc/yum.repos.d/CentOS-Base.repo [hexun] name= hexun rpm baseurl=http://10.0.251.154/pub/os/Linux/Centos/x86_64/Centos5.8/RPMS.hexun gpgcheck=0 EOF
8.4.2 YUM安裝自定製HAProxy 軟件包
# yum clean all# yum install haproxy -y Loaded plugins: fastestmirror Determining fastest mirrors ……略………… hexun | 951 B 00:00 hexun/primary | 1.2 kB 00:00 hexun 1/1 Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package haproxy.x86_64 0:1.4.22-20130106_hexun_as5 set to be updated ………略……… Running Transaction Installing : haproxy 1/1 Installed: #yum已經安裝成功 haproxy.x86_64 0:1.4.22-20130106_hexun_as5
# yum remove haproxy -y Loaded plugins: fastestmirror Setting up Remove Process Resolving Dependencies --> Running transaction check ---> Package haproxy.x86_64 0:1.4.22-20130106_hexun_as5 set to be erased --> Finished Dependency Resolution Dependencies Resolved =================================================================================== Package Arch Version Repository Size=================================================================================== Removing: haproxy x86_64 1.4.22-20130106_hexun_as5 installed 1.2 M Transaction Summary =================================================================================== Remove 1 Package(s) Reinstall 0 Package(s) Downgrade 0 Package(s) Downloading Packages: Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Erasing : haproxy 1/1 Removed: #已經成功卸載 haproxy.x86_64 0:1.4.22-20130106_hexun_as5 Complete!
9、製做RPM報錯記錄9.1 build包報錯找不到源碼包
# rpmbuild -v -ba SPECS/haproxy.spec error: File /usr/src/redhat/SOURCES/haproxy-1.4.22.tar.gz: No such file or directory
解決:將對應版本源碼包放入對應目錄
# cd /usr/src/redhat/SOURCES/ [root@study02 SOURCES]# wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.22.tar.gz
9.2 build時報依賴關係錯誤
# rpmbuild -v -ba SPECS/haproxy.spec error: Failed build dependencies: pcre-devel is needed by haproxy-1.4.22-20130106_hexun_as5.x86_64
解決:在build rpm包的系統上安裝pcre-devel
# yum -y install pcre-devel
10、製做RPM包涉及到的命令用法10.1 命令rpmbuild用法:
Usage: rpmbuild [ <specfile> | <tarball> | <source package> ]
經常使用參數:-bb 只編譯二進制rpm包-bs 只編譯源碼rpm包(src.rpm)-ba 同時編譯二進制和源碼rpm包(src.rpm)-bp執行到%prep段,解開tar包而後把全部的補丁文件合併而生成一個完整的具最新功能的源文件10.2 命令rpmrpm 命令之前的linux版本較經常使用,可是解決軟件包依賴關係就比較麻煩,不如yum便捷。用法:
Usage: rpm [OPTION...]
經常使用的rpm參數組合:
(1)rpm -qx file_name, x={f,i,l,a,p...}, file_name能夠是命令名、動態庫名稱、配置文件名等等。 使用此命令的前提:相應的rpm包已經安裝。 rpm -qf file:查詢文件file是哪一個rpm包中的;rpm -qf `which your_cmd`, rpm -qf `locate file_name` rpm -qi rpm_name:查看指定rpm包安裝的詳細信息; rpm -ql installed_rpm_name:列出已經安裝的rpm包中包含了哪些文件及他們的安裝路徑。如rpm -ql iptraf 用如下選項與 -q 連用來指明要查詢哪些軟件包的信息。這些選項被稱之爲「軟件包指定選項」: -a 查詢全部已安裝的軟件包。 -f <file> 將查詢包含有文件 <file>的軟件包。 -p <packagefile> 查詢軟件包文件名爲 <packagefile>的包。 有幾種方式來指定查詢軟件包時所顯示的信息。 如下選項可經過讀取rpm包頭部的辦法顯示rpm包的信息,這樣的選項被稱做「信息選擇選項」: -i 顯示軟件包信息,如描述、發行號、大小、編譯日期、安裝日期、硬件平臺、以及其它一些各種信息。 -l 列出軟件包中包含的文件。(列出已經安裝的rpm包中包含了哪些文件及他們的安裝路徑) -s 顯示軟件包中全部文件的狀態。 -d 列出被標註爲文檔的文件 (如,man 手冊、 info 信息、README,等等) 。 -c 列出被標註爲配置文件的文件。這些文件是須要在安裝完畢後加以定製的,如 (sendmail.cf, passwd, inittab, 等) 。 若是要在執行上述選項的同時,顯示文件列表, 能夠同時使用 -v 命令行選項,就能得出與 ls -l 格式相似的輸出。 (2)查看未安裝的rpm/src.rpm包中包含的文件列表 - 在本地暫時只能使用(4)中提供的方法; - 經過rpmfind.net等網站進行查詢; (3)rpm -ivh xxx.rpm:從新安裝;(和-Uvh相比,建議用-ivh) rpm -ivh --relocate /=/tmp/test/ xxx.rpm (4)rpm2cpio xxx.rpm/xxx.src.rpm:將rpm解壓爲cpio歸檔; rpm2cpio xxx.rpm/xxx.src.rpm | cpio -idmv (rpm2cpio xxx.rpm | cpio --extract --make-directories) 參數-i(或--extract)表示提取文件; v表示指示執行進程;-d(或--make-directory)表示根據包中文件原來的路徑創建目錄;m表示保持文件的更新時間。
10.3 命令 yum目前yum命令在安裝軟件包時很經常使用,這裏再也不一一列舉用法參數。經常使用命令可參考http://bbs.linuxtone.org/thread-4439-1-1.html11、參考資料RPM 打包技術與典型 SPEC 文件分析http://www.ibm.com/developerworks/cn/linux/l-rpm/?S_TACT=105AGX52&S_CMP=tech-51CTO經常使用的rpm參數組合http://www.xdays.info/rpm%E5%8C%85%E5%88%B6%E4%BD%9C.html#fileRPM使用筆記http://rdc.taobao.com/blog/cs/?p=43#sec-7How to create an RPM package/zh-cnhttps://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh-cn#.E6.96.B0.E5.BB.BA.E4.B8.80.E4.B8.AA.E7.A9.BA.E7.99.BD.E7.9A.84_.spec_.E6.96.87.E4.BB.B6Fedora 新軟件維護者指南https://fedoraproject.org/wiki/Fedora_%E6%96%B0%E8%BD%AF%E4%BB%B6%E7%BB%B4%E6%8A%A4%E8%80%85%E6%8C%87%E5%8D%97?rd=Fedora%E9%8F%82%E6%9D%BF%EE%9A%9C%E6%B5%A0%E5%89%81%E6%B7%AE%E9%8E%B6%E3%82%88%E2%82%AC%E5%91%AE%E5%AF%9A%E9%8D%97?#.E4.BD.BF.E7.94.A8_Mock_.E5.92.8C_Koji_.E5.8E.BB.E6.B5.8B.E8.AF.95_RPM_.E5.8C.85最近看有網友使用EPM(Effing Package Management),方便易用,有空我也學習使用下,先將資料分享給你們,一塊兒學習:
https://github.com/jordansissel/fpm/wiki
本文出自 「Dreamway的運維點滴」 博客,請務必保留此出處http://dreamway.blog.51cto.com/1281816/1110874