Linux源码包制作RPM包之Apache

2023-10-17 21:08

本文主要是介绍Linux源码包制作RPM包之Apache,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Linux源码包制作RPM包之Apache

Apachelinuxrpmrpm-buildrpmbuildspecyum制作包源码烂泥

原贴:https://yq.aliyun.com/articles/43220

摘要: 公司服务器比较多,需要把apache源码包制作成rpm包,然后放到公司内网yum源上进行下载安装。apache的rpm包安装方式比源码安装方式比较快,这能节约不少的时间。 有关内网yum源的搭建,可以参考《烂泥:yum的使用及配置》这篇文章。

公司服务器比较多,需要把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

clip_image001

rpm-build安装完毕后,我们来查看rpm-build的rpm包信息。如下:

cd /var/cache/yum/x86_64/6/updates/packages/

clip_image002

注意:yum安装软件默认是安装完毕立即删除的,但是我们可以通过修改yum.conf文件使其不删除。

cat /etc/yum.conf

clip_image003

查看rpm-build的rpm包相关信息,如:软件名称、版本、build日期、功能描述、大小等等。如下:

rpm -qpi rpm-build-4.8.0-38.el6_6.x86_64.rpm

clip_image004

查看rpm-build的rpm包含安装的目录和文件,如下:

rpm -qpl rpm-build-4.8.0-38.el6_6.x86_64.rpm

clip_image005

查看rpm-build的rpm包的配置文件,如果该该rpm包没有配置文件的话就不会显示。

rpm -qpc rpm-build-4.8.0-38.el6_6.x86_64.rpm

clip_image006

查看rpm-build的rpm包的依赖关系,如下:

rpm -qpR rpm-build-4.8.0-38.el6_6.x86_64.rpm

clip_image007

除此之外,如果想查看这个文件属于哪个rpm 包,我们也可以使用以下命令。如下:

rpm -qf /etc/init.d/iptables

clip_image008

有关rpm命令的详细使用方法,我们也可以通过man rpm进行查看。如下:

man rpm

clip_image009

二、spec规则文件内容详解

spec文件是整个rpm包制作的核心,它的作用如同源码编译程序时的Makefile文件一样。

spec文件包含建立一个rpm包必要的信息,包括哪些文件是包的一部分以及它们安装在哪个目录等等信息。

注意:spec文件必须由普通用户创建,并且强烈建议使用vi或者vim命令创建。

我们先来创建一个httpd.spec文件,使用vi命令,如下:

vi httpd.spec

whoami

pwd

clip_image010

通过上图,我们可以很明显的看出,目前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

注意:星期和月一定要使用英文,并且是简写的,否则会报错。如下:

clip_image011

三、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

clip_image012

四、生成相关目录

要生成rpm包的相关目录,我们可以通过手工创建,也可以通过rpmbuild命令创建。如下:

rpmbuild httpd.spec

clip_image013

注意:在使用rpmbuild生成rpm包的相关目录时会报错,这个不需要去管它。

tree rpmbuild/

clip_image014

通过上图,我们可以很明显的看到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/

clip_image015

六、生成RPM

以上配置完毕后,我们现在就开始生成rpm包,使用rpmbuild命令。如下:

rpmbuild -ba rpmbuild/SPECS/httpd.spec

clip_image016

clip_image017

通过上图,我们可以很明显的看出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

clip_image018

通过上图,我们可以很明显的看出,通过源码制作的rpm已经正常安装。


这篇关于Linux源码包制作RPM包之Apache的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/227952

相关文章

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详