當(dāng)前位置: 首頁(yè)IT技術(shù) → 制作RPM安裝包分解教程

制作RPM安裝包分解教程

更多

我們?cè)谄髽I(yè)中有的軟件基本都是編譯的,我們每次安裝都得編譯真的是很煩唉,那怎么辦呢?那就根據(jù)我們的需求制作RPM安裝包吧。先來(lái)說(shuō)說(shuō)基本布驟:

1.Planning what you want             計(jì)劃做什么rpm包。軟件的?庫(kù)的? 

2.Gathering the software to package  收集原材料,即收集源碼包 

3.Patch the software as need         如果需要打補(bǔ)丁,收集補(bǔ)丁文件。此布驟不是必須 

4.Outling any dependenies            確定依賴(lài)關(guān)系包 

------------------  上述動(dòng)作可由我們手動(dòng)編譯一次軟件來(lái)確定  ------------------- 

5.Building RPMs                      開(kāi)始動(dòng)手制作RPM包 

    5.1 Set up the directory stucture 設(shè)定好目錄結(jié)構(gòu),我們?cè)谶@些目錄中制作我們的RPM包,我們需要下列目錄 

        BUILD   源代碼解壓后的存放目錄 

        RPMS    制作完成后的RPM包存放目錄,里面有與平臺(tái)相關(guān)的子目錄 

        SOURCES 收集的源材料,補(bǔ)丁的存放位置 

        SPECS   SPEC文件存放目錄 

        SRMPS   存放SRMPS生成的目錄 

    5.2 Place the Sources in the right directory   把源材料放到正確的位置 

    5.3 Create a spec file that tell rpmbuild command what to do 創(chuàng)建spec文件,這是綱領(lǐng)文件,rpmbuild命令根據(jù)spec文件來(lái)制作合適的rpm包 

    5.4 Build the source and binary RPMS 制作src或二進(jìn)制rpm包 

6.Test RPMS 測(cè)試制作的PRM包 

7.Add signature for RPM  為RPM包簽名 

我還是用連貫的話為大家敘述一遍吧,我們首先確實(shí)我們要為什么做rpm包,通常我們是為一些軟件,比如httpd,nginx等,然后去收集這些軟件包的源代碼,如果有需要的話也收集這些補(bǔ)丁文件,手動(dòng)編譯安裝一下這個(gè)軟件(當(dāng)然如果是不需要編譯的就不用演練了),確定依賴(lài)的軟件包,并記錄下來(lái),下面開(kāi)始準(zhǔn)備制作tengine的PRM包吧:

1.建立一個(gè)普通用戶(hù),有普通用戶(hù)來(lái)制作rpm,用root的可能會(huì)因?yàn)榇a問(wèn)題導(dǎo)致毀滅的后果

useradd ibuler 

su - ibuler 

2.確定我們?cè)谀膫(gè)目錄下制作RPM,通常這個(gè)目錄我們topdir,這個(gè)需要在宏配置文件中指定,這個(gè)配置文件稱(chēng)為macrofiles,它們通常為 /usr/lib/rpm/macros:/usr/lib/rpm/macros.*:~/.rpmmacros,這個(gè)在rhel 5.8中可以通過(guò)rpmbuild --showrc | grep macrofiles  查看,6.3的我使用這個(gè)找不到,但使用是一樣的。你可以通過(guò)rpmbuild --showrc | grep topdir 查看你系統(tǒng)默認(rèn)的工作車(chē)間 

rpmbuild --showrc | grep topdir 

-14: _builddir  %{_topdir}/BUILD 

-14: _buildrootdir  %{_topdir}/BUILDROOT 

-14: _rpmdir    %{_topdir}/RPMS 

-14: _sourcedir %{_topdir}/SOURCES 

-14: _specdir   %{_topdir}/SPECS 

-14: _srcrpmdir %{_topdir}/SRPMS 

-14: _topdir    %{getenv:HOME}/rpmbuild 

我們還是自定義工作目錄(或車(chē)間)吧

vi ~/.rpmmacros 

%_topdir        /home/ibuler/rpmbuild    ##目錄可以自定義 

mkdir ~/rpmbuild  

3.在topdir下建立需要的目錄

cd ~/rpmbuild  

mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} 

4.把收集的源碼放到SOURCES下

cp /tmp/tengine-1.4.2.tar.gz SOURCES  ##事先放好的

5.在SPECS下建立重要的spec文件

cd SPECS 

vi tengine.spec          ##內(nèi)容見(jiàn)后講解,rhel6.3會(huì)自動(dòng)生成模板 

6.用rpmbuild命令制作rpm包,rpmbuild命令會(huì)根據(jù)spec文件來(lái)生成rpm包 

rpmbuild  

-ba 既生成src.rpm又生成二進(jìn)制rpm 

-bs 只生成src的rpm 

-bb 只生二進(jìn)制的rpm 

-bp 執(zhí)行到pre 

-bc 執(zhí)行到 build段 

-bi 執(zhí)行install段 

-bl 檢測(cè)有文件沒(méi)包含 

我們可以一步步試,先rpmbuild -bp ,再-bc 再-bi 如果沒(méi)問(wèn)題,rpmbuild -ba 生成src包與二進(jìn)制包吧

7.安裝測(cè)試有沒(méi)有問(wèn)題,能否正常安裝運(yùn)行,能否正常升級(jí),卸載有沒(méi)有問(wèn)題

root用戶(hù)測(cè)試安裝:

cd /tmp

cp /home/ibuler/rpmbuild/RPMS/x86_64/tengine-1.4.2-1.el6.x86_64.rpm /tmp  

rpm -ivh tengine-1.4.2-1.el6.x86_64.rpm  ##測(cè)試安裝 

rpm -e tengine                           ##測(cè)試卸載,如果版本號(hào)比原來(lái)的高,升級(jí)測(cè)試 

8.如果沒(méi)問(wèn)題為rpm包簽名吧,防止有人惡意更改    ##這個(gè)先不寫(xiě)了,有點(diǎn)晚了,以后補(bǔ)上

到此整個(gè)流程完畢。下面來(lái)說(shuō)說(shuō)其中最最重要的spec的格式,先說(shuō)最簡(jiǎn)單的,最容易實(shí)現(xiàn)的

vi tengine.spec 

### 0.define section               #自定義宏段,這個(gè)不是必須的 

### %define nginx_user nginx       #這是我們自定義了一個(gè)宏,名字為nginx_user值為nginx,%{nginx_user}引用 

### 1.The introduction section      #介紹區(qū)域段 

Name:           tengine            #名字為tar包的名字 

Version:        1.4.2              #版本號(hào),一定要與tar包的一致哦 

Release:        1%{?dist}          #釋出號(hào),也就是第幾次制作rpm 

Summary:        tengine from TaoBao  #軟件包簡(jiǎn)介,最好不要超過(guò)50字符 

Group:          System Environment/Daemons  #組名,可以通過(guò)less /usr/share/doc/rpm-4.8.0/GROUPS 選擇合適組 

License:        GPLv2                       #許可,GPL還是BSD等  

URL:            http://laoguang.blog.51cto.com   #可以寫(xiě)一個(gè)網(wǎng)址 

Packager:       Laoguang <ibuler@qq.com> 

Vendor:         TaoBao.com 

Source0:        %{name}-%{version}.tar.gz   

#定義用到的source,也就是你收集的,可以用宏來(lái)表示,也可以直接寫(xiě)名字,上面定義的內(nèi)容都可以像上面那樣引用 

#patch0:            a.patch                 #如果需要補(bǔ)丁,依次寫(xiě) 

BuildRoot:      %_topdir/BUILDROOT         

#這個(gè)是軟件make install 的測(cè)試安裝目錄,也就是測(cè)試中的根,我們不用默認(rèn)的,我們自定義,

#我們可以來(lái)觀察生成了哪此文件,方便寫(xiě)file區(qū)域 

BuildRequires:  gcc,make                           #制作過(guò)程中用到的軟件包 

Requires:       pcre,pcre-devel,openssl,chkconfig  #軟件運(yùn)行需要的軟件包,也可以指定最低版本如 bash >= 1.1.1 

%description                                       #軟件包描述,盡情的寫(xiě)吧 

It is a Nginx from Taobao.                         #描述內(nèi)容 

###  2.The Prep section 準(zhǔn)備階段,主要目的解壓source并cd進(jìn)去 

%prep                                              #這個(gè)宏開(kāi)始 

%setup -q                                          #這個(gè)宏的作用靜默模式解壓并cd 

# patch0 -p1                                       #如果需要在這打補(bǔ)丁,依次寫(xiě) 

###  3.The Build Section 編譯制作階段,主要目的就是編譯 

%build 

./configure \                                      #./configure 也可以用%configure來(lái)替換 

  --prefix=/usr \                                  #下面的我想大家都很熟悉 

  --sbin-path=/usr/sbin/nginx \ 

  --conf-path=/etc/nginx/nginx.conf \ 

  --error-log-path=/var/log/nginx/error.log \ 

  --http-log-path=/var/log/nginx/access.log \ 

  --pid-path=/var/run/nginx/nginx.pid  \ 

  --lock-path=/var/lock/nginx.lock \ 

  --user=nginx \ 

  --group=nginx \ 

  --with-http_ssl_module \ 

  --with-http_flv_module \ 

  --with-http_stub_status_module \ 

  --with-http_gzip_static_module \ 

  --http-client-body-temp-path=/var/tmp/nginx/client/ \ 

  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ 

  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ 

  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ 

  --http-scgi-temp-path=/var/tmp/nginx/scgi \ 

  --with-pcre 

make %{?_smp_mflags}          #make后面的意思是:如果就多處理器的話make時(shí)并行編譯 

###  4.Install section  安裝階段 

%install                                

rm -rf %{buildroot}                #先刪除原來(lái)的安裝的,如果你不是第一次安裝的話 

make install DESTDIR=%{buildroot} 

#DESTDIR指定安裝的目錄,而不是真實(shí)的安裝目錄,%{buildroot}你應(yīng)該知道是指的什么了 

###  4.1 scripts section #沒(méi)必要可以不寫(xiě) 

%pre        #rpm安裝前制行的腳本 

if [ $1 == 1 ];then    #$1==1 代表的是第一次安裝,2代表是升級(jí),0代表是卸載 

        /usr/sbin/useradd -r nginx 2> /dev/null 

fi 

%post       #安裝后執(zhí)行的腳本 

%preun      #卸載前執(zhí)行的腳本 

if [ $1 == 0 ];then 

        /usr/sbin/userdel -r nginx 2> /dev/null 

fi 

%postun     #卸載后執(zhí)行的腳本 

###  5.clean section 清理段,刪除buildroot 

%clean 

rm -rf %{buildroot} 

###  6.file section 要包含的文件 

%files  

%defattr (-,root,root,0755)   #設(shè)定默認(rèn)權(quán)限,如果下面沒(méi)有指定權(quán)限,則繼承默認(rèn) 

/etc/           #下面的內(nèi)容要根據(jù)你在%{rootbuild}下生成的來(lái)寫(xiě),下面的辦法最簡(jiǎn)單,后面說(shuō)仔細(xì)用法      

/usr/ 

/var/ 

###  7.chagelog section  改變?nèi)罩径?nbsp;

%changelog 

*  Fri Dec 29 2012 laoguang <ibuler@qq.com> - 1.0.14-1 

- Initial version 

到此一個(gè)tengie的rmp制作好了,抽空繼續(xù),現(xiàn)在困了。睡覺(jué)去了。

熱門(mén)評(píng)論
最新評(píng)論
第 1 樓 北京開(kāi)心網(wǎng) 網(wǎng)友 客人 發(fā)表于: 2013/11/27 0:08:36
hhjhjv

支持( 0 ) 蓋樓(回復(fù))

發(fā)表評(píng)論 查看所有評(píng)論(0)
昵稱(chēng):
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)