自己制作rpm包

概要:


  本篇文章主要讲解怎么把源码包制作成rpm包,直接用rpm -ivh 包名 的形式,安装软件包,当自己安装完源码包,可以制作成rpm包,给其他人用,省略了其他人源码包的配置、编译、安装的过程。



制作rpm包步骤:


一、安装rpmbuild程序

制作rpm包需要用到的工具是rpmbuild,通过rpm-build包安装,系统光盘中自带


# yum  install  -y  rpm-build



二、切换到普通用户

rpmbuild制作rpm包的时候因为权限的问题,不能以root身份执行


# useradd  tom


因为后面生成rpm包是基于源码包生成的,所以可以先把httpd-2.2.25.tar.gz的压缩包,cp到tom的家目录中


#cp httpd-2.2.25.tar.gz ~tom/


# su  -  tom



三、生成spce文件


我们以制作apache的rpm包为例讲解:


su到普通账户下的时候,直接用vim编辑一个以spec为扩展名的文件,文件名字随便起。以spec为后缀的文件,后面我们用rpmbuild这条命令的时候,就是基于这样的文件来创建rpm包


[tom@rhel6 ~]$ vim http.spec


进去之后你会发现,http.spec不是空的,里面会有模板,你只需要依据模板来编辑即可


name:           httpd       #rpm包的名字

Version:        2.2.25#版本号

Release:        1%{?dist}#不用管,系统会在版本号之后自动帮你补齐,比如我们经常看到的在rpm包后的el6之类的

Summary:        compiled from 2.2.25 by zzg  #简短描述信息,


Group:          System Environment/Daemons  #组信息,这里可以参考系统已有的http的rpm包的信息,

 rpm –qi httpd

License:        GPL#证书,一般为GPL

URL:            http://www.trench.com#url路径

Source0:        httpd-2.2.25.tar.gz#需要用到的tar包名字

BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

#这里不用管,系统用mkstemp 创建一个临时的目录

BuildRequires:  gcc, gcc-c++, openssl-devel #源码包配置时需要用到工具

Requires:       wireshark-gnome#这里表示rpm安装的时候的依赖关系


%description#长描述信息,注意这里要另起一行写

Apache web server. Compiled from 2.2.25 by trench


%prep#不必管

%setup –q#不必管



%build#源码包的配置选项

./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-cgi --enable-ssl --enable-charset-lite --enable-suexec --with-suexec-caller=daemon --with-suexec-docroot=/usr/local/httpd/htdocs

make %{?_smp_mflags}



%install#不需要管,系统执行安装动作

rm -rf %{buildroot}

make install DESTDIR=%{buildroot}



%clean

rm -rf %{buildroot}



%files#这里写安装完之后生成的目录,可以参考源码包安装完毕之后生成的目录

%defattr(-,root,root,-)

/usr/local/httpd/bin/*

/usr/local/httpd/build/*

/usr/local/httpd/cgi-bin/*

%config /usr/local/httpd/conf/*#代表配置文件

/usr/local/httpd/error/*

/usr/local/httpd/htdocs/*

/usr/local/httpd/icons/*

/usr/local/httpd/include/*

/usr/local/httpd/lib/*

%dir /usr/local/httpd/logs#dir为空

%doc /usr/local/httpd/man/*#doc目录下有内容

%doc /usr/local/httpd/manual/*

/usr/local/httpd/modules/*


%post#post代表安装完之后的动作,这里我们把他加入到系统自启动

cp /usr/local/httpd/bin/apachectl /etc/init.d/myhttpd

sed -i '1a # chkconfig: 2345 85 15' /etc/init.d/myhttpd

sed -i '2a # description: apache web server' /etc/init.d/myhttpd

chkconfig --add myhttpd


%preun  #卸载之前进行的动作

/etc/init.d/myhttpd stop

chkconfig --del myhttpd


%changelog#changlog信息

* Wed Mar 26 2014 zhangzhg <zhangzhg@tarena.com> 2.2.25

- first rpm from httpd-2.2.25


四、生成相关目录


[tom@rhel6 ~]$ ls

httpd.spec



[tom@rhel6 ~]$rpmbuild httpd.spec//用rpmbuild 命令生成rpmbuild目录


此时如果报错找不到相关目录是正常的,只要能生成rpmbuild目录即可;

这里有时候rpmbuild命令不好用,执行之后没有反应,你可以把包卸载重新安装一下;


[tom@rhel6 ~]$ ls

http.spec  rpmbuild    //再ls的时候会多出一个rpmbuild目录


五、把文件拷贝到指定目录


[tom@rhel6 ~]$cp httpd.spec rpmbuild/SPECS/      #把配置文件拷贝到SPECS目录

[tom@rhel6 ~]$cp httpd-2.2.25.tar.gz /rpmbuild/SOURCES/

#把tar包考到SOURCES目录下

[tom@rhel6 ~]$cd rpmbuild/SPECS#cd到rpmbuild/SPECS目录

[tom@rhel6 ~]$rpmbuild -ba httpd.spec#用命令生成rpm包


把spec文件和tar包拷贝到相关目录后,再用rpmbuild -ba 命令执行,不会报错找不到相关目录;


-ba :  Build  binary and source packages (after doing

       the %prep, %build, and %install stages).



如果执行报错Failed build dependencies:,安装buildrequires指定的软件包

spec文件中指定的buildrequires程序要存在,否则不能执行


安装指定软件包

#yum -y install gcc gcc-c++ openssl-devel


重新执行命令

[tom@rhel6 ~]$ rpmbuild  -ba  httpd.spec


七、如果正常将会在~/rpmbuild/RPMS目录下生成rpm包,在~/rpmbuild/SRPMS目录下生成源码包


[tom@rhel6 ~]$ls rpmbuild

BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS


[tom@rhel6 ~]$cd rpmbuild

[tom@rhel6 ~]$ ls RPMS/x86_64/

httpd-2.2.25-1.el6.x86_64.rpm


[tom@rhel6 ~]$ ls SRPMS/

httpd-2.2.25-1.el6.src.rpm


八、把生成的rpm包在其他主机上安装测试


安装的时候提示缺少的包,就是在spec文件中要求的requires的包


#rpm -ivh httpd-2.2.25-1.el6.x86_64.rpm


Faild dependencies:

wireshark-gnome is neededb by httpd-2.2.25-1.el6.x86_64


安装wireshark-gnome即可




验证:

   # service myhttpd start

   # netstat -anltp |grep :80

tcp        0      0 :::80                       :::*                        LISTEN      24615/httpd        



用rpm -qi httpd 查看一下详细信息


#rpm -q --changelog httpd

#rpm -q --scripts httpd




九、SRPMS的作用

 在64位系统上生成的RPM包,不能在32位上安装。可以在32位系统上把src.rpm包安装后,重新生成32位系统上的rpm包。


 使用普通用户的身份安装src.rpm包,得到源码包和spec文件,然后执行

$  rpmbuild  -ba  httpd.sepc


可以生成新的32位系统上的rpm包。





总结:


1、制作rpm包的时候因为权限的问题,不能以root身份运行


2、其实编辑.spec文件的时候,可以参考rpm -qi xxx.rpm的信息


3、在用rpmbuild命令时,执行之后没有反应,你可以把包卸载重新安装一下;