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包。這個目錄文件共享的方式輸出到外部主機,讓主機能夠訪問。可以有linux主機,可以支持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
下一篇 2016-08-21

相關推薦

  • LVS類型及工作原理

    lvs工作原理 lvs(Linux Virtual Server),工作于layer4,其原理是根據請求報文的目標IP和PORT將其轉發至后端主機集群中的某一提供服務的主機,具體轉發到哪一臺后端主機需要由挑選算法來決定。通俗來說,lvs的功能是通過在內核空間的netfilter上的INPUT鏈上的ipvs實現的,當報文由物理網絡接口進入主機后,ipvs將流經…

    Linux干貨 2016-12-05
  • Linux基礎知識——文件查找

    Linux系統的核心思想之一就是一切皆文件,可想而知你要靠記憶去查找一個文件該是多么費勁;今天我們介紹幾個文件查找命令:whereis,locate,find whereis locate the binary, source, and manual page files for…

    Linux干貨 2016-10-11
  • DNS原理詳解

    1、DNS概述   domain name service  區域名稱服務或者domain named system 區域名稱系統,是互聯網最基礎的服務,分為正向域名解析(將域名解析為IP地址)和反向域名解析(將IP地址解析為域名)兩部分。 2、bind   bind(Berkeley Internet Name Domain)…

    Linux干貨 2016-08-26
  • Linux 基礎知識(六.三)

    按找下列要求,寫一個腳本 (1)創建目錄/tmp/testdir-當前日期時間 (2)在此目錄創建100個空文件:file1-file100 (3)顯示/etc/passwd文件中位于偶數行的用戶的用戶名 (4)創建10個用戶:user10-user19,密碼同用戶名 (5)在/tmp創建10個空文件file10-file19 腳本如下: #!/bin/ba…

    Linux干貨 2016-11-14
  • 管中窺豹—linux命令

    命令行選項風格: 1、原始unix風格     a、命令行選項以連字符'-'開頭,后跟單個字符表示選項,選項后面跟著取值,如:mysql -hlocalhost      b、選項不帶取值的,可以組合在一起,如:sed -n -r 可以寫成 sed -nr  …

    Linux干貨 2016-10-30
  • 馬哥教育網絡班22期+第3周課程練習 忍者亂太郎喻成

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。  who|awk '{print $1}'|uniq 2、取出最后登錄到當前系統的用戶的相關信息。 題目不是很清晰我估計是題目想要的是 last -1   cat /etc/pa…

    Linux干貨 2016-09-06
欧美性久久久久