β

linux rpmbuild

运维者 1639 阅读

RPM为Redhat Package Manager缩写,是一个为Redhat系列Linux生产软件包的小工厂。其产品是RPM包,包含一些归档文件和meta信息;这些meta信息用来记录如何安装和删除这些文件,一些帮助脚本,文件属性和描述行信息(如包依赖哪些包和被哪些包依赖)。整个RPM包的制作过程严格按照SPEC文件规范的执行,然后通过rpmbuild命令来解析SPEC文件生成对应的RPM包。

至于为什么要制作rpm包,大家都明白,方便部署,比起源码来,这个部署速度更快

下面让以nginx为例,做rpm包制作:

1、安装需要的工具:

yum install rpm-build
yum install rpmdevtools

2、生成spec文件:

rpmdev-newspec -o nginx-1.6.1.spec

修改为:
# cat nginx-1.6.2.spec 

Name:           nginx
Version:        1.6.2
Release:        1%{?dist}
Summary:        small and high performance HTTP and reverse proxy server

Group:          System Environment/stable
License:        el6
URL:            http://nginx.org
Source0:        http://nginx.org/download/nginx-1.6.2.tar.gz
Source1:        nginx-server
Source2:        nginx.conf
Source3:        vhost.conf
BuildRoot:      %{_topdir}/BUILDROOT

BuildRequires:  pcre-devel,zlib-devel,openssl,perl,perl(ExtUtils::Embed)
Requires:       gcc,gcc-c++,make,pcre,openssl,perl-ExtUtils-Embed

%description
Nginx [engine x] is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3
proxy server written by Igor Sysoev.

%prep
%setup -q

%build
./configure 
    --user=nobody 
    --group=nobody 
    --prefix=/data/nginx 
    --with-http_ssl_module 
    --with-http_realip_module 
    --with-http_addition_module 
    --with-http_sub_module 
    --with-http_dav_module 
    --with-http_flv_module 
    --with-http_gzip_static_module 
    --with-http_stub_status_module 
    --with-http_perl_module 
    --with-mail 
    --with-mail_ssl_module
#make %{?_smp_mflags}
make
%install
make install     此处有错,下面会提示
#rm -rf $RPM_BUILD_ROOT
#make install DESTDIR=$RPM_BUILD_ROOT

%{__install} -p -D %{SOURCE1} -m 0711 %{buildroot}/etc/init.d/nginx
%{__install} -p -D %{SOURCE2} -m 0644 %{buildroot}/data/nginx/conf/nginx.conf
%{__install} -p -D %{SOURCE3} -m 0644 %{buildroot}/data/nginx/conf/vhosts/vhost.conf

%clean
rm -rf $RPM_BUILD_ROOT

%post
chkconfig --add nginx
chkconfig --level 345 nginx on
echo "ulimit -SHn 51200" >> /etc/rc.local

%files
%defattr(-,root,root,-)
%doc
%dir /usr/lib64/perl5/perllocal.pod
%dir /usr/local/lib64/perl5/auto/nginx/.packlist
%dir /usr/local/lib64/perl5/auto/nginx/nginx.bs
%dir /usr/local/lib64/perl5/auto/nginx/nginx.so
%dir /usr/local/lib64/perl5/nginx.pm
%dir /usr/local/share/man/man3/nginx.3pm
%dir /etc/init.d/nginx

/data/nginx

%changelog

3、开始制作:

rpmbuild -bb nginx-1.6.2.spec

产生报错如下:

error: File /root/rpmbuild/SOURCES/nginx-1.6.2.tar.gz: No such file or directory

没有文件:将nginx源码包移至/root/rpmbuild/SOURCE/

mv nginx-1.6.2.tar.gz /root/rpmbuild/SOURCES/

再次运行,仍然报错:

Processing files: nginx-1.6.2-1.el6.x86_64
error: File not found: /root/rpmbuild/BUILDROOT/nginx-1.6.2-1.el6.x86_64/usr/lib64/perl5/perllocal.pod
error: File not found: /root/rpmbuild/BUILDROOT/nginx-1.6.2-1.el6.x86_64/usr/local/lib64/perl5/auto/nginx/.packlist
error: File not found: /root/rpmbuild/BUILDROOT/nginx-1.6.2-1.el6.x86_64/usr/local/lib64/perl5/auto/nginx/nginx.bs
error: File not found: /root/rpmbuild/BUILDROOT/nginx-1.6.2-1.el6.x86_64/usr/local/lib64/perl5/auto/nginx/nginx.so
error: File not found: /root/rpmbuild/BUILDROOT/nginx-1.6.2-1.el6.x86_64/usr/local/lib64/perl5/nginx.pm
error: File not found: /root/rpmbuild/BUILDROOT/nginx-1.6.2-1.el6.x86_64/usr/local/share/man/man3/nginx.3pm

RPM build errors:
    File not found: /root/rpmbuild/BUILDROOT/nginx-1.6.2-1.el6.x86_64/usr/lib64/perl5/perllocal.pod
    File not found: /root/rpmbuild/BUILDROOT/nginx-1.6.2-1.el6.x86_64/usr/local/lib64/perl5/auto/nginx/.packlist
    File not found: /root/rpmbuild/BUILDROOT/nginx-1.6.2-1.el6.x86_64/usr/local/lib64/perl5/auto/nginx/nginx.bs
    File not found: /root/rpmbuild/BUILDROOT/nginx-1.6.2-1.el6.x86_64/usr/local/lib64/perl5/auto/nginx/nginx.so
    File not found: /root/rpmbuild/BUILDROOT/nginx-1.6.2-1.el6.x86_64/usr/local/lib64/perl5/nginx.pm
    File not found: /root/rpmbuild/BUILDROOT/nginx-1.6.2-1.el6.x86_64/usr/local/share/man/man3/nginx.3pm

将配置文件中的下面几行禁掉,方可以通过

%dir /usr/lib64/perl5/perllocal.pod
%dir /usr/local/lib64/perl5/auto/nginx/.packlist
%dir /usr/local/lib64/perl5/auto/nginx/nginx.bs
%dir /usr/local/lib64/perl5/auto/nginx/nginx.so
%dir /usr/local/lib64/perl5/nginx.pm
%dir /usr/local/share/man/man3/nginx.3pm

但是不带上这些文件,订制的包非常不正常,只有几十K 是非常不正常的。
终于问题所在配置文件中
make install 应该使用 make install DESTDIR=%{buildroot}

# rpmbuild -bb nginx-1.6.2.spec
没有报错的情况下,你现在可以去/root/rpmbuild/RPMS/x86_64找到我们刚刚做好的rpm包了

检查包情况: 

rpm2cpio nginx-1.6.2-1.el6.x86_64.rpm | cpio -id
 blocks

安装测试:

6ebbfd7f041785ad3ca8524cb120e489

补充说明:rpmbuild简单使用,(可用man rpmbuid 进行详细了解)
   -bl        verify %files section from <specfile>
               *检查<specfile>文件的%files段
   -ba       build source and binary packages from <specfile>
               *建立源码和二进制包
   -bb       build binary package only from <specfile>
               *只建立二进制包
   -bs       build source package only from <specfile>
               *只建立源码包 

linux rpmbuild,首发于运维者

作者:运维者
临渊羡鱼,不如退而织网
原文地址:linux rpmbuild, 感谢原作者分享。