如何构建一个RPM包?

如何构建一个RPM包?

为什么要自己构建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: CentOS
Release     : 59.el6.centos                 Build Date: 2017年03月22日 星期三 14时53分40秒
Install Date: (not installed)               Build Host: c1bm.rdu2.centos.org
Group       : System Environment/Daemons    Source RPM: httpd-2.2.15-59.el6.centos.src.rpm
Size        : 3137746                          License: ASL 2.0
Signature   : RSA/SHA1, 2017年03月23日 星期四 23时02分13秒, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <My View - CentOS Bug Tracker>
URL         : The Apache HTTP Server Project
Summary     : Apache HTTP Server
Description :
The Apache HTTP Server is a powerful, efficient, and extensible
web 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" user
getent group apache >/dev/null || groupadd -g 48 -r apache
getent passwd apache >/dev/null || \
  useradd -r -u 48 -g apache -s /sbin/nologin \
    -d /var/www -c "Apache" apache
exit 0
postinstall scriptlet (using /bin/sh):
# Register the httpd service
/sbin/chkconfig --add httpd
/sbin/chkconfig --add htcacheclean
preuninstall 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 htcacheclean
fi
posttrans 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 rpmbuild
ls: cannot access rpmbuild: No such file or directory

编译一个不存在的spec....

[root@localhost ~]# rpmbuild -ba aaa.spec
error: failed to stat /root/aaa.spec: No such file or directory   #没有指路径肯定找不到啦
[root@localhost ~]# ll rpmbuild   #出来吧皮皮虾
total 24
drwxr-xr-x 2 root root 4096 Sep  4 14:50 BUILD
drwxr-xr-x 2 root root 4096 Sep  4 14:50 BUILDROOT
drwxr-xr-x 2 root root 4096 Sep  4 14:50 RPMS
drwxr-xr-x 2 root root 4096 Sep  4 14:50 SOURCES
drwxr-xr-x 2 root root 4096 Sep  4 14:50 SPECS
drwxr-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:1
Summary:Nginx is a web server software.    
Group:Applications/Internet
License:GPL
URL:www.nginx.org    
Source0:nginx-1.12.1.tar.gz
BuildRoot:    %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires:gcc pcre-devel zlib-devel
#Requires:    
%description
nginx [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/nginx
make %{?_smp_mflags}
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%clean
rm -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文件及相关依赖文件)

编辑于 2017-09-05

文章被以下专栏收录