8月20日程序包管理

程序包管理

概述

   API:Application Program Interface應用編程接口
   ABI:Application Binary Interface應用二進制接口
   Unix-like,
      ELF
   Windows
      exe,msi

   庫級別的虛擬化:  
           linux:WinE(模擬windows)
           Windows:Cywin(模擬linux)
   系統級開發:
      C/C++:httpd,vsftpd,nginx
      go

   應用級開發:
         java/python/perl/ruby/php
         java:hadoop,hbase,(jvm(java虛擬機))
         Python:openstack,(pvm(python虛擬機))
         perl:(per解釋器)
         php:(php解釋器)

   c/c++程序格式:
       源代碼:文本格式的程序代碼;
       編譯開發環境:編譯器、頭文件、開發庫
       二進制格式:文本格式的程序代碼->編譯器->二進制格式(二進制程序、庫文件、配置文件、幫助文件)


java/python程序格式:
       源代碼:編譯成能夠在其虛擬機(jvm/pvm)運行的格式;
       開發環境:編譯器、開發庫

     二進制:

項目構建工具:
    c/c++:make
    java:maven

程序包管理器:

   源代碼-->目標二進制格式(二進制程序、庫文件、配置文件、幫助文件)-->組織成為一個或有限幾個“包”文件;
      安裝、升級、卸載、查詢、校驗


   程序包管理器:
       debian:dpt,dpkg,".deb"
       redhat:redhat package manager,rpm, ".rpm";rpm is package manager;
       S.u.S.E:rpm,".rpm",

       Gentoo:ports
       Archlinux:

   源代碼:name-VERSION.tar.gz
        VERSION:major,minor,release

rpm包命名格式:

    name-VERSION-release.arch.rpm
        VERSION:major.minor.release
        release.arch:rpm包的發型號
           release.os:3.el7.i386.rpm(適用于redhat7,32為的程序包,第三次制作的程序包)
           archetecture(架構):i386,x64(amd64),ppc,noarch

   redis-3.0.2.tar.gz-->redis-3.0.2-1.centos7.x64.rpm (包命名格式)

   changelog

     拆包:主包和支包
        主包:name-VERSION-release.arch.rpm
        支包:name-function(功能)-VERSION-release.arch.rpm
           function:devel,utils,libs,...

依賴關系:

 包和包之間存在復雜的依賴關系
  X,Y,Z

       X-->Y,Z
          Y-->A,B,C
          C-->Y
       循環依賴關系

前端工具:自動解決依賴關系;

      yum:rhel系列系統上rpm包管理器的前端工具;
      apt-get(apt-cache):deb包的管理器的前端工具;
      zypper:suse的rpm管理器前端工具;
      dnf:Fedora 22+系統上rpm包管理器的前端工具;

程序包管理器:

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

   1、程序包的組成清單(每個程序包都單獨實現);
         文件清單
         安裝或卸載時運行的腳本
   2、數據庫(公共)
         程序包的名稱和版本;
         依賴關系;
         功能說明;
         安裝生成的各文件的文件路徑及校驗碼信息;
         等等

         /var/lib/rpm/ :這個路徑下所存放的是rpm包的數據庫

獲取程序包的途徑:

   (1)系統發行版的光盤或官方文件服務器(或鏡像站點):
        htty://mirrors.allyun.com
        htty://mirrors.sohu.com
        htty://mirrors.163.com
    (2)項目的官方站點
   (3)第三方組織:
          (a)EPEL:
          (b)搜索引擎
                htty://pkgs.org

                htty://rpmfind.net

                htty://rpm.pbone.net
    (4)自己動手,豐衣足食

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

centos系統上rpm命令管理程序包:

 安裝、升級、卸載、查詢和校驗、數據庫維護

 rpm命令:rpm [options] [PACKAGE_FILE]
     安裝:-i,--install
     升級:-U,--update,-F,--freshen
     卸載:-e,--erase
     查詢:-q,--query
     校驗:-V,--verify
     數據庫維護:--builddb,--initdb

安裝:卸載時用的是name包名

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

      GENERAL OPTIONS:通用選項
             -v: verbose,詳細信息
             -vv:更詳細的輸出

安裝時真正用的是:rpm -ivh PACKAGE_FILE,例如:

8月20日程序包管理

  [install-options]:
            -h:hash marks輸出進度條;每個#表示2%的進度;
            --test:測試安裝,檢測并報告依賴關系及沖突消息等;
            --nodeps:忽略依賴關系;不建議,即使裝上也沒法用;
            --replacepkgs:重新安裝,例如先把/etc/zshrc里的文件改掉,但我不知道修改哪里且無法復原,我就需要重新安裝一下包來恢復。
                        但是,這里的修改系統會認為是認為故意的,所有不會恢復。這時候要刪除整個/etc/zshrc,再重新安裝包

8月20日程序包管理

注意:rpm可以自帶腳本;
  四類:--noscripts都不執行
    preinstall:安裝過程開始之前運行的腳本,%pre, --nopre不執行
    postinstall:安裝過程完成之后運行的腳本,%post, --nopost不執行
    preuninstall:卸載過程真正開始執行之前運行的腳本,%preum,--nopreun不執行
    postuninstall:卸載過程完成之后運行的腳本,%postun,--nopostun不執行

    --nosignature:不檢查包簽名信息,不檢查來源合法性;
    --nodigest:不檢查包完整性信息;

升級:用的是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)后提供;

卸載:卸載時用的是name包名,不需要路徑

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

         --allmatches:卸載所有匹配指定名稱的程序包的各版本;

         --nodeps:忽略依賴關系
         --test:測試卸載,dry run模式

查詢(非常重要):查詢時用的是name包名,不需要路徑

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

        [select-options]
           PACKAGE_NAME:查詢指定的程序包是否已經安裝,及其版本;

8月20日程序包管理

           -a,--all:查詢所有已經安裝過的包,這里可以用正則表達式

8月20日程序包管理

           -f FILE(路徑) :查詢指定的文件由哪個程序包安裝生成;非常有用

8月20日程序包管理

           -p,--package PACKAGE_FILE:用于實現對未安裝的程序包執行查詢操作;


           --whatprovides CAPABILITY:查詢指定CAPABILITY由哪個程序包提供;
           --whatequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴;

        [query-options]
           --changelog:查詢rpm包的changlog;
           -l,--list:程序安裝生成的所有文件列表;

8月20日程序包管理

           -i,--info:程序包相關的信息,版本號、大小、所屬的包組,等;

8月20日程序包管理

           -c,--configfiles:查詢指定的程序包提供的配置文件;

8月20日程序包管理

           -d,--docfiles:查詢指定的程序包提供的文檔;

           --provides:列出指定的程序包提供的所有的CAPABILITY

8月20日程序包管理

           -R,--requires:查詢指定的程序包的依賴關系

8月20日程序包管理

           --scripts:查看程序包自帶的腳本片段

8月20日程序包管理

     用法:
          -qi PACKAGE(查詢information),-qf FILE(指定文件由哪個包安裝生成),-qc PACKAGE(配置文件),-ql PACKAGE(程序包安裝生成的文件列表),-qd PACKAGE(程序包安裝生成的文檔)
          -qpi PACKAGE_FILE,-qpl PACKAGE_FILE,-qpc 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數據指紋信息,文件的di5碼發送改變
    D Device major/minor number mismatch主次設備號改變
    L readLink(2) path mismatch  readlink的路徑不匹配
    U User ownership differs  屬主改了
    G Group ownership differs  屬組改了 
    T mTime differs     最近一次的時間戳改了
    P capabilities differ  capabilities改了

     可以指明檢測哪些信息,也可以指明不檢查哪些信息

包來源合法性驗證和完整性驗證:

 來源合法性驗證:印簽,數字簽名
 完整性驗證:
 制作者制作一個rpm包,第一步要先使用單向加密算法去提取出包的特征碼來,特征碼是定長的。
 第二部,制作者會用自己的私鑰去加密這段特征碼,然后附加在文件后面。
 使用者拿到這個包后,第一步驗證來源合法性,拿到制作者的公鑰,解密這段特征碼。
 同樣的用單向加密算法對包做計算,算出特征碼,只要數據沒改變,和以前的特征碼一定是一樣的。二者一樣,包的完整性就得到了驗證。
 如何獲得合法的公鑰,通過第三方加密機構獲得,要通過可靠手段來拿到

 獲取并導入信任的包制作者的密鑰:
   對于centos發行版來說:rpm --import/etc/pki/rpm-gpg/RPM-GPG-KEY-Centos-7

8月20日程序包管理

8月20日程序包管理

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

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

 獲取幫助:
   centos 6:man rpm
   centos 7:man rpmdb

   rpm{--initdb|--rebuildbd}[--dbpath DIRECTORY][--root DIRECTORY]
      --initdb:初始化數據庫,當前無任何數據庫可實施化創建一個新的;當前有時不執行任何操作;
      如果實現不存在數據庫,則新建之;否則,不執行任何操作

      --rebuiddb:重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重新創建;

      無論當前存在與否,直接重新創建數據庫

回顧

linux程序包管理的實現、rpm包管理器

  rpm命令實現程序管理
     安裝:-ivh,--nodeps,--replacepkgs
     卸載:-e,--nodeps
     升級:-Uvh,-Fvh,--nodeps,--oldpackage
     查詢:-q,-qa,-qf,-qi,-qd,-qc,--scripts,-q --changlog(查詢更新日志),-q --provides,-q --provides,-q --requires
     校驗:-V

     導入GPG密鑰:--import,-K,--nodigest,--nosignature
     數據庫重建:--initdb,--rebuilddb

linux程序包管理(2)

  Centos:yum,dnf

  ftp://172.16.0.1/pub/

yum是用來解決依賴關系的,自動解決依賴關系,完成包的安裝

yum是cs架構的工具,工作前提要求本地客戶端可達的網絡上,首先,這可以是一個文件服務器,可以提供很大的存儲空間,在這個空間上放置所有對我們有用的rpm包。這個目錄文件共享的方式輸出到外部主機,讓主機能夠訪問??梢杂衛inux主機,可以支持yum工具的使用,當用戶需要安裝程序包的時候,可以不用rpm命令,而使用yum,接到命令后會根據本地所指向的提供服務的訪問地址(URL),互聯網提供共享服務的服務器有很多。

yum需要一個配置文件指明要訪問網絡中的哪一個服務器。yum在接收到安裝程序包的指定后,會嘗試通過文件中 的配置指定去找遠程的服務器。服務器會提供一個程序包倉庫,會有一個元數據信息,指明倉庫中存放的包名,版本等。yum安裝程序包時去找倉庫的時候,yum會首先請求服務器把元數據文件發過來,先放置在本地的緩存區域中(cache),yum就開始分區這個cache,看有沒有用戶想要的程序包的包名,如果有就開始嘗試讀取這個包。每一個包和程序包之間可能會存在依賴關系,還會去嘗試根據元數據文件取分析依賴關系。接下來去查詢本地以安裝的程序包,分析完后把剩余的尚未安裝的包給列出來,和我們要安裝的程序包給列出來,最后把自己扮演為文件客戶端的角色,去嘗試連線對應的文件服務器,開始去下載對應的程序包文件。

下載完先緩存在本地,在本地執行類似于rpm的安裝操作,安裝時會自動先安裝被依賴的程序包,安裝完成開始返回告訴客戶端安裝完成,安裝完會把緩存中的文件刪除。安裝完成后會自動刪除程序包,但元數據文件不會刪除。因為下次再安裝程序包時,直接分享本地的元數據就可以了。如果遠程服務器中的包,依賴關系之類的發送改變,元數據文件也會發生改變。

yum每次都會遠程到服務器去請求元數據。在倉庫上,元數據文件不止一個,服務器中還有一個特殊文件,這個文件記錄了沒一個元數據文件的校驗碼,本地緩存的文件也有校驗碼,每一次yum到服務器客戶端請求元數據時會先請求校驗碼,先拿到校驗碼和本地對比是不是發生改變,只有文件沒變校驗碼一定不變。檢測完一樣,本地緩存繼續有效,否則還是請求重新下載元數據文件。可以大大節約網絡帶寬,還能保證本地緩存文件是最新版本的。

查詢本地程序包,發現分析本地元數據文件時,但遠程服務器連不上。這是看自己是否要用未知的文件。

yum不是rpm的取代者,只是rpm的前端管理工具,yum是依賴rpm才能存在的。yum解決安裝問題,rpm在后臺完成查詢等各種管理操作,對后期應用很有用。

本地進行yum操作,需要自行去配置一臺服務器主機,配置成文件服務器。一般yum所支持的文件服務器有兩種:1、ftp 2、http。把這些文件創建出元數據文件。有一個命令去生成,元數據文件是通過分析每一個程序包的元數據,再從中抽取出來給羅列在元數據文件中實現的。工具creatrepo

creatrepo用來創建高級程序包時比較困難

YUM:yellow dog,Yellowdog Update Modifier

yum repository:yum repo
     存儲了眾多rpm包,以及包的相關的元數據文件(放置于特定的目錄下:repodata):

     安裝過程也會用到依賴關系分析,用到倉庫,默認倉儲都是本地光盤當倉庫來使用,操作系統的安裝鏡像光盤,本身就是一個倉庫。repodata目錄所在的位置就是倉庫應該指向的路徑,并不是rpm包所在的目錄是倉庫,而是repodata這個目錄所在的位置應該是倉庫所指向的路徑。

     文件服務器:
        ftp://
        http://
        nfs://
        file:///   本地倉庫,把鏡像光盤當倉庫

yum客戶端所指定的文件

8月20日程序包管理

配置文件: /etc/yum.conf:為所有倉庫提供公共配置(主配置文件通常只提供各yum倉庫指向的公共配置) /etc/yum.repos.d/*.repo:為倉庫的指向提供配置(可以配置一個或多個倉庫指向)

主配置文件

8月20日程序包管理

定義yum的特性

倉庫的定義:
[reposotoryID]
name-Some name for this repository
baseur1-ur1://path/to/repository/
enabled={1|0}默認為1,倉庫是否可以用
gpgcheck={1|0}:安裝前是否堅持完整性或來源合法性
gpgkey=URL:密鑰文件
enablegroups={1|0}是否支持在此倉庫上使用組
failovermethod={roundrobin|prority}故障轉移方法,默認為roundrobin意為隨機挑選
cost=1000 :開銷數字,默認為1000

倉庫id

8月20日程序包管理

每一個中括號當中定義了一個配置段,可能只對某一段生效

教室的yum

8月20日程序包管理

8月20日程序包管理

8月20日程序包管理

8月20日程序包管理 repodata上一級目錄,就是目前這一級

配置yum倉庫

8月20日程序包管理

8月20日程序包管理

配置好以后查看yum倉庫

8月20日程序包管理

這樣就可以使用了

yum命令的用法:

yum [options] [command] [package...]


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*  |  grou‐plist | 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]


常用:
顯示倉庫列表:
  repolist [all|enabled|disabled]

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

安裝程序包:
   install package [package2] [...]

   reinstall package1 [package2] [..] (重新安裝)

升級程序包:
  update package1 [package2] [...]

  downgrade package1 [package2] [...] (降級)

檢測可用升級:
  check-update

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

查看程序包information
  info [..]

查看指定的特性(可以是某文件)是由哪個程序包提供:
  provides | whatprovides features [features] [..]

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

構建緩存:
  makecache

搜索:
  search string1 [string2] [..]

  以指定的關鍵字搜索程序包名及summary信息;

查看指定包所依賴的capabilities:
   deplist package1 [package2] [...]

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

安裝及升級本地程序包:
   * localinstall rpmfile1 [rpmfile2] [...](maintained for legacy reasons only - use install)
   * localupdate rpmfile1 [rpmfile2] [...](maintained for legacy reasons only - use update)

包組管理的相關命令:
  groupinstall group1 [group2] [..]
  groupupdate group1 [group2] [..]
  grouplist [hidden] [groupwildcard] [..]
  groupremove group1 [group2] [..]
  groupinfo group1 [..]

原創文章,作者:15152188070,如若轉載,請注明出處:http://www.www58058.com/38248

(0)
1515218807015152188070
上一篇 2016-08-21 20:46
下一篇 2016-08-21 20:46

相關推薦

  • 高可用keepalived+haproxy實現動靜分離

    高可用keepalived+haproxy: 實驗環境: clientIP為:172.18.254.149 VIRROUTEIP為:172.18.61.5 keepalived+haproxy機器1IP為172.18.61.1 keepalived+haproxy機器2IP為172.18.61.2 server1IP為172.18.61.3 server2I…

    2017-05-17
  • 第一周初入Linux世界 —馬哥教育網絡班N22_第一周課程練習

    一、描述計算機的組成及其功能        計算機體系結構以圖靈機理論為基礎,屬于馮·諾依曼體系結構。    計算機由運算器、控制器、寄存器、輸入輸出設備組成            運算器:是計算機中執行各種算術和邏輯運算操作的部件。運算器…

    Linux干貨 2016-08-15
  • 磁盤管理進階

    1、/etc/fstab文件     設備名 掛載點 文件系統 掛載選項 轉儲頻率 自檢次序     UUID=e79e4c9d-8d0f-4675-8945-9ec23ea77c67 /             &nb…

    Linux干貨 2016-09-02
  • 三劍客-sed小結

     sed是一款流編輯器工具,通常我們用來對文本進行過濾與替換操作,特別是當你想要對幾十個配置文件做統一更改時,你會感受到sed的魅力。它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到…

    系統運維 2016-07-26
  • 正則表達式

    grep:Global search REgular expression and Print out the line         文本搜索工具,根據用戶指定的”模式“對目標文本逐行進行匹配檢查;打印匹配到的行        模式:由正則表達式字符及文本字符所編寫的過濾條件…

    Linux干貨 2016-08-08
  • LVS的詳細應用

    LVS是Linux Virtual Server的簡寫, 意思是Linux虛擬服務器, 是一個虛擬的服務器集群系統. LVS的宗旨:    1. 使用集群技術和Linux操作系統實現一個高性能, 高可用的服務器;    2. 很好的可伸縮性(Scalability);    3. 很好的可靠性(Re…

    Linux干貨 2016-12-05
欧美性久久久久