自己制作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 �Cqi 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 �Cq#不必管
%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 <[email protected]> 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命令时,执行之后没有反应,你可以把包卸载重新安装一下;