首页 > 代码库 > 程序包管理

程序包管理

如何使用光盘当做本地的yum仓库:

         1)挂载光盘至某目录:例如/media/cdrom   //这个光盘一定是我们官方发行版的光                                                                                                        

                            #mount  -r -t  iso9660  /dev/cdrom /media/cdrom  //-t  is9660是可以                                                                                                                                             省略的

         2)创建配置文件

                            [CentOS7]                  //这里的名称不能重复

                            name=

                            baseurl=

                            gpgcheck=                 //需要注意的是,一旦我们的某一仓库使用了gpgcheck,就意味着我们安装任意的程序包时,他就必须会检查gpg的秘钥了,所以我们就需要给定gpgkey,如果没有gpgkey,那么这个程序包的安装将无法通过,因为检查不成功是不允许安装的。我们也可以直接在命令行明确禁止,我们要知道命令行中的执行优先级是高于配置文件的。

                            enabled=                    //可以不写,默认就表示启用

 

yum的命令行选项:

         --nogpgcheck:禁止进行gpg  check //即使配置文件中给定了gpgcheck,在命令行中                                                                               也是能够阻止掉的。

         -y:自动回答为“yes”;

         -q:静默模式;  //默认情况下yum会输出很多信息,使用“-q”既不会输出任何信息

         --disablerepo=repoidglob:临时禁用此处指定的repo,“repo”既仓库;

         --enablerepo=repoidglob:临时启用此处指定的repo

         --noplugins:禁用所有插件;

 

yumrepo也就是“仓库”中的配置文件中可用的变量:

         $releasever:当前OS的发行版的主版本号;

         $arch:平台;比如i386i486i586i686

         $basearch:基础平台是指,只要是32位的,我们都将其理解为i386

         $YUM0-$YUM9

为什么在配置文件中也会用到变量?

         判断并获取当前系统的版本,当前系统发行版本的主版本号,或者当前系统基础平台的平台架构。

举例:

         http://mirrors.magedu.com/centos/$releasever/$basearch/os

 

 

之前我们讲过在repo配置文件中,我们还可以使用“cost”,来指明仓库的开销的,如果多个仓库中都有同一个应用程序,那么我们应该优先使用哪个呢?

         那么取决于“cost

 

 

 

 

创建YUM仓库:

         创建yum仓库其实就是一个命令而已,我们要想使用yum仓库,自建一个yum仓库,我们需要将使用指向光盘,或者指向互联网上的镜像。

         我们需要安装一个程序包“createrepo”,这个文件是能够帮我们组织管理和创建出rpm包的相关的repodata目录文件

 

         注意:

linux系统上,我们登录FTP服务后下载资料到本地的某个目录下时,下载的时候我们需要先在本地的某个路径下创建一个目录,然后使用get或者mget命令,将资料下载到目录下,我们要知道FTP下载资料时,是下载到登录FTP服务器时,所在的本地目录。

         我们可以在登录FTP服务后,切换下载的目录,比一定非要下载到登录FTP服务器时所在的目录,我们可以使用叹号“!”后加一个命令,表示执行shell命令,而不是是当前FTP命令,所以我们在登录FTP服务器后,我们执行“!mkdir  -p  /yum/repo”执行这个命令,创建一个目录,然后再执行“lcd  /yum/repo”这个命令,表示使用本地shell命令,切换到新建的目录下,然后执行“mget”命令,来下载资料。

 

         总结:

         1lftp  10.1.0.1  //登录FTP服务器

         2!mkdir  -p /yum/repo                //创建目录

         3lcd  /yum/repo              //切换到自己创建的目录

         4mget  需要下载的资料

 

 

我们自己制作yum源,需要创建一个repodata目录,那么这时候没有,我们需要使用一个命令createrepo,首先我们可以通过“man  createrepo”这个命令来查看命令createrepo的用法:

         createrepo的格式:

                   createrepo [options]  <directory>      //<directory>表示创建repodata目录的路径

        

         5createrepo  ./                //在当前目录下创建repodata目录

切换进这个目录后,我们会发现四个文件,这四个文件是以UUID命名的,其中一个文件名叫“primary.xml”主metadata目录,包括每一个包的包名,版本号,依赖关系,而每一个包道理拥有哪些文件,也就是说安装这个包后,会生成哪些文件,都在filelists.xml文件中保存。

         repomd.xml这个文件存放了repodata中的四个文件的校验码信息。所以我们在查看本地缓存中的数据是否有效时,我们可以先下载repomd.xml文件,然后与本地的这个文件进行比较,不一样的在进行重新下载。

 

         在创建本地YUM源时,baseurl=file:///media

解释:上面file后面为什么有三个斜线?

                   这是因为前面的两个斜线“//”是协议符号,后面的一个斜线是代表路径。

 

上面说明了,我们就算是只有rpm包程序文件,我们也可以将其创建为本地yum源来使用。

        

程序包的编译安装:

         之前我们安装的都是现成的二进制格式的rpm包,是别人编译好的,对于这些编译好的文件,对于我们来讲我们就无需再进行编译了,只需将程序包的文件拿过来,将二进制文件放到/bin/sbin目录下,将库文件放到/lib/lib64目录下。别人提供的rpm包未必在所有的情况下都适用,所以我们有时候不得不编译安装,这是因为第一我们找不到合适的rpm包,别人呢没人制作,(比方说我想用一个比较新版的程序,但是还没有人制作,)第二种情况就是,虽然有符合我们需要的rpm包,但是有一个问题,假设一个程序包在编译的时候,假设有20个功能的话,但是大多数人认为就需要10个功能,那么他就只编译了10个功能,但是我们却恰恰又用到后面的10功能,所以我们就只能自己去编译安装了。

 

         所以rpm包有两种格式:

1)已编译好的rpm包;(2)源码rpm包;

         例如:一个rpm包的名称为:

testapp-VERSION-release.src.rpm                    //像这个rpm包的名称,前面给定了包名,版本号,                                                                                发行版的版本号,但是再往后去没有给出平台的型                                                                                    号,这就表示没有编译的,是源码的rpm包。

我们要想使用这种格式的包,我们就需要再进行编译,编译成二进制格式的程序包。也就是说我们需要将上面src类型的rpm包安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装;

所以这种src格式的包我们无法直接使用。

 

         那他们为什么会提供src格式的软件包呢?

因为对方并不知道我们的平台是什么,我们的架构有可能是32位的,有可能是64位的,有可能是ppc格式的,所以src格式的代码临时编译,才能编译成适合我们自己CPU使用的指令,我们知道我们C语言的源码,真正使用要经过一个过程,要先预处理,接着是编译,编译以后是生成目标代码而不是二进制的,后面还有汇编过程,汇编过程其实就是将我们的

目标代码转化成二进制指令的过程,那为什么还需要汇编这个过程?我们应该知道32位的系统所支持的指令,和64位系统所支持的指令是不一样的,我们应该想的出来X86的平台和PDC平台也是不一样的。所以汇编是真正将代码转化成CPU能够执行的指令的过程,所以这个过程是就是将代码编译成完全符合自己平台需要的程序包的过程。

         上面的描述就是说明了我们的程序包为什么提供的是src格式的包。

当然了我们如果得不到src格式的包,我们也没办法自己编译,更何况我们即使编译,也有可能某些功能对方没有提供,如果这个时候我们懂rpm编译,那么我们这时候编译一下对方的spack文件就能实现,否则我们还要从头进行编译安装。

 

         要想实现程序的编译安装,那该怎样编译呢?我,我们知道现在很多程序员写程序时,再写一个程序时,往往不是一个人在工作,而是大家合作去研发程序,那也就意味着一个程序可能有N种功能,其中A程序员研发一部分,B程序员研发一部分,以此类推,最后大家合起来就可以了,那么我们想一下基于这种的方式做研发的时候,我们会不会将所有的代码合并在一个文件中,也就是说我们的源代码文件是不是只有一个?应不应该只有一个呢?

         解我们知道其实不应该只有一个文件,所以说现在的很多程序的源文件就是不止一个,不止一个的作用就是他可以安装层级,按照功能去分别组织功能不同的代码文件,如果我们了解我们此前的python语言的话,每一个文件其实是可以被当作成一个独立的模块被使用的,每一个文件可以当做一个功能组件,甚至像ls命令,这个命令肯定有很多的源文件,其中ls  -l”这个-l功能对应一个源文件,那么这样没事,但是如果一个程序包有N个源文件,那么在编译的时候,是先编译哪个后编译哪个?这些原文件之间一定是有依赖关系的,那么如果我们是程序的开发者,那么很容易理解,甚至是这个程序的项目经理,因为我们对他有一个全局的眼光,那么如果我们是一个程序员,那么就不知道先编译哪个后编译哪个了,那就更别提我们是从互联网上下载一个程序包去编译了。所以我们要想实现程序包的管理,我们不可能就是使用一个文件,或者一个命令,比方说像使用gcc这样的编译器,就能完成编译的,不是那么回事,

 

         所以说我们的原代码的组制格式:(多文件组织)

                   多文件:文件中的代码之间,很可能存在跨文件系统依赖关系;(那么这个时候我们如果是手动去编译的话是非常困难的,为了降低这个编译的难度,降低将来我们对整个代码实现管理的难度,我们对代码做增强型的管理工具,他们都有一个项目管理器。比如说像C/C++代码一样他们也需要一个项目管理器而不允许用户自己使用gcc直接去手动一个文件一个文件的编译的,因为这种依赖关系,压根就解决不了,即便是我们告诉GCC这样的软件,我们现在有100个源文件,你说先编译哪个?给定一个顺序,手动启动一个命令去编译,这样编译也是非常困难的,那么现在都有专门的项目管理工具,)

 

         C/C++这样的语言来讲,有一个著名的管理工具:make

(我们千万不要以为make是一个编译器,其实make是一个项目管理器,它是一个项目打包组织构建管理工具,而对于java语言来讲他的管理器是maven,将来在我们自己手动去编译安装源代码时,我们不用去考虑手动去运行gcc,虽然我们说过一个源程序从获取到使用大概需要经历下面的几个过程,对于linux而言,编译器就是gcc

 

         源代码--->预处理(需要预处理器)----->编译(gcc----->汇编(需要汇编器)----->链接(需要链接器)------>执行)

 

上面有了make项目管理工具以后,我们只需简单的操作几步就能完成上面的几个功能。make自动调用预处理器,做预处理,预处理完后,会自动调用编译器进行编译,然后再调用汇编器,进行汇编,调用链接器做链接,最后帮我们安装完成,执行就是用户手动完成的。

 

         源代码--->预处理----->编译(gcc----->汇编----->连接------>执行

那么很显然,我们会问make难道是真有这么智能吗?

         make其实是需要依赖于一个指示文件,make是有一个配置文件make针对于每一个源代码,都有一个专用的配置文件,在使用make时,make根据这个配置文件作出决定,比方说调用那个预处理器,如何进行预处理,在他的配置文件中都有说明,调用哪个编译器如何进行编译,先编译哪个文件,后编译哪个文件,都有说明,而这个文件就叫makefile,这就是make的配置文件,但是makefile不是事先存在的,并且他对用户的需要也不都是一样的,将来程序包还是需要安装的,那么我们的二进制文件安装到哪里去呢。库文件到底安装到哪里去呢?对于不同的用户,他的需要是不一样,所以如果我们将make文件写死放在那里,那么我们的make文件就没有灵活性,所以makefile并不是固定的,也不是每一个用户都必须使用这个make文件,其实make配置文件Makefile是由makefile.in这个文件生成,我们可以理解makefile.inmakefile的模板。那么这模板是怎样生成的?他是根据用户的需要来生成,这个模板允许用户在make之前将程序装在哪?二进制文件装载在哪?库文件装载在哪?还有比如编译的时候,有20个功能,我们应该启用哪些功能?都可以指明。当我们指明以后,系统就会利用“makefiel.in”这个模板来套用我们的选项,生成makefile这个文件,那么问题又来了,是谁帮助我们最终将makefile.in这个模板生成makefile这个文件?我们还有一个工具叫configureconfigure脚本就是允许用户能够将参数传递给这个脚本,用来指明程序包的编译参数,启用特性,还有安装路径等等,这些参数都指明以后,一回车,然后configure这个脚本就结合makefile.in这个文件,来生成Makefile文件。

 

总结上面的讲的,我们可以得到下面的总结:

         C,C++  makeconfigure------>Makefile.in---------->makefile

         javamanen

 

 

 

         编译安装的三大步骤:

                   ./configure                

                   make                                    

                   make  install                    //make  install其实就是将编译好的文件复制过去就可以了。

 

configure的功能:

         1)通过选项传递参数,指定启用特性,安装路径的等;执行时会参考用户的指定以                      Makefile.in文件生成makefile

         2)检查个指定特性依赖到的外部环境;

        

         make的功能:

                   根据makefile文件 ,构建应用程序;

 

         make的功能:

                   这是最关键的步骤,将项目构建成二进制的文件,但是make自己不是编译器,他是调用gcc来进行编译的。当然也可能调用其他的编译器,所以说make仅仅是一个项目管理工具,并且make又依赖makefile配置文件来完成管理功能。但是这个时候makefile文件又不能固定的写死,所以就得结合一个脚本configure并结合程序员写的模板来完成编辑。

 

         那么我们思考一个问题我们的configuremakefile.in这两个文件是从哪里来的呢?

解:

         上面的两个文件是系统自带的,但是有些应用程序再安装的时候不是自带的,这就需要我们手动去生成,因为这个configure文件并不是自带的,是由项目构建工具生成的。这个项目工具就是,能够帮助我们自动生成configuremakefile.in文件这依赖于两个开发工具:我们还应该清楚的就是对于每一个应用程序他的configure脚本都是不一样的。因为对于每一个程序来讲他的特性不一样,对于支持的参数性价也是不一样的。

         开发工具:

                   autoconfig:生成configure脚本

                   automake:生成Makefile.in文件

 

我们不同的程序包,他的安装路径可能不一样,比方说有的程序包不需要configure,一上来就是makemake  install,再比方说我们有的程序不需要make  install 因为安装完成以后他只有一个程序文件,配置文件,包文件什么都没有,只有一个二进制文件,那系统就会直接告诉我们直接cp就行,所以将来在安装任何一个源代码时,要注意他的install文档,

 

建议:安装前,一定要查看INSTALL文档,如果这个INSTALL文件没有的话,我们在去查看README文件。

 

上面就是编译安装给出的额外说明。

 

注意:

         我们在编译安装一个程序包的时候,并不是我们编译安装完成了,就代表这个整个的编译安装就结束了,其实还有很多在编译安装完成之后,我们手动执行的配置操作。

 

 

 

开源程序源代码的获取:

         有很多的大型的开源的程序,像apache的源代码,或者想MySQL的开源程序代码都有自己的官方的站点,

         1)官方自建站点:

                            比如:apache.orgASF);mariadb.org

         2)代码托管:

                            比如:SourceForge  Github.com   code.google.com

        

 

         C/C++:这类语言编写的程序用的编译器:gccGNU  C  Complier

 

         编译C源代码程序:

                   无非就是三个步骤:configuremakemake  install

                   前提:提供开发工具及开发环境

                            开发工具:makegcc等;

                            开发环境:开发库,头文件

                                     开发库中的glibc:标准库

 

对于centos5,6,7提供开发库开发环境的方式,可能是略有区别的,因为他们的程序版本可能是不一样的,依赖的库文件机制也是不同的,为了简化机制,他们通过包组的方式提供开发组件。

                   包组:提供开发组件和开发环境

         例如:centos6提供的包组:

                   Development  ToolsServer PlatformDevelopment,如果还要用到图形界面的开发组件的话,还要用到Destop Platform Development

                   Centos7上通过“yum  grouplist”发现上面只有一个开发工具:Installed  groups

 

注意:centos5,6,7来讲开发包组并不能容纳所有的程序包,仅仅是容纳那些便于归于组的,才会定义成组,别的可能并没有定义,

 

         我们查看gcc编译器是否安装,我们执行命令:“gcc  --version

 

1centos7上查看:

 

[root@centos7 ~]# gcc --version

gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)

Copyright 2015 Free Software Foundation,Inc.

本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;

包括没有适销性和某一专用目的下的适用性担保。

[root@centos7 ~]#

 

2centos6上查看:

                   如果查看gcc时,系统提示没有这个命令,表示我们需要先用yum安装gcc

[root@centos6 ~]# gcc --version

-bash: gcc: command not found

[root@centos6 ~]#

         安装gcc

[root@centos6 ~]# yum -y install gcc

         查看安装好的gcc

[root@centos6 ~]# gcc --version

gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17)

Copyright (C) 2010 Free SoftwareFoundation, Inc.

This is free software; see the source forcopying conditions.  There is NO

warranty; not even for MERCHANTABILITY orFITNESS FOR A PARTICULAR PURPOSE.

 

[root@centos6 ~]#

 

 

注意:不同的程序包所依赖的编译器可能还不一样,较新的程序包,可能就需要较新的编译器,较老的版本,就需要较老的编译器。这些都是我们需要注意的,以为以后下载一个较新的程序包版本,放在centos6上进行编译安装,但是我们发现centos6上提供的版本号很旧,压根就没有办法提供编译操作。

 

         如果gcc编译器存在的话,我们直接执行程序包编译操作就行。而安装程序包第一步就是configureconfigure这个配置脚本有很多配置选项。

 

注意:我们应该注意的是,上面说的configure是指我们下载的程序包源码的压缩文件后,解压,然后在这个目录中configure执行文件,这是因为我们的程序源码文件需要的configure不一样。

[root@centos6 ~]# configure --help

-bash: configure: command not found

[root@centos6 ~]# ls

anaconda-ks.cfg  httpd-2.4.9         Music      Videos

Desktop          httpd-2.4.9.tar.bz2  Pictures  yes

Documents        install.log          Public     zsh-5.0.2-14.el7_2.2.x86_64.rpm

Downloads        install.log.syslog   Templates

[root@centos6 ~]# cd httpd-2.4.9

[root@centos6 httpd-2.4.9]# ls

ABOUT_APACHE     BuildBin.dsp    emacs-style     LICENSE        READMENaNake

acinclude.m4     buildconf       httpd.dsp       Makefile.in    README.platforms

Apache-apr2.dsw  CHANGES         httpd.spec      Makefile.win   ROADMAP

Apache.dsw       CMakeLists.txt  include         modules        server

apache_probes.d  config.layout   INSTALL         NOTICE         srclib

ap.d             configure       InstallBin.dsp  NWGNUmakefile support

build            configure.in    LAYOUT          os             test

BuildAll.dsp     docs            libhttpd.dsp    README         VERSIONING

[root@centos6 httpd-2.4.9]#

 

我们可以先查看INSTALL文件:

[root@centos6 httpd-2.4.9]# cat INSTALL | less

         我们可以查看install文件,在开头他就告诉我们怎样去编译安装一个程序文件。

技术分享

 

 

接下来我们查看我们解压的程序源代码包中的configure执行文件的帮助选项:

[root@centos6 httpd-2.4.9]# ./configure --help | less

 

 

configure的现象大体分为一下这么几类

 

         1Fine tuningof the installation directories:              //指定安装路径

 

                            --bindir=DIR               //所有用户都可以运行的命令安装的位置

                            --sbindir=DIR             //管理员运行的命令安装的位置

                            --libexecdir=DIR   //也是可执行程序,但是不需要用户参与,就可以直接执行

                            --sysconfdir=DIR   //配置文件防止的位置

                            --sharedstatedir=DIR   //共享数据文件放置的位置

                            --localstatedir=DIR   //本地状态内容存放的位置,在/var/lib目录下

                            --libdir=DIR        //库文件存放位置

                            --includedir=DIR    //头文件存放位置

 

                   选项:指定安装位置,指定启用的特性

 

                 

                            选项分类:

                                     安装路径设定:

                                               --prefix=/PATH/TO/SOMEWHERE:指定默认安装位置;

                                               --sysconfigdir=/PATH/TO/SOMEWHERE:配置文件安装位置;

 

         2System types:指明编译的系统类型我们称之为“目标系统平台结构

                            --build=BUILD:指明我们打算在什么架构上运行。 

                            --host=HOST:指明我们的程序打算运行在哪个host上面。

                            --target=TARGET

                            其实我们的编译是可以交叉编译的,编译的操作其实是可以执行交叉编译的,

 

         什么是交叉编译?

                   解:

本来我们在X86_64的平台上,我们可以将程序包编译完成以后,将程序包放到其他的架构平台上运行。这种编译就是交叉编译。所以这里的System  types就是用来指明,我们编译的系统类型是什么,

 

         3OptionalFeatures:可选特性

                            --disable-FEATURE :禁用某特性

                            --enable-FEATURE[=ARG]:启用某特性

注意:

         在我们去编译一个程序包时,它默认可能就已经启用了一些特性,那么默认没有启用,但是我们现在想起用的特性,我们就是用enable默认启用了的但是我们现在又想让其关闭的,我们就是用disable

 

         4OptionalPackages:可选程序包

可选程序包,就是指他依赖到的可选的程序包

                   -with-PACKAGE[=ARG]:定义具有依赖关系的程序包

                   --without-PACKAGE:定义不具有依赖关系的程序包

 

 

         5Some influentialenvironment variables:一些可能产生影响的环境变量

 

        

 

 

 

程序包的编译安装演示

                   centos6为例:源码编译安装apache这个服务

 

         1)第一步:对于centos6来说,我们先检查他的两个开发包组是否安装成功:

执行:“yum  grouplist

 

[root@centos6 ~]# yum grouplist

技术分享

技术分享

如果发现没有安装,那么我们执行安装包组的命令即可:

[root@centos6 ~]# yum  -y  groupinstall "  Development tools"

然后再安装Server Platform Development

[root@centos6 ~]# yum  -y  groupinstall " Server PlatformDevelopment"

 

(我们虽然安装了包组,但是我们在实际编译某个程序包时,其实并非我们就会用到我们安装的包组中的所有的程序包,所以有人就建议我们只安装gcc编译器,等到了我们用到的时候,我们在进行手动的解决依赖关系,但是我们手动解决依赖关系只是有点麻烦,所以安装包组是一种比较容易的解决方案。)

 

         2)我们要既然编译httpd程序,那么我们将httpd程序包解压后并切换进这个目录中,在这个目录中执行命令:“./configure  --prefix=

         注意:这里我们将其安装在特定的路径下,将来好卸载,我们自己编译安装的,这个程序不在rpm管理器中,所以将来的时候我们需要卸载时候,而没法用rpm方式卸载。我们只能用删除的方式进行卸载。所以我们在编译安装某个程序包时,我们最好安装在一个特定的目录下,等我们不在使用和这个程序的时候,我们只需将这个目录删除即可。反正这个程序没有注册表。所以我们编译安装httpd程序包时给他指定安装目录:

 

 

正式编译安装apache:

 

1 )首先我们在接外网的条件下载所需的软件包:

        下载apache源码包:可以通过网页  http://httpd.apache.org/也可以通过命令行wget来下载特定版本程序包       

wgethttp://124.202.164.16/files/10020000089AD13C/apache.fayea.com//httpd/httpd-2.4.23.tar.gz

2 )我们先解压httpd/httpd-2.4.23.tar.gz

2.1)解压到/usr/src,在下载目录执行tar -zxvf apr-x.x.x.tar.gz -C /usr/src/  (我用的是:httpd/httpd-2.4.23.tar.gz

2.2进入目录/usr/src/httpd-2.4.23,执行:./configure--prefix=/usr/local/apache2 

3出现configure: error: APR not found。解决办法:

下载apr源码包:可以通过网页:http://apr.apache.org/也可以通过命令行wget来下载特定的软件包:

wget http://124.202.164.12/files/524800000657533D/archive.apache.org/dist/apr/apr-1.5.2.tar.gz

 3.1 )解压到/usr/src,在下载目录执行tar -zxvf apr-x.x.x.tar.gz -C /usr/src/  (我用的是apr-1.5.2.tar.gz)

3.2 )进入目录/usr/src/apr-1.5.2,执行./configure --prefix=/usr/local/apr;然后再执行:makemake install

4再次进入目录/usr/src/httpd-2.4.23,增加参数--with-apr=/usr/local/apr/,重新执行:

./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr/

5 )出现configure:error: APR-util not found .解决办法

下载apr-util源码包:可以通过网页:http://apr.apache.org/也可以通过命令行wget来下载特定的软件包:

wget http://219.239.26.13/files/30130000082B08A4/mirrors.noc.im/apache//apr/apr-util-1.5.4.tar.gz

5.1 解压到/usr/src,在下载目录执行tar  -zxvf  apr-util-x.x.x.tar.gz  -C     /usr/src/  (我用的是apr-util-1.5.4.tar.gz)

5.2 ) 进入目录/usr/src/apr-util-1.5.4执行    ./configure--prefix=/usr/local/apr-util  然后再执行:makemake install

6 )再次进入目录/usr/src/httpd-2.4.23,增加参数--with-apr-util=/usr/local/apr-util/,重新执行:./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr/   --with-apr-util=/usr/local/apr-util/

7 )出现configure:error: pcre-config for libpcre not found.解决办法:

7.1 )去http://pcre.org/网站下载或者在命令行中直接下载特定的程序包:wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz

7.2 ) 解压到/usr/src,在下载目录执行tar -zxvf pcre-x.x.tar.gz -C /usr/src/  (我用的是pcre-8.38.tar.gz)

7.3 ) 进入目录/usr/src/pcre-8.38,执行./configure --prefix=/usr/local/pcremakemake install

这是如果出现configure: error: You need a C++ compiler for C++support.错误提示

则用yum安装支持c++的编译器:gcc-c++

[root@centos6 pcre-8.38]# yum install -y gcc-c++

7.4 )然后再执行make;make install

8 )再次进入目录/usr/src/httpd-2.4.23,增加参数--with-pcre=/usr/local/pcre,重新执行:./configure --prefix=/usr/local/apache2  --with-apr=/usr/local/apr/ --with-apr-util=/usr/local/apr-util/ --with-pcre=/usr/local/pcre  然后再执行:make;make  install

(执行完上面的步骤后,我们的apache也就编译安装完成了,我们切换到我们的编译安装的目录“/usr/local/apache2”

[root@centos6testdir]# cd/usr/local/apache2

[root@centos6apache2]# ls

bin  build cgi-bin  conf  error htdocs  icons  include logs  man  manual modules

[root@centos6apache2]#

通过上面的查看结果我们能够看出来,在我们指定的安装目录下能够创建很多的目录,像bin目录,是存放二进制程序的;

lib目录,是库文件;

include目录,是他提供的头文件;

man目录,是他的帮助手册;

modules目录,是他的模块;

我们只关心他的bin目录即可,

[root@centos6apache2]# cd bin

[root@centos6bin]# ls

ab         checkgid   envvars-std  htdbm     httpd       rotatelogs

apachectl  dbmmanage fcgistarter   htdigest  httxt2dbm

apxs       envvars    htcacheclean  htpasswd logresolve

[root@centos6bin]#

在bin目录中有很多的应用程序,其中有一个叫:“httpd”还有一个脚本叫“apachectl”他是控制着apache服务启动关闭的。我们可以执行这个脚本,并向这个脚本中传递一个参数“start”,我们知道执行脚本有两种方法,一种就是写绝对路径,另一种就是写相对路径,我们这里就写绝对路径。

[root@centos6~]# /usr/local/apache2/bin/apachectlstart

AH00557:httpd: apr_sockaddr_info_get() failed for centos6.8-localhost.localdomain

AH00558:httpd: Could not reliably determine the server‘s fully qualified domain name,using 127.0.0.1. Set the ‘ServerName‘ directive globally to suppress thismessage

[root@centos6~]#

然后我们执行命令“netstat  -tna”或者执行命令“ss  -tnl”只要看到80端口处于监听状态,就表示我们的服务开始运行。

[root@centos6~]# ss -tnl

State   Recv-Q  Send-Q         Local Address:Port             PeerAddress:Port

LISTEN     0    128                   :::80                         :::*

只要这个服务正常运行了,那么我们就可以在浏览器上尝试访问他了。访问的时候我们需要注意的就是,我们先将apache这个服务所在的系统的防火墙临时关闭,如果还是访问不成功的话,我们再将系统上的selinux关闭。

我们测试的时候我们一般建议使用火狐浏览器,谷歌浏览器,等等...但是不建议使用360浏览器。我们在火狐浏览器上输入apache服务所在的主机的IP则会显示:

技术分享

出现上面的结果表示apache这个服务已经正常工作了。

9) 启动apache,进入/usr/local/apache2/bin目录,执行命令sudo ./httpd-k stop/start/restart 或者 sudo apachectl start/stop/restartapachectl是执行脚本)

9.1 )开启服务: sudo  apachectl start

9.2 )查看端口:ss -tnl 如果发现80端口打开了,那么就是正常启动了。

总结:其实我们在实际操作中,其实最难的就是第一步,需要我们配置一些特性,以及要安装的路径都在第一步上面,后面的二三步:make和make install其实直接执行命令即可,没什么需要配置的选项。

并且我们需要注意的就是,我们到上面的步骤为止,我们的编译安装apache并没有完成,上面的仅仅是完成的安装。

    比方说我们想将上面的服务停掉,我们应该怎样执行呢?

[root@centos6 ~]# apachectl stop

我们需要注意的是我们这里的apachectl可不是我们找的apache,因为刚才我们将httpd程序安装了/usr/local/apache2/bin中,我们可以执行一下

[root@centos6~]# echo $PATH

/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@centos6~]#

由上面的路径显示,我们自己安装的程序目录“/usr/local/apache2/bin”并没有出现在我们的环境变量中。那么我们在shell解释器中执行我们自己安装的应用程序时,shell就不会找到我们安装程序。所以像这样的PATH环境变量我们要进行修改;

第二个,我们安装的apache服务的库文件是在“/usr/local/apache2/lib”路径下,但是当前系统找库文件是找不这里的,所以我们也需要将这个程序的库文件路径给他改一改。

第三同样我们使用man手册时,man程序也是找不到我们安装的这个程序的man帮助手册的,所以我们要想使用man看到我们安装的程序的man手册页,我们还需要将这个man路径进行重新的输出

所以说我们编译安装完成一个程序后,我们还有很多后续的步骤需要完成。

 

安装后的配置:

1)导出二进制程序目录至PATH环境变量中;否则我们只能使用绝对路径来访问程序。

导出的步骤:

      在目录“/etc/profile.d/”下,编译一个新的以“.sh”结尾的跟程序名同名的配置文件。即/etc/profile.d/NAME.sh

然后在这个文件中写入:export PATH=/PATH/TO/BIN:$PATH

所以上面的apache的配置文件名就叫apache.sh文件中的内容为:

      export  PATH=/usr/local/apache2/bin:$PATH

编写完成后,我们可以重读这个配置文件就能生效,也可以关闭shell再打开一个新的shell

 

2)导出库文件路径:

      编辑/etc/ld.so.conf.d/NAME.conf 添加新的库文件所在目录至此文件中。

然后将我们的库文件路径添加进去即可。例如上面的apache的库文件路径,就是将

/usr/local/apache2/lib写进我们的库文件路径即可

      添加完成后,我们还需要让系统重新生成缓存。

           ldconfig  [-v] //如果我们想显示重读的过程,我们还可以加上“-v”选项。

 

3)导出头文件

           一般头文件是在/usr/include目录下,但是我们安装apache时,我们的头文件是在“/usr/local/apache2/include”中,那么我们这时就需要将这个路径输出到“/usr/include”路径中。我们可以直接复制一份到“/usr/inculde”当然我们创建连接也可以。

      所以我们当初头文件,我们只需创建连接即可。我们可以链接整个目录,也可以链接目录中的某个文件。

           基于链接的方式实现:

           ln  -sv 

 

4)导出帮助手册

      编辑“/etc/man.config”文件,添加一个MANPATH,并指明新路径即可

比方说,就用apache这个程序的帮助手册来说:

      我们只需编辑:  vim  /etc/man.config  然后找到MANPATH路径,然后我们再加一个MANPATH即可也就是添加一个:MANPATH=/usr/local/apache2/man这个添加完成后会立即生效的,这个无需担心。

总结:

      通过上面的安装后的配置发现,我们自己编译安装一个程序的时候,我们使用“--prefix”指明路径,一般我们系统不会找到,其实我们还需要做的简单一些,我们可以将“--prefix”直接指向“/usr”或者我们的根,只是我们卸载的时候麻烦。通常我们不指定安装路径是,默认是安装在“/usr/local”路径下。

 

练习:

      1.yum的配置和使用:包括yum repository的创建;

      2.编译安装apache 2.2;启动此服务;

 

 


 

本文出自 “11847750” 博客,请务必保留此出处http://11857750.blog.51cto.com/11847750/1876113

程序包管理