Linux【NO.3】:程序包管理

 

學習過程:後端管理工具rpm --> 前端管理工具yum --> 源碼包編譯安裝php

 

必備知識:API,ABI,源代碼,二進制文件,項目構建工具html

API:Application Program Interface 程序員面對的編程接口
ABI:Application Binary Interface 程序應用面對程序的的接口
    uNIX-like
        ELF
    WINDOS:
        exe,msi
    庫級別的虛擬化:
        Linux:WinE
        Windows:Cywin

C/C++程序格式:
    源代碼:文本格式的程序代碼
        源代碼依賴於編譯開發環境:編譯器、頭文件、開發庫
    二進制格式:文本格式的程序代碼-->編輯器-->二進制格式(二進制程序、庫文件、配置文件、幫助文件)
        二進制程序:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
        庫文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64
        配置文件:/etc,/etc/DIRECTORY, /usr/local/etc
        幫助文件:/usr/share/man,/usr/share/doc/APP-VERSION,/usr/local/share/man,/usr/local/share/doc其餘

    2進製程序所依賴的庫文件:
        查看命令:ldd ,ldconfig
            查看二進制程序所依賴的庫文件:ldd 二進制文件路徑
            [root@localhost Packages]# ldd /bin/ls
                linux-vdso.so.1 =>  (0x00007fff72187000)
                libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f3ff4e27000)
                libcap.so.2 => /lib64/libcap.so.2 (0x00007f3ff4c22000)
                libacl.so.1 => /lib64/libacl.so.1 (0x00007f3ff4a18000)
                libc.so.6 => /lib64/libc.so.6 (0x00007f3ff4657000)
                libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f3ff43f6000)
                liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f3ff41d0000)
                libdl.so.2 => /lib64/libdl.so.2 (0x00007f3ff3fcc000)
                /lib64/ld-linux-x86-64.so.2 (0x00007f3ff5061000)
                libattr.so.1 => /lib64/libattr.so.1 (0x00007f3ff3dc7000)
                libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f3ff3baa000)
            #       依賴的庫名    => 依賴的庫的路徑(在內存中的位置)        

            查看本機裝載的庫文件:ldconfig -p
            [root@localhost Packages]# ldconfig -p
                libz.so.1 (libc6,x86-64) => /lib64/libz.so.1
                libxtables.so.4 (libc6,x86-64) => /lib64/libxtables.so.4
                ........
                libxml2.so.2 (libc6,x86-64) => /usr/lib64/libxml2.so.2
項目構建工具:
    C/C++:make
    java:maven
必備知識簡單闡述

 

後端管理工具rpm前端


  想程序得以運行,咱們得到的源代碼須要編譯爲目標二進制格式(python:字節碼),而拿到的二進制文件,咱們還須要手動分配至不一樣的位置,而且操做系統標準匹配才能運行程序;對於初次接觸Linux的咱們來講難度很大;那麼,有什麼工具能夠幫助咱們自動完成這些操做呢?嘿嘿,早有人幫你解決這個麻煩了,讓咱們一塊兒來看看吧;java

rpm簡介:

  全名:redhat package manager;由redhat公司發展而來;後期爲了表示通用性採用遞歸循環名稱rpm is package manager;
  優勢:node

  •     一、源代碼編譯而成,不須要從新編譯,安裝方便;
  •     二、安裝前,會檢查系統硬盤容量、操做系統等信息,可避免被錯誤安裝;
  •     三、提供文件清單、程序包的名稱和版本、功能說明、校驗信息等信息,方便了解RPM包;
  •     四、使用程序組成清單和數據庫,方便後期升級、卸載等;

  缺點:python

  •     一、不能自動解決依賴關係

  rpm分類: 有編譯好的rpm包 和 未經編譯的rpm包,當咱們須要根據須要對源碼程序作特定編譯時就會用到未經編譯的rpm包;linux

rpm管理工具將編譯好的應用程序的各組成文件打包成一個或幾個程序包文件,從而更方便地實現程序包的安裝、升級、卸載和查詢等管理操做;程序員

源代碼包及rpm包命名格式對比:sql

why:源碼包裏有不少種功能,難到對於大多數用戶來說每一種功能都須要嗎?好比任何一類服務類程序它都應該有兩類組件:運行、開發庫,大多數上規模的程序都有開發環境,對這個程序作二次研發或加強性研發,若是不是程序員開發環境這些對咱們來講就沒有太大的意義,所以就有拆包的意義,把一個包拆分紅多個功能的包,按需安裝;

主包:name-VERSION-release.arch.rpm
支包:name-function-VERSION-release.arch.rpm
    function:devel(開發組件),utils(工具程序),libs..
拆包:主包和支包

 那麼程序包管理器裏都有些什麼呢?shell

  一、程序包的組成清單(每一個程序包都單獨實現):

  •  文件清單
  •  安裝或卸載時運行的腳本

  二、數據庫(公共)

  •  存儲程序包的名稱和版本
  •  依賴關係;
  •  功能說明;
  •  安裝生成的各文件的文件路徑及校驗信息;
  •  等等
rpm包數據庫存儲路徑:/var/lib/rpm

	[root@localhost rpm]# ls /var/lib/rpm | xargs -n1
	Basenames
	Conflictname
	Dirnames
	Group          #包組
	Installtid
	Name           #程序包名字
	Obsoletename
	Packages
	Providename
	Requirename
	Sha1header
	Sigmd5         #MD5校驗碼
	Triggername    #觸發器

既然有了這麼強大的工具,我怎麼獲取這些rpm包呢?

獲取程序包的途徑:
	(1)系統發行版的光盤或官方的文件服務器(或鏡像站點);
		http://mirrors.aliyun.com/
		http://mirrors.sohu.com
		http://mirrors.163.com
	(2)項目的官方站點;
	(3)第三方組織
		(a)EPEL
		(b)搜索引擎
			http://pkgs.org
			http://rpmfind.net
			http://rpm.pbone.net
	(4)本身動手,豐衣足食

	建議:檢查其合法性;來源合法性;程序包的完整性;

rpm命令管理程序包:

  當咱們得到了這些製做好的rpm包,那就來讓咱們大顯身手下吧;怎麼用man下就知道了。

  話很少說先上圖,看看rpm都有哪些功能;

安裝:  

  rpm {-i|--install} [install-options] PACKAGE_FILE ...

  rpm -ivh PACKAGE_FILE ...

rpm {-i|--install} [install-options] PACKAGE_FILE ...

    rpm -ivh PACKAGE_FILE ...

    [install-options]
        -h:hash marks輸出進度條;每一個#標識2%的進度,共50個;
        --test:測試安裝,檢查並報告依賴關係及衝突消息等;
        --nodeps:忽略依賴關係;不建議;
        --replacepkgs:從新安裝;注意它不能替換配置文件,若是包配置文件被修改建議刪掉在使用該參數;
        --justdb:更新數據庫,實際沒有安裝
        --noscripts:不運行腳本
        注意:每個rpm包安裝時有可能運行一些腳本作準備工做;rpm能夠自帶腳本;
            四類腳本分別在不一樣時刻觸發:--noscripts
                preinstall:安裝過程開始以前運行腳本,%pre, --nopre
                postinstall:安裝完成以後運行的腳本,%post,  --nopost
                preuninstall:卸載過程真正開四核執行以前運行的腳本,%preun, --nopreun
                postuninstall:卸載過程完成以後運行的腳本,%postun, --nopostun

        --nosignature :不檢查包簽名信息,不檢查來源合法性;
        --nodigest:不檢查包完整性信息;不檢查校驗MD5信息;
        
演示:
    [root@localhost Packages]# rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm    #普通安裝
    準備中...                          ################################# [100%]
        軟件包 zsh-5.0.2-7.el7.x86_64 已經安裝
    [root@localhost Packages]# rpm -ivh --replacepkgs zsh-5.0.2-7.el7.x86_64.rpm 
    準備中...                          ################################# [100%]
    正在升級/安裝...
       1:zsh-5.0.2-7.el7                  ################################# [100%]
    [root@localhost Packages]# cat /etc/shells | grep zsh    #查看shell終端接口是否增長了zsh
    /bin/zsh
    [root@localhost Packages]# rpm -ql zsh    #程序安裝生成的全部文件列表
安裝:-i

升級:
  rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
  rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

 rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
 rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

     -U:升級或安裝;
     -F:升級;只有擁有來版本才能升級

     rpm -Uvh PACKAGE_FILE ...
     rpm -Fvh PACKAGE_FILE ...

         --oldpackage:降級;
         --force:強制升級;

     注意:
         (1)不要對內核作升級操做;Linux支持多內核版本並存,所以,直接安裝新版本內核;
         (2)若是某源程序包的配置文件安裝後曾被修改過,升級時,新版本的程序提供的同一個配置不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)後提供;

演示:
[root@localhost Packages]# rpm -e zsh-html
[root@localhost Packages]# rpm -Fvh zsh-html-4.3.10-7.el6.x86_64.rpm 
[root@localhost Packages]# rpm -Uvh zsh-html-4.3.10-7.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:zsh-html               ########################################### [100%]
#這裏咱們卸載zsh-html。而後使用rpm -Fvh進行升級。由於不存在舊版程序包,因此不執行升級。
#而rpm -Uvh在不存在舊版程序包時,會對此程序包進行安裝
升級:-{U|F}

 卸載:
   rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...

    --allmatches:卸載全部匹配的指定名稱的程序包的各版本;
    --nodep:忽略依賴關係
    --test:測試卸載,dry run模式
卸載:-e

查詢:*****
  rpm {-q|--query} [select-options] [query-options]

rpm {-q|--query} [select-options] [query-options]

    [select-options]
        PACKAGE_NAME:查詢指定的程序包是否已經安裝,及其版本;
        -a,--all:查詢全部已經安裝過的包
            rpm -qa PACKAGE_NAME | grep "xx"
        -f FILE:查詢指定的文件由哪一個程序包安裝生成  ****
        -g,--group GROUP:查詢包組中包含了哪些包

        -p, --package PACKAGE_FILE:對於未安裝的程序包執行查詢操做;結合[query-options]使用;

        --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪一個程序包提供;
            [root@localhost ~]# rpm -q --provides  bash
            /bin/bash
            /bin/sh
            bash = 4.2.46-12.el7
            bash(x86-64) = 4.2.46-12.el7
            config(bash) = 4.2.46-12.el7
            [root@localhost ~]# rpm -q --whatprovides  bash
            bash-4.2.46-12.el7.x86_64
            [root@localhost ~]# rpm -q --whatprovides  'config(bash)'
            bash-4.2.46-12.el7.x86_64

        --whatrequires CAPABILITY:查詢指定的CAPABILITY由哪一個包依賴;

    [query-options]

        --changelog :查詢rpm包的changlog;
            ~]# rpm -q --changelog zsh
        -l,-list:程序安裝生成的全部文件列表; ****
        -i,--info:程序包相關的信息,版本號、大小、所屬的組;    ****
            ~]# rpm -qi bash
        -c, --configfiles:查看指定的程序包提供的配置文件;
        -d, --docfiles:查詢指定的程序包提供的文檔;
        --provides:列出指定的程序包提供的全部的CAPABILITY;
            ~]# rpm -q --provides  bash
        -R, --requires:查詢指定的程序包的依賴關係;       ****
        --scripts:查看程序包自帶的腳本片段有哪些;

    用法:

        已安裝包查詢
        -qi  PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
        未安裝包查詢
        -qpi  PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE, ...
查詢:-q

校驗:
  rpm {-V|--verify} [select-options] [verify-options]

校驗:
    rpm {-V|--verify} [select-options] [verify-options]

        S file Size differs   # 文件的容量大小是否被改變
        M Mode differs (includes permissions and file type) # 文件的類型或文件的屬性(rwx)是否被改變,
        5 digest (formerly MD5 sum) differs  # MD5 這種指紋碼的內容已經不一樣
        D Device major/minor number mismatch  #主次設備號不匹配
        L readLink(2) path mismatch    # 路徑不匹配
        U User ownership differs    # 屬主不匹配
        G Group ownership differs  # 屬組不匹配
        T mTime differs            #修改時間戳不匹配
        P caPabilities differ    #功能不匹配

演示:
~]# rpm -ql zsh
~]# vim /usr/share/zsh/5.0.2/functions/zrecompile
~]# rpm -V zsh
S.5....T.    /usr/share/zsh/5.0.2/functions/zrecompile
校驗:-V

  那麼校驗是怎麼校驗的呢?

校驗過程包括包來源合法性驗證和完整性驗證;來源合法性驗證是經過製做者數字簽名(RSA)來實現,而完整性驗證是經過單向加密(MD5...)對比來實現;

    當咱們進行校驗時,通常會經歷一下幾個過程:
        製做者加密:
        1、特徵碼:製做者將rpm包使用單向加密(md5/sha1/sha512...)定長輸出;
        2、用本身的私鑰加密特徵碼(數字簽名);
        3、將加密後的特徵碼附加到rpm後,發佈公鑰;
            注意: 可信任機構發佈的公鑰更安全些

        使用者解密:
        1、拿到公鑰的人能夠解密,獲得特徵碼;
        2、使用者將rpm包使用一樣的方法單向加密,獲得特徵碼;
        3、比較兩個特徵碼 

    獲取並導入信任的包製做者的密鑰:
    rpm --import /mydata/RPM-GPG-KEY-CentOS-7  # 掛載ISO文件的位置
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

    驗證:
        (1)安裝此組織簽名的程序時,會自動執行驗證;
        (2)手動驗證:rpm -K PACKAGE_FILE

演示:
[root@localhost Packages]# rpm -K zsh-5.0.2-7.el7.x86_64.rpm 
zsh-5.0.2-7.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 肯定
[root@localhost Packages]# 
手動驗證:-K

數據庫重建:

  CentOS 6 : man rpm

    rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]

  CentOS 7 : man rpmdb

數據庫重建:
    rpm管理器數據庫路徑:/var/lib/rpm;    查詢操做:經過此處的數據庫進行;

    咱們何時要重建數據庫呢?
        當咱們不當心誤刪除或文件有損壞的,就須要對數據庫進行重建(讀取每個包的信息,而後進行重建)
    
    注意:CentOS 7已經把重建數據庫的命令獨立出來;使用仍是沒有太大區別的;
    
    CentOS 6 : man rpm

    rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]
        --initdb:初始化數據庫,若是事先不存在數據庫,則新建之;不然,不執行任何操做;
        --rebuilddb:從新構建,經過讀取當前系統上全部已經安裝過的程序包進行從新建立;

    CentOS 7 : man rpmdb

    rpmdb [-v?] [--initdb] [--rebuilddb] [-D|--define 「MACRO EXPR」] [--undefine=MACRO]
    [-E|--eval 「EXPR」] [--macros=<FILE:…>] [--nodigest] [--nosignature] [--rcfile=<FILE:…>]
    [-r|--root ROOT] [--dbpath=DIRECTORY] [--querytags] [--showrc] [--quiet] [-v|--verbose]
    [--version] [-?|--help] [--usage]

演示:
[root@localhost ~]# man rpmdb
[root@localhost ~]# mkdir /tmp/rpm
[root@localhost ~]# rpmdb --initdb --dbpath=/tmp/rpm
[root@localhost ~]# ls /tmp/rpm/
Basenames     __db.001  __db.003  Group       Name          Packages     Requirename  Sigmd5
Conflictname  __db.002  Dirnames  Installtid  Obsoletename  Providename  Sha1header   Triggername
[root@localhost ~]# rpmdb --initdb --dbpath=/tmp/rpm
[root@localhost ~]# rpmdb --rebuilddb --dbpath=/tmp/rpm
[root@localhost ~]# ls /tmp/rpm/
Basenames     Dirnames  Installtid  Obsoletename  Providename  Sha1header  Triggername
Conflictname  Group     Name        Packages      Requirename  Sigmd5
數據庫重建:--{initdb|rebuilddb}

 前端管理工具yum


  有rpm這麼好的工具,爲何還要yum呢?哈哈,往下看就知道了;

  rpm包和包之間存在依賴關係,解決依賴關係會花費很長時間來解決,雖然咱們能夠忽略程序包的依賴關係,可是程序包的使用可能就會出現問題;這時候就須要在前端解決依賴關係的程序;

yum簡介:

  yum是一款C/S架構的工具。在本地可達的網絡服務器上有提供文件存儲服務的服務,在其所提供的存儲空間中放置了咱們所須要rpm包,而且提供了文件共享服務可輸出給它主機進行訪問;在本地的主機支持rpm管理功能、yum工具使用。咱們經過yum的配置文件就能得到所要的資源了。

YUM,是Yellow dog Updater, Modified 的簡稱,是杜克大學爲了提升RPM 軟件包安裝性而開發的一種軟件包管理器。起初是由yellow dog 這一發行版的開發者Terra Soft 研發,用python 寫成,那時還叫作yup(yellow dog updater),後經杜克大學的Linux@Duke 開發團隊進行改進,遂有此名。yum 的宗旨是自動化地升級,安裝/移除rpm 包,收集rpm 包的相關信息,檢查依賴性並自動提示用戶解決。yum 的關鍵之處是要有可靠的repository,顧名思義,這是軟件的倉庫,它能夠是http 或ftp 站點,也能夠是本地軟件池,但必須包含rpm 的header,header 包括了rpm 包的各類信息,包括描述,功能,提供的文件,依賴性等。正是收集了這些header 並加以分析,才能自動化地完成餘下的任務;
較爲全面的介紹

yum獲取rpm包過程

一、客戶端遠程鏈接到提供資源的服務端求情數據
二、服務端將保持有包的相關元數據信息文件發送給客戶端,不過在這以前有一次發送校驗碼的過程(repodata目錄下repomd.xml文件);一般元數據文件放在特定的目錄下,而每一個元數據文件都有與之對應的校驗碼以方便查詢其完整性;
三、客戶端將元數據文件放置於本地緩存區域中,並根據元數據文件分析是否有所需的rpm包名及依賴關係等;
四、客戶端檢查本地是否有rpm包相關依賴關係的文件
五、客戶端遠程鏈接至服務端下載所需rpm包,並緩存到本地執行安裝;
六、客戶端默認會刪除下載的rpm包,但元數據文件不會刪除;
缺點:
	若是獲取程序包中途終止,只能會從新獲取;
解決辦法:dnf工具;在Fedora 22中替代了YUM工具集,用法同樣就是換了命令而已;

    27 個 Linux 下軟件包管理工具 DNF 命令例子 :
	https://linux.cn/article-5718-1.html

對於服務器端來說只要能提供文件資源服務和資源數據就行:

  這些資源包括衆多rpm包,以及包的相關的元數據文件,而元數據放置於特定目錄下(repodata目錄)

  服務器全部提供的服務有多種:   ftp://   http://   nfs://   file:///

對於yum客戶端來說只要有yum工具和相關倉庫配置文件就行:  

  yum工具的配置文件:/etc/yum.conf;/etc/yum.repos.d/*.repo

  •   /etc/yum.conf:爲全部倉庫提供公共配置 ;其main 部分定義了全局配置選項,全局僅一個main;
  •   /etc/yum.repos.d/*.repo:爲倉庫的指向提供配置

倉庫指向的定義:

[repositoryID]
name=Some name for this repository #倉庫名
baseurl=url://path/to/repository/  #倉庫訪問路徑

或者baseurl=url://server1/path/to/repository/
      url://server2/path/to/repository/
      url://server3/path/to/repository/

keepcache={1|0}                      #本地緩存是否保存(rpm包)
enabled={1|0}                        #是否啓用此倉庫,默認啓動
gpgcheck={1|0}                       #是否檢查來源合法性和完整性
gpgkey=URL                           #指明密鑰文件
enablegroups={1|0}                   #是否支持組批量管理程序包,默認支持
failovermethod={roundrobin|priority} #指明baseurl有多個時優先級;默認爲:roundrobin,意爲隨機挑選;
cost=                                #開銷;默認爲1000;多個倉庫裏都有同一個rpm包可定義開銷,越小越先訪問;
演示:
[base]
name=Base Repo on 172.16.0.1
baseurl=http://172.16.0.1/cobbler/ks_mirror/CentOS-6.7-x86_64/
gpgcheck=0

[epel]
name=Fedora EPEL for EL6 x86_64
baseurl=http://172.16.0.1/fedora-epel/6/x86_64/
gpgcheck=0

[root@CentOS7 yum.repos.d]# yum repolist 
已加載插件:fastestmirror, langpacks
Repository epel is listed more than once in the configuration
base                                                      | 4.0 kB  00:00:00     
epel                                                      | 4.3 kB  00:00:00     
(1/5): base/                                              | 219 kB  00:00:00     
(2/5): epel/                                              | 149 kB  00:00:00     
(3/5): epel/                                              | 702 kB  00:00:00     
(4/5): base/                                              | 4.6 MB  00:00:00     
(5/5): epel/                                              | 5.7 MB  00:00:00     
Loading mirror speeds from cached hostfile
源標識                                  源名稱                              狀態
base                            Base Repo on 172.16.0.1                     6,575
epel                           Fedora EPEL for EL6 x86_64                   11,768
repolist: 18,343
演示:配置自定義yum倉庫

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

$releasever: 當前OS的發行版的主版本號;
$arch: 平臺;
$basearch:基礎平臺;
$YUM0-$YUM9

http://mirrors.magedu.com/centos/$releasever/$basearch/os
(1) 掛載光盤至某目錄,例如/media/cdrom
    # mount -r -t iso9660 /dev/cdrom /media/cdrom
(2) 建立配置文件
    [locate_cdrom]
    name=Locate Repo on cdrom
    baseurl=file:///media/cdrom
    gpgcheck=0
    enabled=1
配置光盤本地yum倉庫

yum命令的用法:

yum的命令行選項:

    --nogpgcheck:禁止進行gpg check;
    -y: 自動回答爲「yes」;
    -q:靜默模式;
    --disablerepo=repoidglob:臨時禁用此處指定的repo;
    --enablerepo=repoidglob:臨時啓用此處指定的repo;
    --noplugins:禁用全部插件;

安裝程序包:   
  install package1 [package2] [...]         後接報名;默認安裝最新版本的,只有安裝較老版本才指定版本號
  reinstall package1 [package2] [...]  (從新安裝)

升級程序包:
  update [package1] [package2] [...]
  downgrade package1 [package2] [...] (降級)         相似於:rpm -Fvh  --oldpackage PACKAGE_FILE ...

卸載程序包:
    remove | erase package1 [package2] [...]
    注意:其相關依賴包也會被卸載,謹慎使用;

清理本地緩存:
  clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

 構建緩存:   
   makecache     到各倉庫去下載;但咱們每次yum操做都會構建緩存,通常這個選項是沒有必要的;

 顯示程序包:
    list
        # yum list [all | glob_exp1] [glob_exp2] [...]
        # yum list {available|installed|updates|extras} [glob_exp1] [...]

顯示程序包:list
# yum list [all | glob_exp1] [glob_exp2] [...]
# yum list {available|installed|updates|extras} [glob_exp1] [...]

all:顯示全部
glob_exp:顯示glob風格的通配符
    ~]# yum list  php*
available:倉庫中有,但還沒有安裝的包
installed:已安裝的包
updates:能夠用於升級的包
extras:額外的包
obsoletes:過期的包
顯示程序包:yum list

檢查可用升級:
    check-update
    查詢yum配置文件提供的repo信息

查看程序包information:
    info [...]  相似於rpm -qi 的結果

查看指定的特性(能夠是某文件)是由哪一個程序包所提供:
    provides | whatprovides feature1 [feature2] [...]  相似於:rpm -q --provides  , rpm -qf

演示:
[root@localhost ~]# rpm -q --provides tar
/bin/gtar
/bin/tar
bundled(gnulib)
tar = 2:1.26-29.el7
tar(x86-64) = 2:1.26-29.el7

[root@localhost ~]# yum provides tar
已加載插件:fastestmirror, langpacks
Repository epel is listed more than once in the configuration
Loading mirror speeds from cached hostfile
2:tar-1.23-13.el6.x86_64 : A GNU file archiving program
源    :base

2:tar-1.26-29.el7.x86_64 : A GNU file archiving program
源    :@anaconda

[root@localhost ~]# yum provides /usr/bin/tar
已加載插件:fastestmirror, langpacks
Repository epel is listed more than once in the configuration
Loading mirror speeds from cached hostfile
2:tar-1.26-29.el7.x86_64 : A GNU file archiving program
源    :@anaconda
匹配來源:
文件名    :/usr/bin/tar

[root@localhost ~]# rpm -qf /usr/bin/tar
tar-1.26-29.el7.x86_64
演示:yum provides

查看指定包所依賴的capabilities:
    deplist package1 [package2] [...]
    查詢yum配置文件提供的repo信息

查看yum事務歷史:
    history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
    list
    stats:統計數據
    summary:摘要信息
每一次yum命令執行都是啓動一次yum的事務;
安裝、升級、卸載都會啓動一個事務

注意:不能並行安裝rpm包

演示:
[root@localhost yum.repos.d]# yum history 
已加載插件:fastestmirror, langpacks
ID     | 登陸用戶                 | 日期和時間       | 操做           | 變動數 
-------------------------------------------------------------------------------
     1 | 系統 <空>                | 2015-12-10 16:44 | Install        | 1137   
警告:RPM 數據庫已被非 yum 程序修改。
history list

[root@localhost yum.repos.d]# yum history stats
已加載插件:fastestmirror, langpacks
File        : //var/lib/yum/history/history-2015-12-10.sqlite
Size        : 1,353,728
事務: 1
開始於  : Thu Dec 10 16:44:14 2015
結束於    : Thu Dec 10 17:19:26 2015
計數      :
  NEVRAC :  1,137
  NEVRA  :  1,137
  NA     :  1,137
  NEVR   :  1,137
  RPM 數據庫:  1,137
  yum 數據庫:  1,137
history stats
查看yum事務歷史:yum history

包組管理的相關命令:
    * groupinstall group1 [group2] [...]                #指定包組安裝
    * groupupdate group1 [group2] [...]              #指定包組升級
    * grouplist [hidden] [groupwildcard] [...]      #顯示包組列表
    * groupremove group1 [group2] [...]             #刪除指定包組
    * groupinfo group1 [...]                                #顯示指定包組信息

 建立yum倉庫:

確保有createrepo程序
    [root@localhost yum.repos.d]# rpm -qa createrepo
    createrepo-0.9.9-23.el7.noarch

createrepo命令:
    createrepo [options] <directory>
        -g --groupfile <groupfile> # 指明那些包是一個包組
        --basedir #指明當前basedir的目錄,默認當前目錄;能夠指明到父目錄裏;
    根據每一個rpm包信息羅列堆積生成元數據文件及特徵碼文件;
        repomd.xml  全部repodata目錄下文件的指紋信息
建立yum倉庫:createrepo命令

源碼包編譯安裝


何時會用到源碼包編譯安裝呢?

  • 一、當找不到合適的rpm包時
  • 二、rpm包中的功能不符合須要時

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

其實編譯安裝很難的:

  咱們知道把源代碼變成可執行的二進制文件須要如下過程:源代碼 --> 預處理(預處理器) --> 編譯(gcc) --> 彙編(彙編器) --> 連接 ;若是這些過程你都很熟練,那麼相信LFS更難不到你;但咱們絕大部分人都只能望而生畏。並且由於程序在開發中通常是使用模塊開發的,因此文件中的代碼之間,極可能存在跨文件依賴關係。因此爲了方便用戶可以自主編譯源代碼。因此有了項目管理器make;

  make項目管理器會自動調用預處理器對源代碼進行預處理,後調用編譯器進行編譯,調用匯編器進行彙編,調用連接器進行連接。make針對每個源代碼都有一個配置文件(makefile),它會定義先安裝那個包,調用什麼編譯器,程序安裝路徑,庫文件安裝路徑等配置。因爲每一個用戶的服務器環境和平臺各不相同,因此make項目管理器利用configure腳本,具體流程是客戶運行make提供的configure腳本傳遞程序安裝路徑,啓動的特性等信息,configure能結合Makefile.in模版文件生產知足客戶平臺需求的makefile配置文件。

C、C++: make (configure --> Makefile.in(模板) --> makefile)

C代碼編譯安裝三步驟:

./configure -> make -> make install

0、前提:提供開發工具及開發環境

  開發工具:make, gcc等

  開發環境:開發庫,頭文件

  經過「包組」提供開發組件     CentOS 6: "Development Tools", "Server Platform Development"

一、./configure

  (1) 經過選項傳遞參數,指定啓用特性、安裝路徑等;執行時會參考用戶的指定以及Makefile.in文件生成makefile;

  (2) 檢查依賴到的外部環境;若是此時依賴的外部環境沒有配置,會致使報錯;

  --help: 獲取其支持使用的選項

--help: 獲取其支持使用的選項
  選項分類:

Installation directories:                     
  --prefix=/PATH/TO/SOMEWHERE: 指定默認安裝位置;默認爲/usr/local/
  --sysconfdir=/PATH/TO/SOMEWHERE:配置文件安裝位置

安裝路徑設定:Fine tuning of the installation directories
  --bindir=DIR            user executables [EPREFIX/bin]   #全部用戶運行的命令安裝的位置
  --sbindir=DIR           system admin executables [EPREFIX/sbin] #只有管理員運行的命令安裝的位置
  --libexecdir=DIR        program executables [EPREFIX/libexec]  #不容許用戶直接執行的命令安裝位置
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]  #配置文件安裝位置
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]  #共享數據目錄位置
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var] #本地狀態目錄安裝位置
  --libdir=DIR            object code libraries [EPREFIX/lib]   #庫文件安裝位置
  --includedir=DIR        C header files [PREFIX/include]       #頭文件安裝位置
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]

System types: 指明系統的類型;編譯操做能夠交叉編譯的;
--build=BUILD     configure for building on BUILD [guessed]  
--host=HOST       cross-compile to build programs to run on HOST [BUILD]
--target=TARGET   configure for building compilers for TARGET [HOST]

Optional Features: 可選特性
  --disable-FEATURE    #禁用特性
  --enable-FEATURE[=ARG] #啓動某特性
  注意:編譯安裝時有默認啓動的特性,咱們能夠根據須要去選擇;

  --enable-deflate   #壓縮。壓縮成一個包發過去,瀏覽器再解壓再變大。快、帶寬小,消耗cpu;對文本壓縮效率高。
  --enable-expires   #到期。
  --enable-headers   #激活http的頭
  --enable-modules=most    #激活大部分模塊。激活apache大多數經常使用功能。
  --enable-so 
  --with-mpm=worker  #    apache兩種模式之一。主進程,由線程對外服務。進程穩定安全,線程不穩定。併發可能大一些。
  --enable-rewrite   #僞靜態

Optional Packages: 可選包
  --with-PACKAGE[=ARG]
  --without-PACKAGE

Some influential environment variables:  #環境變量
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  CPP         C preprocessor     #C的預處理器
apache:configure幫助列表

二、make

  根據makefile文件,構建應用程序;

三、make install

  至關於使用了mkdir,install命令, 把二進制文件、庫文件、配置文件、幫助文件複製到對應的目錄中;

configure和Makefile.in是程序員經過兩個工具生成並提供給咱們使用的
開發工具:
  autoconf: 生成configure腳本;
    autoconf和別的配置文件結合生產configure腳本
  automake:生成Makefile.in
    automake和別的配置文件結合生產Makefile.in文件
其餘:configure和Makefile.in

 建議:安裝前查看INSTALL,README

安裝後的配置:

(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
演示:編譯安裝apache2.2
1、更新yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

2、安裝gcc
檢查是否安裝gcc:rpm -qa gcc
~]# yum install -y gcc

3、下載httpd服務,版本號2.4.18
wget http://olex.openlogic.com/package_versions/28219/download?package_version_id=105155&path=https%3A%2F%2Folex-secure.openlogic.com%2Fcontent%2Fopenlogic%2Fapache%2F2.4.18%2Fhttpd-2.4.18.tar.bz2

4、解壓http源碼包
[root@localhost tools]# tar xf httpd-2.4.18.tar.bz2 
[root@localhost tools]# cd  httpd-2.4.18/
[root@localhost httpd-2.4.18]# more INSTALL 

  APACHE INSTALLATION OVERVIEW

  Quick Start - Unix
  ------------------

  For complete installation documentation, see [ht]docs/manual/install.html or
  http://httpd.apache.org/docs/2.4/install.html

     $ ./configure --prefix=PREFIX
     $ make
     $ make install
     $ PREFIX/bin/apachectl start

5、經過./configure 跟特定須要的選擇經過Makefile.in開始構建生產makefile文件
解決依賴問題:固然也能夠直接安裝開發包組來解決
yum install  -y pcre-devel apr*
[root@localhost httpd-2.4.18]# ./configure --prefix=/usr/local/apache2 --sysconfdir=/etc/httpd2

缺乏依賴包報錯:
configure: error: APR not found.
configure: error: pcre-config for libpcre not found

6、make經過生成的makefile文件調用預處理器,編譯器等開始編譯安裝程序包
[root@localhost httpd-2.4.18]# make

7make install:把二進制文件、庫文件、配置文件、幫助文件複製到對應的目錄中
[root@localhost httpd-2.4.18]# make install

8、安裝後的配置

    (1) 導出二進制程序目錄至PATH環境變量中;
        編輯文件/etc/profile.d/NAME.sh
        [root@localhost httpd2]# cat /etc/profile.d/path_httpd.sh 
        export PATH=/usr/local/apache2/bin:$PATH
        [root@localhost httpd2]# . /etc/profile

    (2) 導出庫文件路徑
        編輯/etc/ld.so.conf.d/NAME.conf
            添加新的庫文件所在目錄至此文件中;
            
        讓系統從新生成緩存:
            ldconfig [-v]  #要顯示過程就加-v選項

        [root@localhost httpd-2.4.18]# cat /etc/ld.so.conf.d/apache2.conf 
        /usr/local/apache2/lib
        [root@localhost httpd-2.4.18]# ldconfig  

    (3) 導出頭文件
        基於連接的方式實現,導出整個目錄爲一個鏈接文件;ln -s

        [root@localhost apache2]# ln -sv /usr/local/apache2/include/  /usr/include/http2
        ‘/usr/include/http2’ -> ‘/usr/local/apache2/include/’
        [root@localhost apache2]# ls -l /usr/include/http2
        lrwxrwxrwx. 1 root root 27 Dec 26 18:01 /usr/include/http2 -> /usr/local/apache2/include/


    (4) 導出幫助手冊
        編輯/etc/man.config文件
            添加一個MANPATH

        [root@localhost apache2]# grep -B5 apache  /etc/man_db.conf 
        #MANDATORY_MANPATH             /usr/src/pvm3/man
        #
        MANDATORY_MANPATH            /usr/man
        MANDATORY_MANPATH            /usr/share/man
        MANDATORY_MANPATH            /usr/local/share/man
        MANDATORY_MANPATH            /usr/local/apache2/man
        [root@localhost man]# man httpd

9、啓動服務

    [root@localhost man]# apachectl start
    AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
     
    [root@localhost man]# ss -lntp | grep 80
    LISTEN     0      128                      :::80                      :::*      users:(("httpd",23704,4),("httpd",23697,4),("httpd",23696,4),("httpd",23695,4))
演示:編譯安裝apache2.2

 收工~~~~~

 

轉載請註明出處:http://www.cnblogs.com/jasperhsu/p/5078693.html

相關文章
相關標籤/搜索