一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Linux源码包制作RPM包之Apache

时间:2015-05-25 编辑:简简单单 来源:一聚教程网

首先,来看看yum的使用及配置

最近由于服务器需求,需要在公司内网搭建内网yum源。

搭建内网yum源需要分以下几个步骤,如下:

1、 yum是什么

2、 repo文件是什么

3、 repo文件内容详解

4、 yum服务器端配置

5、 yum客户端配置

6、 保存yum安装的软件包

7、 更新rpm包

一、yum是什么

yum(全称为Yellowdog Updater Modified)是一个在CentOS、RedHat和Fedora操作系统中使用的Shell前端软件包管理器。

yum主要管理基于rpm的软件包,它可以自动升级、安装、删除rpm软件包,同时它还能够自动查找并解决rpm包之间的依赖关系,并且无需管理员逐个、手工的去安装每一个rpm包,使管理员在维护Linux主机时更加轻松自如。

yum可以从一个或多个repo文件中配置的repo仓库,通过http或ftp协议从repo仓库获得必要的信息,然后下载相关的软件包。这样,本地用户通过建立不同的repo仓库,在有Internet连接时就能方便进行系统的升级和维护工作。

repo仓库可以通过createrepo或yum-arch命令进行创建,也能够用别人已经创建好的repo仓库作为yum源,在此我们主要探讨通过createrepo命令创建的repo仓库。

有关yum命令的使用帮助信息,我们可以通过man yum命令进行查看,如下:

man yum

clip_image001


二、repo文件是什么

通过第一章,我们知道repo文件是CentOS、RedHat和Fedora操作系统中yum源(软件仓库)的配置文件,通常一个repo文件定义了一个或者多个软件源。

例如:我们将从哪里下载需要安装或者升级的软件包,repo文件中都进行了相关的配置,而这些配置将会被yum读取和应用。

三、repo文件内容详解

一个标准的centos的repo文件内容如下:

[base]

name=CentOS-$releasever - Base

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os

#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/

enabled=1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

各个选项说明如下:

[base]

该选项是定义软件源的名称,该名称是可以自定义,同时在该服务器上所有repo文件中是唯一的。注意:方括号里面不能有空格。

name=CentOS-$releasever - Base

该选项是定义软件仓库的名称,$releasever变量定义了发行版本,通常是5,6,7等数字。

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os

这是指定镜像服务器的地址列表,通常是开启的。我们可以尝试,将$releasever和$basearch替换成自己对应的版本和架构,例如6.6和x86_64,在浏览器中打开,我们就能看到一长串镜可用的镜像服务器地址列表。如下:

clip_image002


选择自己访问速度较快的镜像服务器地址复制并粘贴到repo文件中的baseurl选项中,我们就能获得较快的更新速度了。

#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/

这行第一个字符是#表示该行已经被注释,将不会被读取,这一行的意思是指定一个baseurl(源的镜像服务器地址)。

baseurl通常有以下四种格式,如下:

baseurl= http://mirrors.aliyun.com/centos/6.6/os/x86_64/

使用http协议镜像服务器地址

baseurl= ftp://ftp.sjtu.edu.cn/centos/6.6/os/x86_64/

使用ftp协议镜像服务器地址

baseurl= rsync://mirror.zol.co.zw/centos/

使用rsync镜像服务器地址

baseurl= file:///ilanni/yum/

使用本机的镜像服务器地址

其中前两种是我们使用最多的。有关这个我们可以参考centos官网给出的参考,如下:

clip_image003


enabled=1

该选项表示在这个repo文件中启用这个软件源,默认该选项可以不写。但是如果enabled的值为0,则表示禁用这个软件源。

注意:一个repo文件中可以定义多个软件源。

gpgcheck=1

该选项表示对通过该软件源下载的rpm包进行gpg校验,如果gpgcheck的值为0表示不进行gpg校验。

gpgkey= file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

该选项定义用于校验的gpg密钥文件。

通过以上这个repo文件的说明,相信各位会觉得,其实centos的repo文件真是很简单。有了一个初步的认识了之后,我们就可以进行下面的实验了。

我们现在要求在公司内网搭建一个yum源。该yum源需要配置两个源:一个是centos的光盘镜像源,一个是特殊rpm软件的镜像源,并且该yum源是通过http进行访问。

此次实验:yum服务器192.168.1.247 centos,客户端192.168.1.248 centos。

四、yum服务器端配置

要达到以上要求,我们首先要搭建yum服务器,并且在该服务器配置web服务器。

在此web服务器我们使用的是apache,当然使用nginx也是可以的。

4.1 配置web服务器

在yum服务器上,我们现在直接使用yum安装apache。如下:

yum -y install httpd

clip_image004


当然你也可以使用源码方式安装apache,有关apache的源码安装可以参考《烂泥:源码安装apache》。

apache安装完毕后,我们来启动apache。如下:

/etc/init.d/httpd start

wget http://192.168.1.247

clip_image005


通过上图,我们可以很明显的看到apache服务器已经正常启动。

4.2 安装createrepo

createrepo是什么?createrepo是linux下创建仓库的软件包。create是创建的意思,repo是repository的缩写,是仓库的意思。

只有安装createrepo这个软件,才能在yum服务器创建软件仓库。

createrepo的安装很简单,我们现在通过yum进行安装,如下:

yum -y install createrepo

clip_image006


createrepo安装完毕后,我们就可以创建repo仓库了。

4.3 光盘镜像

把本地下载的光盘镜像复制到yum服务器上,我们在此是通过xftp工具复制的,如下:

clip_image007


clip_image008


创建软件源所在的位置,如下:

mkdir -p /var/www/html/yum

ll /var/www/html/yum/

clip_image009


创建光盘挂载的目录,如下:

mkdir /iso

mount -o loop CentOS-6.6-x86_64-minimal.iso /iso/

ll /iso/

clip_image010


复制到光盘下的所有文件到/var/www/html/yum/目录下,如下:

cp -rv /iso/* /var/www/html/yum/

clip_image011


现在我们访问下该目录,看看能不能正常显示,如下:

wget http://192.168.1.247/yum

clip_image012


clip_image013


通过上图我们可以很明显的看到,目前该目录是可以被正常访问的。

注意:在此我们没有创建yum数据库和信息索引文件,是因为光盘已经有yum数据库和信息索引文件,我们不需要再通过createrepo命令在进行。其实yum的数据库和信息索引文件,都在repodata文件夹下。如下:

clip_image014


为了光盘镜像实验的效果,我们在此以光盘镜像软件包中curl软件为例。如下:

ll |grep curl

clip_image015


4.4 特殊软件镜像

在前面我们还要求一个特殊的yum源用来存放特殊软件的,在此我们以lrzsz这个软件为例。

该yum源存放的位置/var/www/html/ilanni/目录下,然后把lrzsz这个软件的rpm包放在/var/www/html/ilanni/目录下,如下:

mkdir -p /var/www/html/ilanni

cp /var/cache/yum/x86_64/6/base/packages/lrzsz-0.12.20-27.1.el6.x86_64.rpm /var/www/html/ilanni/

ll /var/www/html/ilanni/

clip_image016


现在我们来创建该特殊yum源的yum数据库和信息索引文件,切换到/var/www/html/ilanni/目录下,执行createrepo命令,如下:

createrepo ./

tree repodata/

clip_image017


现在我们访问下该目录,看看能不能正常显示,如下:

wget http://192.168.1.247/ilanni

clip_image018


clip_image019


通过上图我们可以很明显的看到,目前该目录是可以被正常访问的。

以上的所有配置都是在yum服务器上进行的,现在我们来切换到yum客户端上进行操作。

五、yum客户端配置

yum客户端的操作就简单了很多,我们只需要修改客户端的repo文件即可。

进入/etc/yum.repos.d/目录,备份原有的repo文件,如下:

rename .repo .repo.bak *.repo

clip_image020


然后在该目录下,创建一个新的repo文件ilanni.repo,内容如下:

[centos6]

name=centos6

baseurl=http://192.168.1.247/yum/

enabled=1

gpgcheck=0

[ilanni]

name=ilanni

baseurl=http://192.168.1.247/ilanni/

enabled=1

gpgcheck=0

clip_image021


注意:该文件名可以变,但是后缀一定是.repo。

repo文件修改完毕后,我们来进行相关测试。

安装curl软件,如下:

yum -y install curl

clip_image022


安装lrzsz软件,如下:

yum -y install lrzsz

clip_image023


通过以上测试,我们可以很明显的看到客户端已经从yum服务器下载我们所需要的软件包。

注意:如果客户端yum安装软件包时,提示找不到该软件。强烈建议,在客户端上执行yum clean all和yum list命令。

其中yum clean all表示清除yum源缓存,yum list表示列出所有的软件包。

以上就是我们在内网搭建yum源的步骤。

六、保存yum安装的软件包

在我们使用yum进行安装软件时,安装完毕后会自动把软件包删除。

为了保存yum安装的软件包,我们需要修改yum的配置文件yum.conf,把keepcache修改为1即可。如下:

vi /etc/yum.conf

clip_image024


cachedir表示rpm包的缓存位置。

七、更新rpm包

在我们搭建完毕内网yum源后,会经常遇到这两种情况。一是软件版本的更新,二是新增软件。

无论遇到以上那种情况,我们都需要先删除原来的yum服务器的yum数据库和信息索引文件,然后通过createrepo命令重新创建yum数据库和信息索引文件。

在此我们以新增软件为例,该软件为lftp。

如下:

cp /var/cache/yum/x86_64/6/base/packages/lftp-4.0.9-1.el6_5.1.x86_64.rpm /var/www/html/ilanni/

ll /var/www/html/ilanni/

rm -fr /var/www/html/ilanni/repodata/

createrepo /var/www/html/ilanni/

clip_image025


现在我们再来切换到客户端上进行操作,如下:

yum clean all

yum list |grep lftp

yum -y install lftp

clip_image026


通过上图,可以很明显的看出客户端已经安装lftp软件了。

Linux源码包制作Apache RPM包

一、安装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 ilanni2.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已经正常安装。

热门栏目