如何構建一個RPM包?

來自專欄向著詩和遠方4 人贊了文章

為什麼要自己構建RPM包??

這個原因有點多,優點也不少,下面簡單寫寫

1.官方發布了最新源碼包,但是沒有發布最新的RPM包,此時想要安裝最新的包就只能手動編譯安裝,如果我們把最新的源碼封裝成RPM包,那麼就可以繼續愉快的安裝啦

2.統一的安裝包管理,在自動化如此火爆的今天,自動部署是一個常見的功能,那麼實現自動化部署的話RPM+私有YUM倉庫也是一個不錯的選擇

3.統一的版本管理,自己寫了一個程序,每次更新都要全量跑一遍伺服器,操作的多了難免會造成線上版本的不一致,那麼此時如果把自己寫的程序封裝成一個rpm包,且做好版本管理,那麼升級是一件非常愉悅的事情,yum update 就可以解決

開始之前,先來看2個命令:

打包之前,先分析分析前人是如何打包的,這裡直接看紅帽封裝的httpd吧

查看RPM包信息:

使用yumdownloader可以把一個yum上的rpm包下載到本地而且不安裝

[root@localhost rpmbuild]# yumdownloader httpd [root@localhost rpmbuild]# ls httpd-2.2.15-59.el6.centos.x86_64.rpm httpd-2.2.15-59.el6.centos.x86_64.rpm

使用rpm -qpi可以查看一個rpm包的打包信息

[root@localhost rpmbuild]# rpm -qpi httpd-2.2.15-59.el6.centos.x86_64.rpm Name : httpd Relocations: (not relocatable)Version : 2.2.15 Vendor: CentOSRelease : 59.el6.centos Build Date: 2017年03月22日 星期三 14時53分40秒Install Date: (not installed) Build Host: c1bm.rdu2.centos.orgGroup : System Environment/Daemons Source RPM: httpd-2.2.15-59.el6.centos.src.rpmSize : 3137746 License: ASL 2.0Signature : RSA/SHA1, 2017年03月23日 星期四 23時02分13秒, Key ID 0946fca2c105b9dePackager : CentOS BuildSystem <My View - CentOS Bug Tracker>URL : The Apache HTTP Server ProjectSummary : Apache HTTP ServerDescription :The Apache HTTP Server is a powerful, efficient, and extensibleweb server.[root@localhost rpmbuild]#

使用rpm -qpi --scripts可以查看到一個rpm包中附帶的腳本幹了什麼

[root@localhost rpmbuild]# rpm -qp --scripts httpd-2.2.15-59.el6.centos.x86_64.rpm preinstall scriptlet (using /bin/sh):# Add the "apache" usergetent group apache >/dev/null || groupadd -g 48 -r apachegetent passwd apache >/dev/null || useradd -r -u 48 -g apache -s /sbin/nologin -d /var/www -c "Apache" apacheexit 0postinstall scriptlet (using /bin/sh):# Register the httpd service/sbin/chkconfig --add httpd/sbin/chkconfig --add htcachecleanpreuninstall scriptlet (using /bin/sh):if [ $1 = 0 ]; then /sbin/service httpd stop > /dev/null 2>&1 /sbin/chkconfig --del httpd /sbin/service htcacheclean stop > /dev/null 2>&1 /sbin/chkconfig --del htcachecleanfiposttrans scriptlet (using /bin/sh):test -f /etc/sysconfig/httpd-disable-posttrans || /sbin/service httpd condrestart >/dev/null 2>&1 || :[root@localhost rpmbuild]#

以上的介紹的方式其實只能部分程度的瞭解這個包的打包方式,如果要完完整整的瞭解一個包是如何構建的,還是要拿到軟體包的srpm纔可以。

紅帽官方的srpm包的獲取方式:vault.centos.org/

好啦,說了一堆沒用的,下面我們看一下如果封裝一個RPM包,我們這裡使用的是rpmbuild

首先是安裝:

[root@localhost ~]# yum -y install rpm-build

安裝完成後,不會主動的生成rpmbuild目錄,需要我們自己建立,不過我們可以主動觸發個異常讓rpmbuild自動幫我們建立了,當然你要是喜歡自己建立也OK??

首先查看一下嘍,發現沒有哎(這裡注意哈,rpmbuild只會在用戶家目錄下命名為rpmbuild)[root@localhost ~]# ll rpmbuildls: cannot access rpmbuild: No such file or directory

編譯一個不存在的spec....

[root@localhost ~]# rpmbuild -ba aaa.specerror: failed to stat /root/aaa.spec: No such file or directory #沒有指路徑肯定找不到啦[root@localhost ~]# ll rpmbuild #出來吧皮皮蝦total 24drwxr-xr-x 2 root root 4096 Sep 4 14:50 BUILDdrwxr-xr-x 2 root root 4096 Sep 4 14:50 BUILDROOTdrwxr-xr-x 2 root root 4096 Sep 4 14:50 RPMSdrwxr-xr-x 2 root root 4096 Sep 4 14:50 SOURCESdrwxr-xr-x 2 root root 4096 Sep 4 14:50 SPECSdrwxr-xr-x 2 root root 4096 Sep 4 14:50 SRPMS

OK 那麼現在編譯環境搞定了,我們看看這幾個目錄是幹嘛的

BUILD #說直白點就是將源碼解壓到這目錄了BUILDROOT #編譯環境的 / 目錄RPMS #編譯好生產RPM的目錄SOURCES #源碼存放的路徑SPECS #spec文件存放的路徑,有彩蛋喲SRPMS #編譯好生成SRPM的目錄

環境安裝完成後,準備編譯吧,我們拿nginx開刀吧,這個比較簡單

將源碼軟體複製到SOURCES目錄

去nginx官網下載個最新的源碼包去,放在SOURCES目錄下RPM包rpmbuild SPEC文件深度說明 【裝載】去nginx官網下載個最新的源碼包去,放在SOURCES目錄下

http://nginx.org/download/nginx-1.12.1.tar.gz[root@localhost ~]# wget http://nginx.org/download/nginx-1.12.1.tar.gz -O /root/rpmbuild/SOURCES/nginx-1.12.1.tar.gz[root@localhost ~]# ls /root/rpmbuild/SOURCES/nginx-1.12.1.tar.gz

編輯spec文件,彩蛋來嘍,打開後發現已經有默認的模板嘍,修改修改就可以了

這裡只要使用vim在SPEC目錄下建立新的文件並且以.spec結尾就會觸發宏

[root@localhost ~]# vim /root/rpmbuild/SPECS/nginx-1.12.1.spec模板裏的參數都是啥???給你找一篇寫的倍牛逼的文檔,說實話看到這篇文檔的時候已經沒想法寫下去了,他的太全了,不過既然寫了就完結吧http://www.cnblogs.com/schangech/p/5641108.html

先來份spec配置文件吧

Name:nginx Version:1.12.1 Release:1Summary:Nginx is a web server software. Group:Applications/InternetLicense:GPLURL:www.nginx.org Source0:nginx-1.12.1.tar.gzBuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)BuildRequires:gcc pcre-devel zlib-devel#Requires: %descriptionnginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. For a long time, it has been running on many heavily loaded Russian sites including Yandex, Mail.Ru: почта, поиск в интернете, новости, игры, VK, and Rambler.%prep%setup -q%build./configure --prefix=/usr/local/nginxmake %{?_smp_mflags}%installrm -rf %{buildroot}make install DESTDIR=%{buildroot}%cleanrm -rf %{buildroot}%files%defattr(-,root,root,-)/*%doc#%changelog

執行編譯,編譯與正常的編譯過程一致,如果中途缺少依賴包yum安裝即可,然後重新執行rpmbuild

[root@localhost ~]# rpmbuild -ba rpmbuild/SPECS/nginx-1.12.1.spec[root@localhost ~]# ls /root/rpmbuild/RPMS/x86_64/nginx-1.12.1-1.x86_64.rpm

編譯完成後就可以去RPMS目錄下拿rpm包與debuginfo相關的包,去SRPM目錄下拿srpm包(srpm包會包含打包相關的所有數據,包含spec文件及相關依賴文件)


推薦閱讀:
相關文章