1. 程式人生 > >CentOS程序包管理、上

CentOS程序包管理、上

CentOS程序包管理、上

程序包管理:
應用程序的安裝,實際上是解壓縮並復制程序包中的文件到指定目錄的過程;

應用程序的結構形式:
    源代碼:
        包含了整個應用程序完整的編程語言的所有代碼的文本文件集合;

        使用源代碼安裝應用程序:
            編譯開發環境:編譯器(gcc, GNU C Compiler),開發庫,頭文件,...

            預處理(預處理器) --> 編譯(編譯器) --> 匯編(匯編器) --> 鏈接(鏈接器) -->可以直接在CPU上運行的二進制程序文件;

        API:Application Programing Interface,應用編程接口;
            POSIX:POS, Portable Operating System, 可移植操作系統;

        ABI:Application Binary Interface,應用二進制接口;
            MySQL:
                windows系統:exe, msi
                Unix-like:ELF

    應用程序編程語言:
        系統級編程語言:
            C/C++/go

        應用級編程語言:
            Java/Python/perl/ruby/PHP/bash

    通常情況下,源代碼文件是多個文件文檔,而且這些文檔之間存在著某種聯系,可以通過軟件項目構建工具,自動的根據程序員提供的文件之間的依賴關系,自動完成應用程序編譯;
        軟件項目的構建工具:
            C/C++:make
            Java:maven
            Python:buildout

    二進制:
        將源代碼經過一系列的編譯、匯編、鏈接等操作之後,得到的可以直接執行的二進制程序及與之相關的其他文件;

    程序包:
        使用分包的方法,將已經編譯過的二進制文件及與之相關的其他文件,根據功能分別放入不同的程序包中,以供終端用戶自行選擇所需功能;並且可以自動的將用戶選擇的程序包中的文件展開到指定的目錄中;也可以在卸載應用程序時,自動將所有文件統一刪除;

程序包管理器:
    方便終端用戶進行程序的安裝、卸載、升級、安裝信息查詢及校驗等工作;

    不同的Linux的發行版本中,有不同的程序包管理器:
        Debian:dpt, Debian Package Toolkits;.deb後綴名的軟件包;
        Redhat:rpm, RedHat Package Manager;.rpm後綴名的軟件包;
            rpm成為Linux系統中的程序包管理的行業標準;
            rpm is Package Manager;
            rpm使用perl語言編寫的,後來又使用C語言將其重寫;
        S.u.S.E:rpm, .rpm後綴名的軟件包;

        Gentoo:借鑒了FREEBSD的portage程序包管理機制,ports方式,emerge工具;
        ArchLinux:pacman

以CentOS為例,rpm程序包管理器的相關內容:
rpm程序包的命名規則:
源代碼包:
name-Version(以後這就代表版本號).tar.gz(純源代碼包)
name-Version.src.rpm(rpm封包的源代碼包)
VERSION: Major.Minor.Release
Major:主版本號,通常只有程序進行了重大的功能改進才會修改;
Minor:次版本號,通常在某個主版本中的對某個特定功能進行改進或添加新功能才會修改;
Release:發行版本號,一般修復bug或進行了代碼優化都會更改;

    如:apache-tomcat-7.0.63.tar.gz

二進制包:
 name-Version-[release].[os].arch.rpm
    VERSION: Major.Minor.Release
    [release]: rpm封包的發行版本號;
    [os]: 此程序包所能夠支持的操作系統的版本;如:el7(RHEL7,CentOS7), suse11, fedora21, ...
    arch: 此程序包所依賴的硬件平臺類型:i386, x86_64(amd64), ppc, sparc, noarch, ...
     如:hping3-0.0.20051105-24.el7.x86_64.rpm

    在制作rpm程序包時,通常其制作者會根據自己的理解將程序編譯後的結果分別放置於不同的rpm包中,用以實現對於該程序的不同需求;將此種封包方式,稱為分包技術;一旦程序被分包,則程序包就被分為兩類:
        主程序包:
            name-Version-[release].[os].arch.rpm
        子程序包(分支程序包):
            name-function-Version-[release].[os].arch.rpm
                function:
                    devel:開發包;
                    utils:工具包;
                    libs:共享庫包;
                    manual:離線幫助文檔包;
                    ...
    程序包的依賴關系:
        程序包的安裝順序,被需要的應該先被安裝;

        X,Y,Z --> A
        A --> B,C 
        B --> X
        依賴地獄;

程序包管理的前端工具:
    就是為了解決各個程序包之間的依賴關系,阻止依賴地獄出現;

各個發行版中的前端工具:
    RHEL/CentOS系統:
        yum,Yellow dog Update Modifier
            yum在實施程序包安裝、升級、卸載等過程中,會開啟事務;
            事務一般具有四個特性:ACID
                所謂事務,即將整個操作過程視為一個不可分割的整體,其中的操作要麽全部都執行,要麽全部都不執行;

        dnf:Fedora22+

    Debian/Ubuntu系統:
        apt-get:實現安裝、卸載、升級、降級等deb包的管理工作;
        apt-cache:實現基於關鍵字進行搜索功能,管理本地緩存及緩存的元數據;

    S.u.S.E系統:
        zypper

在CentOS系統中,程序包管理器的核心是rpm;
其後端使用rpm命令行工具;
前端使用yum命令行工具或dnf命令行工具;

rpm命令行工具:
    功能:
        1.將編譯好的應用程序的各個文件打包成一個或多個程序包;
        2.支持rpm程序包的安裝、卸載、升級、降級、查詢、校驗及程序包信息數據庫管理功能;

rpm程序包文件的組成:
    1.被封包的程序文件;
    2.文件清單;
    3.程序在安裝或卸載時所需要運行的腳本,共有四種:
        preinstall:在正式的安裝操作開始之前所需要運行的腳本,標識為"%pre";
        postinstall:在安裝完成之後所需要運行的腳本,標識為"%post";
        preuninstall:在正式的卸載操作開始之前所需要運行的腳本,標識為"%preun";
        postuninstall:在卸載完成之後所需要運行的腳本,標識為"%postun";

    註:在一個rpm程序包中,並不一定同時有這四類腳本,也可以沒有這些腳本;

rpm數據信息的數據庫(公共):
    目錄:/var/lib/rpm

rpm程序包的獲取途徑:
    1.系統的發行版關盤;
    2.官方的文件服務器或者鏡像站點;
        阿裏雲鏡像
        網易鏡像
        搜狐鏡像
        ...
    3.某個應用程序項目的官方站點;
    4.第三方組織制作的rpm程序包站點:
        Fedora EPEL:Extra Package for Enterprise Linux;紅帽官方的社區組織,通常來說,在上述的鏡像站點中也會包括EPEL鏡像;
    5.某些專用的搜索引擎:
        http://pkgs.org
        http://rpmfind.net
        http://rpm.pbone.net
    6.自己動手制作rpm程序包;

註:除了自己制作的rpm程序包之外,建議在獲取程序包後,對其實施完整性校驗;

軟件包管理器(2)
rpm和yum兩個命令行工具

rpm命令行工具:
rpm - RPM Package Manager

QUERYING AND VERIFYING PACKAGES:
   rpm {-q|--query} [select-options] [query-options]

   rpm {-V|--verify} [select-options] [verify-options]

INSTALLING, UPGRADING, AND REMOVING PACKAGES:
rpm {-i|--install} [install-options] PACKAGE_FILE ...

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

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

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

安裝:rpm {-i|--install} [install-options] PACKAGE_FILE ...
install-options
-h,--hash:用"#"表示安裝進度條;
--force:強制安裝進行,無論是否有錯誤發生;不建議使用;
--test:並非真正安裝程序包,僅僅是測試安裝過程是否能夠正常進行;dry run
--nodeps:忽略因為依賴關系導致的安裝錯誤;不建議使用;
--replacefiles:在安裝程序包時,程序包中的文件會直接替換已經存在的文件;若不使用該選項,在安裝程序包中的文件之前,先將原有的同名文件改名為filename.rpmsave;
--replacepkgs:無需卸載已安裝程序包而重新安裝之;
--noscripts:在安裝前及安裝後均不允許安裝相關腳本;
--nopre:
--nopost:
--nosignature:跳過校驗程序包來源的合法性;
--nodigest:跳過校驗程序包完整性;
--oldpackage:降級安裝,指定的安裝的程序包的版本低於當前已經安裝的程序包的版本;

示例:]# rpm -ivh finger-0.17-52.el7.x86_64.rpm

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

相比較而言,兩個選項有下列特點:
    -U:既可以對已經安裝的程序包進行升級或降級安裝,又可以在未安裝該程序包時進行全新安裝;可以包括部分-i安裝模式的功能;
    -F:僅能夠對已經安裝的程序包進行升級安裝;

install-options
    -h,--hash:用"#"表示安裝進度條;
    --force:強制安裝進行,無論是否有錯誤發生;不建議使用;
    --test:並非真正安裝程序包,僅僅是測試安裝過程是否能夠正常進行;dry run
    --nodeps:忽略因為依賴關系導致的安裝錯誤;不建議使用;
    --replacefiles:在安裝程序包時,程序包中的文件會直接替換已經存在的文件;若不使用該選項,在安裝程序包中的文件之前,先將原有的同名文件改名為filename.rpmsave;
    --replacepkgs:無需卸載已安裝程序包而重新安裝之;
    --noscripts:在安裝前及安裝後均不允許安裝相關腳本;
        --nopre:
        --nopost:
    --nosignature:跳過校驗程序包來源的合法性;
    --nodigest:跳過校驗程序包完整性;
    --oldpackage:降級安裝,指定的安裝的程序包的版本低於當前已經安裝的程序包的版本;

註意:
1.強烈建議,不要使用此方法對內核進行升級操作;
2.升級安裝程序包可能會帶來文件的變化,或引入未知的BUG或漏洞,因此,在實施升級操作之前,必須要進行可行性分析;

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

註意:卸載程序包時,rpm命令的參數時程序名稱而非程序包的名稱;
    --allmatches:卸載所有能夠匹配指定名稱的程序包的各個版本;
    --nodeps:卸載時忽略依賴關系;
    --test:並非真正的卸載而是測試卸載過程是否能夠正常完成;dry run

查詢:rpm {-q|--query} [select-options] [query-options]
select-options
PACKAGE_NAME:指定要查詢的程序名稱,不是程序包名稱;
-a,--all:查詢所有已經安裝的程序包名稱;
-f,--file FILE:查詢指定的文件是由哪個程序包提供的;
-p,--package PACKAGE_FILE:查看尚未安裝的程序包文件中的文件清單;
--whatprovides CAPABILITY:查詢指定的CAPABILITY是由哪個程序包提供的;
--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個程序包所依賴;

query-options
    --changelog:查詢程序包的歷次的版本變更記錄;
    -c,--configfiles:查詢指定的程序包中包含哪些配置文件;
    -d,--docfiles:查詢指定的程序包中有哪些文件文件;
    -i,--info:查詢指定程序包的相關屬性信息;
    -l,--list:列表顯示;
    --provides:列出指定程序包所提供的所有的CAPABILITY;
    -R,--requires:列出指定程序包的依賴關系;
    --scripts:查詢程序包所攜帶的腳本的內容;

常用的選項組合:
    -qa 
    -qf | -qc | -qd | -ql PACKAGE_NAME
    -qpl | -qpc | -qpd | -qpl PACKAGE_FILE

校驗:rpm {-V|--verify} [select-options] [verify-options]
校驗的狀態
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
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

認證:
    rpmkeys --import PUBKEY ...
        導入指定的認證密鑰的路徑;

    rpmkeys {-K|--checksig} PACKAGE_FILE ...
        檢查指定的程序包的數字簽名信息;

數據庫管理:
    rpmdb命令:
    /var/lib/rpm
        --initdb:初始化數據庫
        --rebuilddb:從已安裝軟件包包頭重建數據庫反向列表

程序包管理的前端工具:
RHEL/CentOS系列發行版Linux中,yum和dnf;

yum命令行工具:
    Yellow dog Updater Modifier

軟件倉庫:Package Repository
    在軟件倉庫中,存放有大量的rpm程序包,將所有的rpm程序包的屬性信息提取出來,保存於xml格式的文檔之中;

利用URL標記並定位軟件倉庫的位置,並且可以直接讀取和緩存軟件倉庫中事先創建的xml文檔的內容到本地;
    URL:統一資源定位符;
        schema://[username@]hostname[:port][/PATH/TO/RESOURCE][parameters][flag]
            schema:
                http
                ftp
                file
                ...

    yum是C/S架構的模型,服務器端其實就是軟件倉庫,客戶端需要在指定的配置文件中填寫正確的URL,以能夠通過正確的協議訪問到軟件倉庫中的各程序包;
        在服務器上,軟件倉庫其實就是一個目錄,在目錄中包含了程序包文件及與這些程序包對應的元數據文件;所有的元數據文件統一放置於名為"repodata"目錄中;程序包的元數據通過createrepo命令來構建:

            createrepo命令:
                createrepo - Create repomd (xml-rpm-metadata) repository
                createrepo [options] <directory>

        在客戶端上,使用配置文件到服務器的URL的指向;
            yum的主配置文件:/etc/yum.conf
            yum的片段配置文件:/etc/yum.repos.d/*.repo
                片段配置文件擁有ini風格的配置模式:即分段式配置內容;
                    1.使用"[Repositoryid]"唯一標識出軟件倉庫;
                    2.其他的配置信息都類似於變量的復制,即key=value;
                    3.在軟件倉庫的標記下面的所有的配置信息都針對其上面的倉庫生效,直到遇到下一對"[]"為止;

                每個片段配置文件中,都可以配置一個或多個倉庫的指向;而且,yum程序在查找各個倉庫的時候,每一次都可能會查找多個yum倉庫,並且從所有的可以使用的倉庫中選擇所需程序包的最新版本並緩存到本地進行安裝、升級等操作;
                    同一個repoid下的多個倉庫被稱為鏡像,只有一個倉庫會被使用;
                    多個不同repoid的倉庫,可以同時被使用;

.repo文件的內容格式:
[repositoryid]
name=Full name of Repository
baseurl=schema1://hostname/PATH
schema2://hostname/PATH
schema3://hostname/PATH
schema4://hostname/PATH
...
enabled={0|1}
gpgcheck={0|1}
gpgkey=schema://hostname/PATH/TO/PUBLIC_KEY
如:gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-7
failovermethod={roundrobin|priority}
cost=NUMBER

.repo文件的格式示例:
[myrepo]
name=repository on localhost cdrom
baseurl=
#mirrorlist=
enabled=1
gpgcheck=0
#gpgkey=

yum命令行工具:
yum - Yellowdog Updater Modified
command is one of:

  • install package1 [package2] [...]
  • update [package1] [package2] [...]
  • update-to [package1] [package2] [...]
  • update-minimal [package1] [package2] [...]
  • check-update
  • upgrade [package1] [package2] [...]
  • upgrade-to [package1] [package2] [...]
  • distribution-synchronization [package1] [package2] [...]
  • remove | erase package1 [package2] [...]
  • autoremove [package1] [...]
  • list [...]
  • info [...]
  • provides | whatprovides feature1 [feature2] [...]
  • clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
  • makecache [fast]
  • groups [...]
  • search string1 [string2] [...]
  • shell [filename]
  • resolvedep dep1 [dep2] [...]
    (maintained for legacy reasons only - use repoquery or yum provides)
  • localinstall rpmfile1 [rpmfile2] [...]
    (maintained for legacy reasons only - use install)
  • localupdate rpmfile1 [rpmfile2] [...]
    (maintained for legacy reasons only - use update)
  • reinstall package1 [package2] [...]
  • downgrade package1 [package2] [...]
  • deplist package1 [package2] [...]
  • repolist [all|enabled|disabled]
  • repoinfo [all|enabled|disabled]
  • repository-packages <enabled-repoid> <install|remove|remove-or-rein‐
    stall|remove-or-distribution-synchronization> [package2] [...]
  • version [ all | installed | available | group- | nogroups | grouplist |
    groupinfo ]
  • history [info|list|packages-list|packages-info|summary|addon-
    info|redo|undo|rollback|new|sync|stats]
  • load-transaction [txfile]
  • updateinfo [summary | list | info | remove-pkgs-ts | exclude-updates |
    exclude-all | check-running-kernel]
  • fssnapshot [summary | list | have-space | create | delete]
  • fs [filters | refilter | refilter-cleanup | du]
  • check
  • help [command]

    常用選項:
    -y, --assumeyes:對於yum執行過程中與用戶交互的問題,全部以"yes"回答;
    -q, --quiet:安靜模式,在一次安裝事務中,不輸出任何信息;
    --enablerepo=repoidglob:
    即使被指定的repoid是被禁用的,也可以通過該選項將其啟用;
    --disablerepo=repoidglob:
    即使卑職的repoid是被正常啟用的,也可以通過該選項將其禁用;
    --noplugins:在yum執行過程中,明確指出不使用任何插件;
    --nogpgcheck:在yum的執行過程中,明確指出不進行程序包完整性認證;

    command:
    安裝程序包:

  • install package1 [package2] [...]

    註意:
        1.如果啟用安裝時僅給出程序名稱,並沒有給出程序版本,平臺類型及操作系統類型等信息的話,yum將會搜索所有的處於啟用狀態的倉庫,並找到版本最新的程序包進行安裝;
        2.如果啟用安裝時給出的是帶有程序版本,平臺類型及操作系統類型等信息的程序名稱,則在所有的倉庫中查找與之完全匹配的程序包進行安裝;
        3.如果啟用安裝時給出的是完整的程序包名稱,則只查找特定的程序包進行安裝;
        4.程序包名或程序名可以使用通配符(Globbing), * ? [] [^]
    
    升級和降級安裝程序包,讓程序包在不同的版本之間更叠:
  • update [package1] [package2] [...]
  • downgrade package1 [package2] [...]

    卸載程序包:
  • remove | erase package1 [package2] [...]

    查看程序包:

  • list [available|installed|all]

    查看程序包的相關信息:

  • info [...]

    清除本地相關緩存信息:

  • clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

    手動構建本地緩存:

  • makecache [fast]

    顯示所有可用的倉庫的相關信息,如果緩存消失,則先緩存再顯示:

  • repolist [all|enabled|disabled]

    模糊搜索:

  • search string1 [string2] [...]

    程序包組管理命令:

  • groups [...]
    group install
    group update
    group list
    group remove
    group info

    顯示指定程序包的所有的依賴關系:

  • deplist package1 [package2] [...]

    恢復yum的安裝事務:

  • load-transaction [txfile]

    Fedora提供的第三EPEL倉庫,到任何一個鏡像站點下載epel-release-latest-7.noarch.rpm程序包,在linux本地使用rpm或yum直接安裝,即可在/etc/yum.repos.d目錄中生成一個epel.repo的配置文件;

    yum的repo配置文件中的常用變量:
    $basearch:當前計算機所使用的基礎平臺架構類型:
    i686
    x86_64(amd64)
    ppc
    ppc64

    $releasever:當前操作系統發行版本的主版本號:
    如:CentOS 7.2-1511,其發行版本的主版本號是7;
    CentOS 6.9,其發行版本的主版本號是6;

    $arch:平臺架構類型

    $YUM0~$YUM9:yum內置的可以由用戶自定義的10個變量;

    http://mirrors.sohu.com/fedora-epel/6/x86_64/
    http://mirrors.sohu.com/fedora-epel/7/x86_64/

    [epel]
    name
    baseurl=http://mirrors.sohu.com/fedora-epel/$releasever/$basearch/

CentOS程序包管理、上