在實際的應用之中,二進制包的使用顯得有些麻煩,最好的辦法還是將源碼包制作成為RPM包,放進yum倉庫,再使用類似于puppet來進行管理工作。這樣會方便許多,做運維的,你懂的。
其實,制作RPM軟件包并不是一件復雜的工作,其中的關鍵在于編寫SPEC軟件包描述文件。下面我詳細說明一下RPM軟件包的制作過程。
一個RPM 包的制作主要有這幾個步驟:
1 計劃好你想做什么。有的rpm包是一個軟件,但有的例如cacti是一大堆的網(wǎng)頁文件。是純粹的文件還是庫文件還是軟件源碼。
2 獲取軟件包原材料。例如二進制包等,要最原始的
3 給需要的軟件打補丁
4 制作一個可以指定安裝路徑的rpm包(較麻煩,不講)
5 考慮升級關系
6 規(guī)劃好依賴關系 寫SPEC文件,整體過程寫進去
7 制作開始。有的還有證書簽署:使用GPG密鑰簽署RPM軟件包??梢允褂胷pmbuild -ba -sign name.spec一步完成構建和簽署軟件包。使用rpm --resign name-version.rpm添加或更改GPG簽名
8 測試
其中的重點是SPEC文件的書寫
######################################
第一步:設定目錄(需大寫) 、工作目錄(紅帽6 中還有buildroot )
1 設置制作目錄、需要的目錄結構 (注意: 一定不能使用root 用戶進行,至于為什么知道么?)
rpm包的制作(building)是在一個類似于工作空間的地方,這個工作空間的默認地址是 /usr/src/redhat,因為默認權限是root,所以一般自定義一個目錄。
這就是為 rpm-build 提供的目錄結構.?
- /usr/src/redhat/?
- ?
- |--?BUILD?
- ?
- |--?RPMS?
- ?
- |???|--?i386?
- ?
- |???`--?...?
- ?
- |--?SOURCES?
- ?
- |???|--?foo-1.2.tar.gz?
- ?
- |???|--?foo-1.2-add_feature.patch?
- ?
- |???`--?foo-1.2-change_default.patch?
- ?
- |--?SPECS?
- ?
- |???`--?foo.spec?
- ?
- `--?SRPMS?
BUILD: 源代碼解壓,編譯的車間,自己不用放東西,里面放什么不用管
RPMS: 里面還有不同的平臺的子目錄,生成的rpm包就在這里,可以用rpm交叉編譯編譯其他平臺的
SOURCES: 原材料的位置
SPECS:spec文件的存放位置
SRPMS:src格式的rpm包存放的位置,沒有平臺相關性了,沒有子目錄了
2 把源程序放在指定位置
即創(chuàng)建一個包含RPM文件的.tar.gz文件。這個 目錄還讓創(chuàng)建檔案文件更加簡單。該.tar.gz文件需要位于名為rpmbuild/SOURCES的目錄下。你還需要一個.specs文件,這個文件包 含所有建立RPM包的規(guī)范說明。該.specs文件是RPM包的核心組件,里面包括全部文件的 指示,RPM包中的文件按照這些指示進行安裝。該.specs文件應該放置在一個SPECS目錄下。
3 rpmbuild命令:
目錄結構知道之后就需要了解一下rpmbuild命令了
當spec文件創(chuàng)建好之后就是時候完成最終的工作了。請使用根目錄用戶身份安裝rpmbuild命令。在Red Hat中,請用yum install rpm-build完成這項工作。接下來,請確保所有的文件都呆在正確的地方。Tar存檔文件必須位于創(chuàng)建軟件包的當前用戶帳戶的~/rpmbuild /SOURCES 目錄下,demo.spec文件必須位于~/rpmbuild/SPECS目錄下?,F(xiàn)在你可以用rpmbuild -ba test.spec命令來創(chuàng)建軟件包了。這會在/usr/src/redhat/RPMS目錄下創(chuàng)建你的RPM文件。
--------------------------------------------------------------------------------------------------------------
#注釋:
如何更改rpmbuild的制作目錄:
rpmbuild --showrc | grep macrofiles
macrofiles這個宏定義這些宏到底在什么文件中設定,類似于profile等
這么多最后一個匹配的生效:家目錄下隱藏的rpmmacros文件
在家目錄重新定義一次即可不適用系統(tǒng)自帶的
實際上是_topdir定義
_usrsrc定義的又在_src下
更改的話在自己的家目錄下建一個.rpmmacros
里面直接寫:
%_topdir??? /home/xxx/rpmbuild
退出 再
mkdir -pv rpmbuild/{BUILD,RPMS,SOURCES,SPECSSRPMS}
-------------------------------------------------------------------------------------------
##########################################
第二步:創(chuàng)建spec 文件:這一步是最重要的!
一個spec 文件主要由幾個段落組成:
introduction section 介紹段:
prep section 準備階段:
build section 編譯階段:
build section 編譯階段:
install section 安裝階段:
clean section :清理段
files section :文件段
changelog section :改變段
每一個階段以% 加階段名開始
?
事先注意:
1注意,spec 文件很多信息都是取自宏指令,如果沒有明確指定,就會繼承 /usr/lib/rpm/macros 和其它相關宏指令的文件.
?
?
introduction section 介紹段:
就是rpm -qi可以查詢出來的那一段
先看看一個軟件包的信息: -qi查詢
?
- %define?name?foo?#?名字?
- ?
- %define?version?16?#version?
- ?
- Name:?%{name}?#name?就是使用的上面的宏指令?
- ?
- Version:?%{version}?#version?也是使用的上面的宏指令?
- ?
- Release:?1?
- ?
- License:?GPL?
- ?
- Group:?Applications/Productivity?#?軟件是哪個組的,更多信息查看?/usr/share/doc/rpm-version/GROUPS?
- ?
- URL:?http://www.mysqlops.com?
- ?
- Source:?ftp://www.mysqlops.com/pub/xxx.tar.gz?
- ?
- Patch0:?foo-1.2-change_default.patch?
- ?
- Patch1:?foo-1.2-add_feature.patch?
- ?
- PreReq:?unzip?#?安裝前需要什么?
- ?
- Requires:?pam?#?安裝后需要什么?
- ?
- BuildPreReq:?gcc? > =?2.96?#打包前需要什么?
- ?
- BuildRoot:?%{_tmppath}/%{name}-root?#?準備源碼文件的?chroot?的目錄?
- ?
- Summary:?A?fictional?open?source?package?for?the?offering.?#摘要?
- ?
- %description?#描述?
relocatable:是否可以更改安裝位置
summary:簡單的說明信息
Version:中間不能使用橫線
release后面還有關于平臺的宏:%{?dist},?帶判斷,只是rpm包制作者自己制作的次數(shù),rpm包的發(fā)行號
Group: 支持的可以 less? /usr/share/doc/rpm-xxx/GROUP 下查看 需要明確知道
Vendor:制作者的提供商
Source:也支持宏
BuildRoot:rpmbuild生成的文件在這個目錄之下,和chroot感覺類似
BuildRequires:依賴關系
prep section 準備階段:
%prep 這部分其它是由一些參數(shù)來組成一個 shell 腳本來從 SOURCES 中解壓源碼和應用補丁到 BUILD 目錄中來準備下面的編譯.
和 %prep 相關的宏指令
%setup
%patch例:
?
- %prep??
- %setup?-q???#提取源碼到?BUILD?目錄;?-q?指不顯示輸出(quietly)??
- %patch0?-p1??#?應用?patch0??
- %patch1?-p1?-b?.orig???#?應用?Patch1?但是存下源文件成?.oring?的后綴??
- unzip?foo_data.zip???#?接下來解壓?zip?文件?
build section 編譯階段:
%build 是編譯和準備軟件,運行象一個 shell 腳本,它運行在上下文目錄指定的源碼目錄.在編譯過程中,調(diào)用腳本 .config 在本地的目錄(%configure 中配置的).
和 %build 相關的宏
%configure? # 可以通過運行 rpm -eval %configure 來看它的設置例:
?
- %build??
- %configure?–enable-shared??
- CFLAGS =-O2?make?
或者直接用%configure來做,類似于%setup
?_smp_mflags 判斷是否是smp對稱多處理器
install section 安裝階段:
%install開頭:
先刪除,為了此前安裝的影響這一次
make DESTDIR指定安裝目錄
find_lang先不管
%install 是用來做 rpm 安裝所有需要的文件.這些打包的文件會復制到前面的講的 BuildRoot 中的目錄樹中.通常這個目錄是使用的 /var/tmp 中.
$RPM_BUILD_ROOT 參數(shù)來設置 BuildRoot.主要不能使用真實目錄來設置的主要原因是,在編譯的過程中有可能會有文件替換到你系統(tǒng)中的文件引起系統(tǒng)
和軟件問題.對其它的文件路徑象在 %{_mandir}, %{_bindir} , %{_sysconfdir} 等等,都是使用預先定義的宏來指定的.
默認都是跑在這個 RPM_BUILD_ROOT 目錄下的.
例:?
- %install?
- ?
- rm?-rf?$RPM_BUILD_ROOT???#?默認的$RPM_BUILD_ROOT?是?/var/tmp/%{name}-root?
- ?
- make? DESTDIR =$RPM_BUILD_ROOT?install???#?指定安裝文件的路徑?
- ?
- install?-m644?foo.8?${RPM_BUILD_ROOT}/%{_mandir}/man8/foo.8?
?
?
注釋:
腳本段:安裝之后有時候還有這一段 Scriptlets
這些選項可以讓你動態(tài)的使用 shell 腳本來控制安裝和刪除,
%pre,%post? 是用腳本運行在包安裝后,注意沒法交互
%preun,%postun? 用腳本運行在包刪除時
rpm -q –scripts packagename # 可以看到腳本的信息例如:
- %pre?
- ?
- groupadd?-g?201?foo?
- ?
- useradd?-g?foo?-s?/bin/false?-d?/var/foo?-M?foo?
- ?
- %post?
- ?
- /sbin/ldconfig?
- ?
- chkconfig?--add?food?
- ?
- %preun?
- ?
- if?[??=?0?]?
- ?
- then?
- ?
- ?????service?food?stop? > ?/dev/null?2 > &1?
- ?
- ?????chkconfig?--del?food?
- ?
- fi?
- ?
- %postun?
- ?
- if?[??=?0?]?
- ?
- then?
- ?
- ?????userdel?foo?
- ?
- ?????groupdel?foo?
- ?
- else?
- ?
- ?????/sbin/ldconfig?
- ?
- ?????service?food?condrestart? > ?/dev/null?2 > &1?
- ?
- fi?
?
?
注意,在這個當中的數(shù)字,如果是 1 是指是第一次安裝,如果是 2 是指也許是升級.如果是 0 在 %postun , 是指被完全的刪除.
例如httpd在安裝后增加用戶等
有%pre安裝前
%post安裝后
%preun卸載前
%postun卸載后,不需要留空即可
旁注:install可以當做cp用
-----------------------------------------------------------------------------------------
clean section :清理段
%clean 是用來清理 build 后的臨時文件,主要是怕這些舊的文件影響以后編譯.主要是要刪除 $RPM_BUILD_ROOT 和運行 make clean .
例:
- %clean??
- rm?-rf?$RPM_BUILD_ROOT??
- make?clean??
files section :文件段
defattr 定義默認權限
%files 任何打包的文件,都需要在這個包的詳細的文件列表中,如果是目錄,包的所有者的全部目錄都在中間,%dir 來指定空目錄,可以用
%files -f /tmp/dyanmic_filelist 來指定一個文件列表.默認 %config 會替換掉配置,給原來的配置修改名字為 .rpmorig,
如果不想修改的話,就用%config(noreplace) 就會給新的配置文件名字命名為 .rpmnew.
%defattr(mode,user,group)
%attr(mode,user,group) filename
%config? 配置文件
%doc 文檔
例:?
- %files?
- %defattr(-,root,root)?
- %config?/etc/foo.conf?#?指定了才能在更新和刪除時有用?
- /usr/sbin/food?
- /usr/bin/foo?
- %doc?README?#?目錄是在?/usr/share/doc/%{name}-%{version}?
- %doc?/usr/share/man/man8/food.8?
- /usr/share/foo/?
- %dir?/var/lock/foo/??#?空的目錄?
?
?
changelog section :改變段
%changelog 是記錄包的修改,比如加入一個新的補丁,修改配置,日志使用 data +”%a %b %d %Y”,
需要顯示包的日志改變的信息可以使用 rpm-q –changelog.例:%changelog
? Mon Aug 5 2002 Elvis Presley#########################################
第三步:制作RPM 包
rpmbuild命令
過程可以分階段
-bb??? 制作成二進制
-bs??? 源碼形式
-ba??? 源碼和二進制兩種形式
-bl??? 制作后檢測buildroot生成但沒有包含到rpm包中的文件,注意如果生成未包含進去會出錯
-bc??? 只執(zhí)行到%
-bi??? 只執(zhí)行到%install段
-bp??? 只執(zhí)行到%prep段
本文出自 “ mumaren野豬地 ” 博客,請務必保留此出處 http://mumaren.blog.51cto.com/4180778/971507
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
