1. 程式人生 > >2018-3-24Linux系統管理(12)程序包管理(3)yum前端配置及編譯

2018-3-24Linux系統管理(12)程序包管理(3)yum前端配置及編譯

Linux 系統管理

我們在這一章當中繼續講述yum命令,而後我們簡單講述一下源代碼安裝包的編譯及使用。

一、yum的命令行選項

我們在yum的配置文件中,一旦gpgckeck=1時,就意味著我們安裝程序包時,必須要檢查gpgckey的密鑰了,而後也必須指明該密鑰文件的路徑,否則不給予安裝,我們可以在命令行中可以指定禁止gpgckeck,因為命令行優先級要高於配置文件,那麽在眾多的選項當中,有一種可以禁止檢查gpg驗證功能的選項叫做--nogpgcheck,那麽我們現在將常用的命令行選項總結如下:

   yum的命令行選項:
       --nogpgcheck:禁止進行gpg check;
       -y:自動回答為"yes";
       -q:靜默模式;
       --disablerepo=repoidglob:臨時禁止指定的repo;
       --enablerepo=repoidglob:臨時啟用指定repo;
       --noplugins:禁用所有插件;

二、yum的repo配置文件中可用的變量

我們之前也看到過,在我們使用或配置yum文件時,其在配置文件中還可以使用變量。其用到變量的好處就是,我們在此前的bash章節當中講到過變量是什麽,以及變量所能夠發揮的效用,那麽在配置文件當中使用變量也是很容易理解的,比如說你是某個站點鏡像的維護者,為CentOS 5,6,7給用戶提供了相應的yum源,對CentOS 6來說,既有32位又有64位的操作系統,對於用戶來講,需要分別提供配置文件才可以,因為有可能有些人不會做該配置文件,所以可以在官方的鏡像站點上去下載,而後放置到某個目錄下,而後還得需要告訴用戶32位的是屬於什麽文件,64位的是屬於什麽文件,這樣造成的後果是管理繁雜,而且即是說明了32位的是屬於什麽文件,64位的是屬於什麽文件,恐怕用戶也不知道系統本身是32位還是64位,所以說區分太多,必然會導致對用戶的選擇來說是一種負擔,因此我們可以將遠程服務器上的所有的路徑訪問格式將其固定下來,比如說:

   http://mirrors.china.org/centos/6/i386/os
   http://mirrors.china.org/centos/6/x86_64/os
   http://mirrors.china.org/centos/7/x86_64/os

所以我們需要指明一個文件,對於以上網址以及系統發行商是不用變的,格式已經固定完成,但是對於不同的發型版及系統架構來說形式多變,我們就要用變量來替代放置於客戶端,當放置在客戶端時,能夠獲取到當前系統發行版的主版本號及系統架構,也就是說,該變量能夠自動替換6或者7。然後架構也是需要使用變量來進行自動替換的,所以說可以做到了一種文件達到多種場景使用。那麽使用內置變量的作用就是:

   第一:使用變量來判斷當前系統架構及發行主版本;
   第二:獲取平臺及平臺架構;

那麽我們經常使用的內置變量總結如下:

   yum的repo配置文件中可用的變量:
     $releasever:當前OS發行版的主版本號;
     $arch:平臺;
     $basearch:基礎平臺;
     $YUM0-$YUM9
    
     https://mirrors.aliyun.com/centos/$releasever/$basearch/os

在最常用的內置變量當中,無非就是$releasever$basearch,是我們經常所用到的,我們此前也講到過我們在.repo文件當中可以使用cost,來指定開銷,如果在倉庫中有多個應用程序的話,就要取決於cost開銷值。

2.1 創建yum倉庫

創建yum倉庫所使用到的命令為createrepo,通常我們使用yum倉庫時,一種方式為指向本地光盤,另一種方式為只想互聯網上的某個鏡像站點,無論是指向哪裏,都可以安裝createrepo命令,這個命令能夠在該倉庫目錄下創建repodata目錄,該目錄創建成功之後,就可以直接使用該yum倉庫,簡單來說就是repodata在哪裏,yum倉庫就指向該帶有repodata目錄下的目錄倉庫。
createrepo是由
Python所研發的一種程序,命令的用法很簡單,使用該命令指明目錄即可。

   創建yum倉庫:
      createrepo [options] <directory>

而對於選項來說,大部分是可以省略的,或者說一個都沒有照樣可以將該命令運行。具體使用如下:

# mkdir httpd
# mv httpd-2.4.25.tar.gz httpd
# cd httpd/
# createrepo httpd/
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

創建成功之後,我們進入httpd目錄下的repodata目錄,顯示並查看,該壓縮文件的命名方式都是由UUID格式命名組成。

# cd httpd/repodata/
# ls
01a3b489a465bcac22a43492163df43451dc6ce47d27f66de289756b91635523-filelists.sqlite.bz2
401dc19bda88c82c403423fb835844d64345f7e95f5b9835888189c03834cc93-filelists.xml.gz
5dc1e6e73c84803f059bb3065e684e56adfc289a7e398946574d79dac6643945-primary.sqlite.bz2
6bf9672d0862e8ef8b8ff05a2fd0208a922b1f5978e6589d87944c88259cb670-other.xml.gz
7c36572015e075add2b38b900837bcdbb8a504130ddff49b2351a7fc0affa3d4-other.sqlite.bz2
dabe2ce5481d23de1f4f52bdcfee0f9af98316c9e0de2ce8123adeefa0dd08b9-primary.xml.gz
repomd.xml

三、程序包的編譯安裝

無論之前我們使用rpm命令或yum命令來安裝時,都是使用二進制格式的程序包,那麽二進制的程序包都是由個人或某個組織編譯好的來對用戶進行提供。不過,別人提供的rpm包未必對所有人能夠適用,所以有的情況我們不得不編譯安裝,比如說第一方面就是找不到合適的rpm包,因為沒有那個組織或個人來進行制作,第二方面就是有符合的rpm包,但是有個問題就是,只是編譯了一部分功能,而使用該功能時這個包並沒有該功能,所以只能去編譯安裝,好在也有些組織考慮了該問題,所以rpm包有兩種格式,一種為編譯好的rpm包,另一種就是源碼rpm包。

但需要註意一點的是,裏面的rpm包是沒有經過編譯的,都需要經過編譯成為二進制才能夠使用。

   testapp-VERSION-release.src.rpm --> 安裝後,使用rpmbuild命令制作成二進制格式的rpm包,而後再安裝;

有時候不知道你的平臺是什麽的時候,使用該包時編譯成為CPU所使用的指令,一般來講編程語言(例如C語言),都要先預處理,然後在經過編譯,編譯之後會生成目標代碼,而後使用匯編將目標代碼轉換成為該平臺所理解的二進制的過程,簡單來講就是匯編成CPU可以理解為指令的過程。所以說能夠編譯成完全需要符合版本的程序包這麽一步過程而已。

   源代碼 --> 預處理 --> 編譯(gcc) --> 匯編 --> 鏈接 --> 執行

要想完成程序包的編譯安裝,很多源文件程序可能不止一個,也不應該只此一個,不止一個可以按照層級,按照不同的功能分別組織代碼文件,每個源文件可以當作單個的獨立組件,不過,它們之間也是有依賴關系的,所以說我們源代碼組織格式如下:

   源代碼組織格式:
      多文件;文件中的代碼段之間,很可能存在跨文件依賴關系;

所以說我們手動編譯的話,是非常困難的一件事情,那麽為了降低其編譯上的難度,或者說降低代碼管理之間上的難度,我們對代碼源程序有增強型的管理程序,它們都要有專門的項目管理器,對於C/C++來說,是用make工具,而對Java來說,使用的是maven

    C\C++: make (configure --> Makefile.sh --> makefile)
    java: maven

make需要一個指示文件,它裏面也有配置文件,make針對於每一個源代碼,都有相應的配置文件,而後在make時根據該配置文件做出相應的步驟與決定,比如:自動根據其配置文件如何進行預處理及編譯,該配置文件稱為makefile,但makefile文件並不是事先存在,也不是對於用戶的需要都是一樣的,因為做make之後,將來程序包還是得需要安裝,那麽二進制文件以及庫文件等程序文件安裝是一個問題,對於不同的用戶來講需要一定是不一樣,所以該配置文件一定不能寫死,不然的話沒有什麽靈活性了,而makefile文件是由Makefile.in文件生成的,而該文件可以理解為是一個模版,基於該模版來生成makefile文件,但該文件的生成是由根據用戶的需要來進行生成的,用戶可以指明路徑以及啟用某個功能,而啟用的特性是由configure工具來進行生成的makefile.in文件模版,之後生成了makefile文件。需要註意的是,make是構建項目的一個關鍵步驟,但make本身不是編譯器,而是調用gcc編譯器來完成編譯的。

   C編譯安裝三步驟:
       ./configure:
           (1) 通過選項專遞參數,指定啟用特性、安裝路徑等;執行時會參考用戶的指定以及Makefile.in文件生成makefile。
           (2) 檢查以來到的外部環境。
       make:
           根據makefile文件,構建應用程序;
       make install
           安裝到指定路徑中;

不過可能以上文件在源代碼包中可能不會自帶,不過可以自動生成該文件腳本及構建開發的應用程序,其開發工具項目為:

   開發工具:
       autoconf:生成configure腳本;
       automake:生成Makefile.in

所以安裝任何一個源代碼時,需要註意INSTALL文檔和README文檔。

       建議:安裝前查看INSTALL, README

3.1 編譯包獲取

那麽編譯包的獲取一般為兩種方式,一種是直接進入官方或者是開源協議站點,另一個是在某個代碼托管網站上去進行查找。

   開源程序源代碼的獲取:
       官方自建站點:
        apache.org (ASF)
        mariadb.org
        ...
      代碼托管:
        SourceForge
        Github.org
        code.google.com

在之前我們講過,對於系統級開發來說,我們使用的是C/C++或Go語言去研發的,而對於應用級開發來說,我們可以使用Java/Python等編程語言進行研發。

   c/c++:gcc (GNU C Complier)

3.2 編譯C源代碼

編譯C源代碼程序,剛才也講過了,無非也就是三步驟,值得需要註意的是,要想編譯安裝程序包,需首先提供開發環境。

   編譯C源代碼:
      前提:提供開發工具及開發環境
        開發工具:make, gcc等;
        開發環境:開發庫、頭文件;
            glibc:標準庫
        
        通過"包組"提供開發組件:
            CentOS 6 "Development Tools", "Server platform Development"

需要註意的是,對於CentOS 5, 6, 7來講,開發包組並不能容納所有的程序包。較新的程序包可能依賴於較新版本的編譯器,較老的也可能使用較老版本的編譯器來進行編譯。太老了功能有可能對新的編譯器來說不支持。那麽接下來我們可以直接安裝某個源碼程序包就可以了,使用configure腳本支持許多選項。

    第一步, configure腳本
          選項:指定安裝位置、指定啟用的特性;
    
          --help:獲取其支持使用的選項
            選項分類:
                安裝路徑設定:
                    --prefix=/PATH/TO/SOMEWHERE:指定默認安裝位置;默認為: /usr/local
                    --sysconfdir=/PATH/TO/SOMEWHERE:配置文件安裝位置;
                
                System types:指明系統類型,可進行交叉編譯;
            
                Optional Features:可選特性
                    --disable-FEATURE
                    --enable-FEATURE[=ARG]
                
                Optional Packages:可選包,依賴到的程序包
                    --with-PACKAGE[=ARG]
                    --without-PACKAGE
                
    第二步:make

    第三步:make install

以上三步第一步比較困難一些,不過到這一步算是完成安裝,但並沒有其配置完成,首先我們可能需要將運行路徑添加到環境變量中去,還有將庫文件路徑更改一下或者為導出等步驟。

   安裝後的配置:
     (1) 導出二進制程序目錄至PATH環境變量中;
          編輯文件/etc/profile.d/NAME.sh
             export PATH=/PATH/TO/BIN:$PATH
    
     (2) 導出庫文件路徑;
          編輯/etc/ld.so.conf.d/NAME.conf
             添加新的庫文件所在路徑至此文件中;
            
          讓系統重新生成緩存;
              ldconfig [-v]
            
     (3) 導出頭文件
          基於鏈接的方式實現;
            ln -sv
    
     (4) 導出幫助手冊
          編輯/etc/man.config手冊
             添加一個MANPATH
             MANPATH /PATH/TO/SOMEFILE


2018-3-24Linux系統管理(12)程序包管理(3)yum前端配置及編譯