2021-05-12 14:32:11
教你學會製作rpm安裝包
一.RPM製作步驟
我們在企業中有的軟體基本都是編譯的,我們每次安裝都得編譯,那怎麼辦呢?那就根據我們的需求製作RPM安裝包吧。先來說說基本布驟:
1.Planning what you want 計劃做什麼rpm包。軟體的?庫的?
2.Gathering the software to package 收集原材料,即收集原始碼包
3.Patch the software as need 如果需要打修補程式,收集修補程式檔案。此布驟不是必須
4.Outling any dependenies 確定依賴關係包
------------------ 上述動作可由我們手動編譯一次軟體來確定 -------------------
5.Building RPMs 開始動手製作RPM包
5.1 Set up the directory stucture 設定好目錄結構,我們在這些目錄中製作我們的RPM包,我們需要下列目錄
BUILD原始碼解壓後的存放目錄
RPMS 製作完成後的RPM包存放目錄,裡面有與平台相關的子目錄
SOURCES 收集的源材料,修補程式的存放位置
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 建立spec檔案,這是綱領檔案,rpmbuild命令根據spec檔案來製作合適的rpm包
5.4 Build the source and binary RPMS 製作src或二進位制rpm包
6.Test RPMS 測試製作的PRM包
7.Add signature for RPM 為RPM包簽名
二.RPM包製作範例
我還是用連貫的話為大家敘述一遍吧,我們首先確實我們要為什麼做rpm包,通常我們是為一些軟體,比如httpd,nginx等,然後去收集這些軟體包的原始碼,如果有需要的話也收集這些修補程式檔案,手動編譯安裝一下這個軟體(當然如果是不需要編譯的就不用演練了),確定依賴的軟體包,並記錄下來,下面開始準備製作tengine的PRM包吧:
1.建立一個普通使用者,有普通使用者來製作rpm,用root的可能會因為程式碼問題導致毀滅的後果
- useradd ibuler
- su - ibuler
2.確定我們在哪個目錄下製作RPM,通常這個目錄我們topdir,這個需要在宏組態檔中指定,這個組態檔稱為macrofiles,它們通常為 /usr/lib/rpm/macros:/usr/lib/rpm/macros.*:~/.rpmmacros,這個在rhel 5.8中可以通過rpmbuild --showrc | grep macrofiles 檢視,6.3的我使用這個找不到,但使用是一樣的。你可以通過rpmbuild --showrc | grep topdir 檢視你系統預設的工作車間
- 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
我們還是自定義工作目錄(或車間)吧
- 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 ##內容見後講解,rhel6.3會自動生成模板
6.用rpmbuild命令製作rpm包,rpmbuild命令會根據spec檔案來生成rpm包
- rpmbuild
- -ba 既生成src.rpm又生成二進位制rpm
- -bs 只生成src的rpm
- -bb 只生二進位制的rpm
- -bp 執行到pre
- -bc 執行到 build段
- -bi 執行install段
- -bl 檢測有檔案沒包含
我們可以一步步試,先rpmbuild -bp ,再-bc 再-bi 如果沒問題,rpmbuild -ba 生成src包與二進位制包吧
7.安裝測試有沒有問題,能否正常安裝執行,能否正常升級,解除安裝有沒有問題
root使用者測試安裝:
- 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 ##測試安裝
- rpm -e tengine ##測試解除安裝,如果版本號比原來的高,升級測試
8.如果沒問題為rpm包簽名吧,防止有人惡意更改 ##這個先不寫了,有點晚了,以後補上
到此整個流程完畢。下面來說說其中最最重要的spec的格式,先說最簡單的,最容易實現的
- vi tengine.spec
- ### 0.define section #自定義宏段,這個不是必須的
- ### %define nginx_user nginx #這是我們自定義了一個宏,名字為nginx_user值為nginx,%{nginx_user}參照
- ### 1.The introduction section #介紹區域段
- Name: tengine #名字為tar包的名字
- Version: 1.4.2 #版本號,一定要與tar包的一致哦
- Release: 1%{?dist} #釋出號,也就是第幾次製作rpm
- Summary: tengine from TaoBao #軟體包簡介,最好不要超過50字元
- Group: System Environment/Daemons #組名,可以通過less /usr/share/doc/rpm-4.8.0/GROUPS 選擇合適組
- License: GPLv2 #許可,GPL還是BSD等
- URL: http://laoguang.blog.51cto.com #可以寫一個網址
- Packager: Laoguang <ibuler@qq.com>
- Vendor: TaoBao.com
- Source0: %{name}-%{version}.tar.gz
- #定義用到的source,也就是你收集的,可以用宏來表示,也可以直接寫名字,上面定義的內容都可以像上面那樣參照
- #patch0: a.patch #如果需要修補程式,依次寫
- BuildRoot: %_topdir/BUILDROOT
- #這個是軟體make install 的測試安裝目錄,也就是測試中的根,我們不用預設的,我們自定義,
- #我們可以來觀察生成了哪此檔案,方便寫file區域
- BuildRequires: gcc,make #製作過程中用到的軟體包
- Requires: pcre,pcre-devel,openssl,chkconfig #軟體執行需要的軟體包,也可以指定最低版本如 bash >= 1.1.1
- %description #軟體包描述,盡情的寫吧
- It is a Nginx from Taobao. #描述內容
- ### 2.The Prep section 準備階段,主要目的解壓source併cd進去
- %prep #這個宏開始
- %setup -q #這個宏的作用靜默模式解壓並cd
- #%patch0 -p1 #如果需要在這打修補程式,依次寫
- ### 3.The Build Section 編譯製作階段,主要目的就是編譯
- %build
- ./configure #./configure 也可以用%configure來替換
- --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時並行編譯
- ### 4.Install section 安裝階段
- %install
- rm -rf %{buildroot} #先刪除原來的安裝的,如果你不是第一次安裝的話
- make install DESTDIR=%{buildroot}
- #DESTDIR指定安裝的目錄,而不是真實的安裝目錄,%{buildroot}你應該知道是指的什麼了
- ### 4.1 scripts section #沒必要可以不寫
- %pre #rpm安裝前制行的指令碼
- if [ $1 == 1 ];then #$1==1 代表的是第一次安裝,2代表是升級,0代表是解除安裝
- /usr/sbin/useradd -r nginx 2> /dev/null ##其實這個指令碼寫的不完整
- fi
- %post #安裝後執行的指令碼
- %preun #解除安裝前執行的指令碼
- if [ $1 == 0 ];then
- /usr/sbin/userdel -r nginx 2> /dev/null
- fi
- %postun #解除安裝後執行的指令碼
- ### 5.clean section 清理段,刪除buildroot
- %clean
- rm -rf %{buildroot}
- ### 6.file section 要包含的檔案
- %files
- %defattr (-,root,root,0755) #設定預設許可權,如果下面沒有指定許可權,則繼承預設
- /etc/ #下面的內容要根據你在%{rootbuild}下生成的來寫
- /usr/
- /var/
- ### 7.chagelog section 改變紀錄檔段
- %changelog
- * Fri Dec 29 2012 laoguang <ibuler@qq.com> - 1.0.14-1
- - Initial version
到此一個簡單的tengine RPM包製作好了。
三.RPM包製作拓展
下面我們來拓展一下,比如:我們想為tengine增加控制指令碼,可以通過start|stop控制,我們還想更換一下預設的首頁index.html,預設的fastcgi_params是不能直接連線php的,所以我們替換為新的組態檔,我們也可以用設定好的nginx.conf替換原來的nginx.conf。基於上述步驟下面繼續
1.把修改後的首頁檔案index.html,控制指令碼init.nginx,fastCGI組態檔fastcgi_params,Nginx組態檔nginx.conf 放到SOURCES中 。
- [ibuler@ng1 rpmbuild]$ ls SOURCES/
- fastcgi_params index.html init.nginx nginx.conf tengine-1.4.2.tar.gz
2 編輯tengine.spec,修改
2.1 介紹區域的SOURCE0下增加如下
- Source0: %{name}-%{version}.tar.gz
- Source1: index.html
- Source2: init.nginx
- Source3: fastcgi_params
- Source4: nginx.conf
2.2 安裝區域增加如下
- make install DESTDIR=%{buildroot}
- %{__install} -p -D %{SOURCE1} %{buildroot}/usr/html/index.html #%{__install}這個宏代表install命令
- %{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/nginx
- %{__install} -p -D %{SOURCE3} %{buildroot}/etc/nginx/fastcgi_params
- %{__install} -p -D %{SOURCE4} %{buildroot}/etc/nginx/nginx.conf
2.3 指令碼區域增加如下
- %post
- if [ $1 == 1 ];then
- /sbin/chkconfig --add nginx
- fi
2.4 %file區域增加如下
- %files
- %defattr (-,root,root,0755)
- /etc/
- /usr/
- /var/
- %config(noreplace) /etc/nginx/nginx.conf #%config表明這是個組態檔noplace表明不能替換
- %config(noreplace) /etc/nginx/fastcgi_params
- %doc /usr/html/index.html #%doc表明這個是文件
- %attr(0755,root,root) /etc/rc.d/init.d/nginx #%attr後面的是許可權,屬主,屬組
3. 生成rpm檔案測試
- rpmbuild -ba tengine.spec
4. 安裝測試
到此RPM包製作完畢,你可以根據你的需求製作RPM包吧。
四.RPM包簽名
1.生成GPG簽名金鑰,我用的是root使用者
- gpg --gen-key
- Your selection?1<Enter> ##預設即可
- What keysize do you want? (2048) 1024<Enter> ##金鑰長度
- Key is valid for? (0) 1y<Enter> ##有效期
- Is this correct? (y/N) y<Enter> ##確認
- Real name: LaoGuang<Enter> ##金鑰名稱
- Email address: ibuler@qq.com<Enter> ##郵件
- Comment: GPG-RPM-KEY<Enter> ##備註
- Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O<ENTER>
- Enter passphrase OK <Enter> ##使用空密碼,也可以輸入
- <Take this one anyway> <Enter>
- <Take this one anyway> <Enter>
有時可能因為亂數不夠導致卡在那裡,這時候你就yum 安裝幾個包組,馬上就夠了。
2.檢視成生的金鑰
- [root@ng1 dev]# gpg --list-keys
- /root/.gnupg/pubring.gpg
- ------------------------
- pub 1024R/49C99488 2012-11-28 [expires: 2013-11-28]
- uid LaoGuang (GPG-RPM-KEY) <ibuler@qq.com>
- sub 1024R/69BA199D 2012-11-28 [expires: 2013-11-28]
3.匯出公鑰以供大家使用驗證
- gpg --export -a "LaoGuang" > RPM-GPG-KEY-LaoGuang
4.編緝 .rpmmacros說明我們用哪一個金鑰加密,我們用root加密的那就在/root下編輯
- vi ~/.rpmmacros
- %_gpg_name LaoGuang
5.為rpm包加簽名
- rpm --addsign tengine-1.4.2-1.el6.x86_64.rpm
- Enter pass phrase: ##輸入金鑰
- Pass phrase is good.
- tengine-1.4.2-1.el6.x86_64.rpm:
到此簽名新增成功,下面來驗證
6.講剛才匯出的公鑰匯入rpm中
- rpm --import RPM-GPG-KEY-LaoGuang
7.驗證
- rpm --checksig tengine-1.4.2-1.el6.x86_64.rpm
- tengine-1.4.2-1.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
到此整個過程完畢,你也試試吧
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-02/140714.htm
相關文章