程序包管理

如何使用光盤當做本地的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文件,在開頭他就告訴我們怎樣去編譯安裝一個程序文件。

wKioL1g2eJrAInueAACi22mOHoM779.png

 

 

接下來我們查看我們解壓的程序源代碼包中的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

wKioL1g2eLeCBp4EAAAy1tYuRt8882.png

wKiom1g2eM-QwJ5xAAAY0eLao2U989.png

如果發現沒有安裝,那麼我們執行安裝包組的命令即可:

[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則會顯示:

wKiom1g2eOuy7YWXAAAfrK-9grc997.png

出現上面的結果表示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;啓動此服務;

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章