首页 > Linux系统管理 > 如何使用rpm打包
2015
07-31

如何使用rpm打包

通常linux环境安装软件一般有两种方式,一种是通过源码编译安装,
另外一种是利用各种现成的rpm,deb等包,结合yumapt-get等工具安装
 
第二种方式用的到安装包怎么来的,是有人专门根据源码,针对特定的操作系统进行打包的。这种包有点是安装方便简单,不存在编译报错问题,缺点是兼容性差,要针对不同操作系统制作特定版本的安装包。
 
这里介绍基本的rpm打包方法。以nginx源码包为例,全部经过自己亲自测试。
 
 
1、首先安装rpm-build打包工具,也可以编译安装。
yum -y install rpm-build rpmdevtools
 
然后创建一些要用到的目录:            
#存放源码压缩包
mkdir -p /opt/rpmbuild/SOURCES         
 
#存放打包配置文件
mkdir -p /opt/rpmbuild/SPECS     
 
#解压SOURCE目录下的源码到这个目录进行模拟编译
mkdir -p /opt/rpmbuild/BUILD         
 
#存放打包完成后生成的二进制rpm包。通常会有x86_64和i386两个目录
mkdir -p /opt/rpmbuild/RPMS         
mkdir -p /opt/rpmbuild/RPMS/i386 
 
#存放打包完成后生产的源码包
mkdir -p /opt/rpmbuild/SRPMS
 
下载源码包nginx-1.5.1.tar.gz,
注意:必须保存在/opt/rpmbuild/SOURCES下面,并且名称必须是nginx-1.5.1.tar.gz
 
上面的路径不是默认用户根路径下,所以要修改rpmbuild环境变量
vim ~/.rpmmacros
找到如下内容:
%_topdir      %(echo $HOME)/rpmbuild
修改为:
%_topdir      %(echo /opt)/rpmbuild
 
 
vim rpmbuild/SPECS/nginx_rpm.spec
注意:如果用vi编辑一个空的spec文件是没有模板的,vim则有
根据模板,修改成如下内容:
=====================================================
Name:           nginx
Version:        1.5.1
Release:        4
Summary:        this is a test rpm.
 
Group:          Development/Tools
License:        GPL
URL:            http://www.thyhakcer.com
Source0:        %{name}-%{version}.tar.gz
%define nginx_datadir /usr/local/nginx
 
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
Requires:       libpng-devel >= 1.0.20 zlib
 
%description
this is my firt rpm maked by myself!
 
 
%prep
%setup -q
 
%postun
rm -rf %{nginx_datadir}
echo hello,thy,this rpm removed finished!
 
%build
mkdir -p %{nginx_datadir}/
mkdir -p %{nginx_datadir}/logs/
mkdir -p %{nginx_datadir}/tmp/{client,proxy,fcgi}
mkdir -p %{nginx_datadir}/pid
mkdir -p %{nginx_datadir}/lock
./configure \
–prefix=%{nginx_datadir} \
–sbin-path=%{nginx_datadir}/sbin/nginx \
–conf-path=%{nginx_datadir}/conf/nginx.conf \
–error-log-path=%{nginx_datadir}/logs/error.log \
–pid-path=%{nginx_datadir}/pid/nginx.pid \
–lock-path=%{nginx_datadir}/lock/nginx.lock \
–http-log-path=%{nginx_datadir}/logs/access.log \
–http-client-body-temp-path=%{nginx_datadir}/tmp/client \
–http-proxy-temp-path=%{nginx_datadir}/tmp/proxy \
–http-fastcgi-temp-path=%{nginx_datadir}/tmp/fcgi \
–user=nginx \
–group=nginx \
–with-http_ssl_module \
–with-http_flv_module \
–with-http_gzip_static_module \
–with-http_stub_status_module
 
make
 
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
 
 
%clean
rm -rf %{buildroot}
 
 
%files
%defattr(-,root,root,-)
%doc README
/usr/local/nginx/*
 
%changelog
=====================================================
 
注意:上面这个配置文件中红色部分。
 
%define定义个类似环境变量的东西,方便后面调用
Requires前面没有百分号%,用于指定rpm包的依赖关系的原始出处,通常用yum安装解决这种关系。
 
 
%build这个步骤用于编译安装,编译之前必须创建所有下面要用到的目录
 
指定的打包时安装的临时文件路径,打包完成后会自动删除。
make install DESTDIR=%{buildroot}
 
如果要指定卸载rpm包后执行一个脚本,可以用如下语句:
%postun
rm -rf %{nginx_datadir}
echo hello,thy,this rpm removed finished!
 
相关的脚本处理命令如下:
%prep     rpm预处理脚本
%pre         rpm安装前执行的脚本
%post     rpm安装后执行的脚本
%preun     rpm卸载前执行的脚本
%post     rpm安装后执行的脚本
 
 
打包工具编译安装完后,会生成安装程序的相关文件,这部分必须用下面的语句指定包含在rpm包里面,否则打包无法成功。
%files
/usr/local/nginx/*    
 
仔细看上面spec配置文件,源代码压缩包的名称是由Source0指定,打包工具rpmbuild会自动根据配置文件中的Name,Version找到SOURCE目录下的源码包,并且用gzip解压,所以这个源码包必须支持gzip。
Source0:        %{name}-%{version}.tar.gz
 
 
配置文件编辑完后,执行下面的命令开始打包:
rm -rf /opt/rpmbuild/BUILDROOT/nginx-1.5.1-1.x86_64/
rm -rf /opt/rpmbuild/BUILD/nginx-1.5.1/
rpmbuild -bb /opt/rpmbuild/SPECS/nginx_rpm.spec
 
 
打包完成后,rpm存放路径如下:
/opt/rpmbuild/RPMS/x86_64/nginx-1.5.1-4.x86_64.rpm     
 
注意rpm包名中的4由spec配置文件中的Release指定,表示发布版本。
最后编辑:
作者:saunix
大型互联网公司linux系统运维攻城狮,专门担当消防员

留下一个回复