如何构建一个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文件及相关依赖文件)


推荐阅读:
相关文章