烂泥:Linux源码包制作RPM包之Apache
公司服务器比较多,需要把apache源码包制作成rpm包,然后放到公司内网yum源上进行下载安装。apache的rpm包安装方式比源码安装方式比较快,这能节约不少的时间。
有关内网yum源的搭建,可以参考《烂泥:yum的使用及配置》这篇文章。
一、安装rpm-build
查阅相关资料得知,要把源码包制作成rpm包需要使用rpm打包工具rpm-build。
rpm-build通过rpmbuild命令根据本地源码包,通过spec文件中的规则就可以把源码包制作成rpm包。
现在我们来安装rpm-build包,如下:
yum -y install rpm-build
rpm-build安装完毕后,我们来查看rpm-build的rpm包信息。如下:
cd /var/cache/yum/x86_64/6/updates/packages/
注意:yum安装软件默认是安装完毕立即删除的,但是我们可以通过修改yum.conf文件使其不删除。
cat /etc/yum.conf
查看rpm-build的rpm包相关信息,如:软件名称、版本、build日期、功能描述、大小等等。如下:
rpm -qpi rpm-build-4.8.0-38.el6_6.x86_64.rpm
查看rpm-build的rpm包含安装的目录和文件,如下:
rpm -qpl rpm-build-4.8.0-38.el6_6.x86_64.rpm
查看rpm-build的rpm包的配置文件,如果该该rpm包没有配置文件的话就不会显示。
rpm -qpc rpm-build-4.8.0-38.el6_6.x86_64.rpm
查看rpm-build的rpm包的依赖关系,如下:
rpm -qpR rpm-build-4.8.0-38.el6_6.x86_64.rpm
除此之外,如果想查看这个文件属于哪个rpm 包,我们也可以使用以下命令。如下:
rpm -qf /etc/init.d/iptables
有关rpm命令的详细使用方法,我们也可以通过man rpm进行查看。如下:
man rpm
二、spec规则文件内容详解
spec文件是整个rpm包制作的核心,它的作用如同源码编译程序时的Makefile文件一样。
spec文件包含建立一个rpm包必要的信息,包括哪些文件是包的一部分以及它们安装在哪个目录等等信息。
注意:spec文件必须由普通用户创建,并且强烈建议使用vi或者vim命令创建。
我们先来创建一个httpd.spec文件,使用vi命令,如下:
vi httpd.spec
whoami
pwd
通过上图,我们可以很明显的看出,目前httpd.spec文件中已经有spec文件的选项。我们所需要做的就是根据这些选项来填写该spec文件,填写完毕后保存即可。
注意:在新建一个spec文件时,系统会默认创建一个spec文件模版。只是该模版是空的,如果没有填写内容的话,是无法保存该文件的。
下面我们就开始讲解spec文件的相关选项,spec文件内容一般分为如下几个部分:
定义rpm包的信息、定义源码包、定义rpm包的依赖关系、打包前的工作、编译并安装rpm包、安装之后生成的文件、安装前后需要执行的脚本、软件变更日志
2.1定义rpm包的信息
rpm包信息,主要定义用户查询rpm包信息时所显示的内容。它包含rpm包的功能描述、软件版本、版权信息和软件授权类型等等。
详细信息如下:
Name定义该rpm包的名字,必须要填写。
Version定义该rpm包的版本号,建议和源码包的名称保持一致。
Release定义rpm本身的版本号,使用默认值即可。
Summary定义关于该rpm包的一些介绍。
%description定义关于该rpm包的一些描述信息。
Group标识软件包所属类型。
License软件授权类型,比如GPL、Commercial、Shareware。
URL定义软件作者的主页。
rpm包信息中最重要的是NVR,也就是name、version、release。因为最后生成的rpm包的名称就是根据这三项来的。
rpm名称形式,如下:name-version-release.rpm。
2.2定义源码包
Source0用来定义制作rpm包时所需要的源码包。如果制作rpm包时,有多个源码包,那么使用source和数字混合,比如:
source0: tbsys-src.tar.gz
source1: tbnet-src.tar.gz
source2: tair-2.1.0-src.tar.gz
注意:
Source0必须要填写,而且填写的名字必须是和下载源码包名称要一模一样,还要注意只有tar.gz的源码包,才能制作rpm包。
2.3定义rpm包的依赖关系
rpm包在制作过程中会依赖基本库,而rpm包在安装时有时也需要其他软件包。这些我们都可以通过以下选项进行控制。
BuildRequires定义制作rpm包时,所依赖的基本库。该选项可有可无。
Requires定义安装该rpm包时,所依赖的软件包。该选项可有可无。
注意:
在这里要重点说明一点,Requires定义所依赖的软件包,在进行yum安装时的情况。
我们在使用yum安装软件A时,yum会在下载完A的rpm包后,对该rpm包进行检查(rpm包中会给出安装该rpm包安装时,所依赖的基础库和软件)。
如果检查出,A的安装还要依赖软件B,那么此时yum就会自动下载并安装B。B安装完毕后,就会继续安装A。如果是内网yum源的话,我们只需要把B放在内网yum源即可。
如果检查出,A的安装不需要其他软件的支持,那么yum会自动安装A。
2.4编译并安装rpm包
这一步是非常重要,类似与源码安装的的./configure、make、make install。主要包括%build、%install等选项。如下:
%build定义编译软件包时的操作
%install定义安装软件包,使用默认值即可。
BuildRoot定义安装或编译时使用的虚拟目录,建议使用默认值即可。如下:
%(mktemp-ud%{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
该参数非常重要,因为在生成rpm包的过程中,执行make install时就会把软件安装到上述的路径中。在打包的时候,同样依赖虚拟目录为根目录进行操作。
2.5安装之后生成的文件
rpm包在进行安装时,会创建相关的目录及文件,我们就可以在此定义。
%files定义rpm包安装时创建的相关目录及文件。
在该选项中%defattr (-,root,root)一定要注意。它是指定安装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755。
2.6安装前后需要执行的脚本
%prep指定rpm包安装前执行的脚本。在对软件进行打包前,我们还进行其他操作。比如解压tar.gz文件。%prep主要与%setup –q命令配合使用,建议使用默认值即可。
%post指定rpm包安装后执行的脚本。我们在安装完毕rpm包后,执行软件初始化的动作,就可以通过%post来达到目的。比如:apache在安装后,将apachectl拷贝成httpd等操作。默认spec模版文件不存在此选项。
%preun指定rpm包卸载前执行的脚本,该选项主要用于软件升级的时候会执行。默认spec模版文件不存在此选项。
%postun指定rpm包卸载后执行的脚本。默认spec模版文件不存在此选项。
2.7软件变更日志
%changelog主要用于软件的变更日志。该选项可有可无。
如果使用%changelog选项的话,一定要以*开头,以- -结尾。时间格式为,如下:
* 星期 月 日 年 XXX
--
示例为:
* Tue Mar 03 2015 ilanni2.2.27
--
注意:星期和月一定要使用英文,并且是简写的,否则会报错。如下:
三、httpd.spec文件示例
下面就以系统提供的spec文件为模版,把apache源码包制作成rpm包。apache的spec文件如下:
Name: httpd
Version: 2.2.27
Release: 1%{?dist}
Summary: compiled from 2.2.27 by ilanni
Group: System Environment/Daemons
License: GPL
URL: http://www.ilanni.com
Source0: httpd-2.2.27.tar.gz
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires: gcc, gcc-c++, openssl-devel
%description
Apache web server. Compiled from 2.2.27 by ilanni
%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
%doc /usr/local/httpd/man/*
%doc /usr/local/httpd/manual/*
/usr/local/httpd/modules/*
%post
cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd
sed -i '1a # chkconfig: 2345 85 15' /etc/init.d/httpd
sed -i '2a # description: apache web server' /etc/init.d/httpd
chkconfig --add httpd
%preun
/etc/init.d/httpd stop
chkconfig --del httpd
%changelog
* Tue Mar 3 2015 ilanni<ilanni@ilanni.com> 2.2.27
--
四、生成相关目录
要生成rpm包的相关目录,我们可以通过手工创建,也可以通过rpmbuild命令创建。如下:
rpmbuild httpd.spec
注意:在使用rpmbuild生成rpm包的相关目录时会报错,这个不需要去管它。
tree rpmbuild/
通过上图,我们可以很明显的看到rpmbulid命令已经生成相关的目录。
每个目录的作用,如下:
BUILD用于存放解压后的文件。
BUILDROOT用安装或编译时使用的虚拟目录。
RPMS用于存放由rpmbuild制作好的二进制包。
SOURCES用于存放源代码、补丁、图标等文件。
SPECS用于存放用于管理rpm制作进程的spec文件。
SRPMS用于存放由rpmbuild制作好的源码包。
五、把文件拷贝到指定目录
相关目录创建完毕后,现在我们需要把相关apache的源码文件以及spec文件复制指定的目录。如下:
cp httpd-2.2.27.tar.gz rpmbuild/SOURCES/
cp httpd.spec rpmbuild/SPECS/
六、生成RPM包
以上配置完毕后,我们现在就开始生成rpm包,使用rpmbuild命令。如下:
rpmbuild -ba rpmbuild/SPECS/httpd.spec
通过上图,我们可以很明显的看出rpm包已经制作成功。
新生成的rpm包存放在rpmbuild/RPMS/目录下,而源码rpm包则存放在rpmbuild/SRPMS/目录下。
注意:rpmbuild –ba命令的意思是编译后做成*.rpm包和src.rpm包。
七、测试生成RPM包
rpm包制作完成后,我们来测试该rpm包。如下:
cp /home/ilanni/rpmbuild/RPMS/x86_64/httpd-2.2.27-1.el6.x86_64.rpm ./
rpm -ivh httpd-2.2.27-1.el6.x86_64.rpm
通过上图,我们可以很明显的看出,通过源码制作的rpm已经正常安装。
烂泥:Linux源码包制作RPM包之Apache的更多相关文章
- 制作rpm包步骤
由于项目需要,需要自行制作rpm包.比较全面的可以参考如下链接: http://blog.chinaunix.net/uid-23069658-id-3944462.html 大致框架如下: 1,安装 ...
- linux制作RPM包
制作rpm包 1.制作流程1.1 前期工作 1)创建打包用的目录rpmbuild/{BUILD,SPECS,RPMS, SOURCES,SRPMS} 建议使用普通用户,在用户家目录中创建 2)确定好制 ...
- linux 源码包安装拾遗
源码包安装和apt-get/yum的区别 安装前的区别:概念上的区别 rpm和dpkg包是经过编译过的包,并且其安装位置由厂商说了算,厂商觉得安装在哪里合适,就会装在哪里,而源码包则是没有经过编译的文 ...
- Linux基于FPM制作RPM包(以Nginx为例)
1.搭建Epel Yum源 安装在线yum源 [root@localhost ~]# rpm -ivh epel-release-latest-.noarch.rpm //安装扩展源 [root@ ...
- linux之使用rpmbuild打rpm包
linux之使用rpmbuild打rpm包 前言: 已从事linux运维工作数年,感觉自己还是个小菜鸟,没有大神那么的钻研的精神.只是单纯热爱,喜欢对着黑色的屏幕敲击命令,喜欢这种感觉.为什么要做RP ...
- 手动制作rpm包
制作RPM包的过程,简单的说,就是为制作过程提供一个“工作车间”,即一个目录,里面需要包含以下几个子目录: BUILD ————编译相关源码包时的工作目录: RPMS — ...
- 速成制作rpm包
FPM 由于很多软件在安装时需要编译,这会浪费不少的时间,为了提升部署效率,于是就想到制作rpm包.通常rpm包的制作是使用rpmbuild命令来制作,但是你需要知道它的语法,比较繁琐.这就用到了FP ...
- 利用fpm制作rpm包
使用fpm制作rpm包 安装如下 [root@web01 ~]# yum install -y gcc zlib zlib-devel wget http://ruby.taobao.org/mirr ...
- fpm制作rpm包
一.前言 在企业中我们有事安装软件包.部分都是源码安装,如nginx安装路径都已经固化了,但实际业务中,我们都是把软件包安装到固定目录下,不满足需要,这是其一.其二,编译安装很耗时,比如mysql,特 ...
随机推荐
- SSO单点登录实现原理与总结
一.什么是单点登录SSO(Single Sign-On) SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用 ...
- Java知识体系
Java知识体系 java知识结构.jpg web框架.jpg 计算机课程体系.png 2016-08-19_090929.png 流行的哈希算法生存状况.jpg "JAVA之父" ...
- python 学习笔记6(函数)
函数 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 1.减少代码重复 2.保持代码的一致性 3.方便修改,可扩展性 函数的创建 #简单 ...
- SDL制作拼图游戏
看完教程第三集后,好像自己能用这个来写一个简单的拼图游戏,第一次写出个带界面的游戏,好有成就感. 图片是自己慢慢截左上部分8个脸. #include <stdio.h> #include ...
- Guava学习笔记:EventBus
EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现.对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和 ...
- Java经典实例:正则表达式,找到匹配的文本
import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by Frank */ public cla ...
- GJM :C++ 网络编程 [转载]
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- 客观评价C#的优点和缺点
对于C#,coder中可以分为2类:一类是C#死忠,对它赞赏到极点:另一类刚好相反,对它极度排斥. 本文将以全面.客观的方式评价这门语言,特别是语法方面. 其实很多人评价一门语言是带着一种感情色彩的. ...
- bootstrap深入理解之格子布局
一.源码文件: _grid.scss:格子系统类文件 Mixins/_grid.scss:支持格子系统实现的mixin集合 Mixins/_grid-framework.scss:格子系统实现的核心m ...
- jQuery的eq方法
定义和用法eq() 方法将匹配元素集缩减值指定 index 上的一个. 语法.eq(index) 其中的index :整数,指示元素的位置(最小为 0).如果是负数,则从集合中的最后一个元素往回计数. ...