RPM包管理

一、程序包管理概述

    1.程序包語言

       (1)系統級開發:一般直接調用硬件

  C/C++:httpd, vsftpd, nginx

  go語言

       (2)應用級開發:java/Python/perl/ruby/php:

java: hadoop,  hbase, (基於jvm虛擬機)

Python:openstack, (基於pvm虛擬機)

perl: (perl解釋器)

ruby: (ruby解釋器)

php: (php解釋器)

    2.程序語言格式

       (1)C/C++程序格式:

  源代碼:文本格式的程序代碼;

編譯開發環境:編譯器、頭文件、開發庫

 二進制格式:文本格式的程序代碼 --> 編譯器 --> 二進制格式(二進制程序、庫文件、配置文件、幫助文件)

       (2)java/python程序格式:

 源代碼:編譯成能夠在其虛擬機(jvm/pvm)運行的格式;

開發環境:編譯器、開發庫

 二進制

    3.項目構建工具:

c/c++: make

java: maven

    4.程序包管理器:要完成安裝、升級、卸載、查詢、校驗(校驗爲Linux所有)功能

       (1)功能

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

       (2)組成方式

              1)程序包的組成清單(每個程序包都單獨實現):文件清單 安裝或卸載時運行的腳本

              2)數據庫(公共):/var/lib/rpm/

                   程序包的名稱和版本依賴關係 功能說明安裝生成的各文件的文件路徑及校驗碼信息...

       (3)不同系列Linux所用程序包管理器:

debian:dpt, dpkg, ".deb"

redhat:redhat package manager, rpm, ".rpm"; rpm is package manager;

S.u.S.E:rpm, ".rpm",

Gentoo:ports

ArchLinux:

    5.包的命名格式

         (1)源代碼:name-VERSION.tar.*z

VERSION:major.minor.release 主版本號.次版本號.發行號

         (2)RPM包:name-VERSION-release.arch.rpm

 VERSION:major.minor.release

 release.arch:rpm包的發行號arch 平臺號

    6.RHEL製作RPM包時會拆包:主包和支包,方便安裝所需要組件而非全部

主包:name-VERSION-release.arch.rpm

支包:name-function-VERSION-release.arch.rpm

     function(功能):devel, utils, libs, ...

    7.程序包管理器前端工具:自動解決依賴關係;

    yum:rhel系列系統上rpm包管理器的前端工具;

    apt-get (apt-cache):deb包管理器的前端工具;

    zypper:suse的rpm管理器前端工具;

   dnf:Fedora 22+系統上rpm包管理器的前端工具,yum的升級版

    8.獲取程序包的途徑:

(1)系統發行版的光盤或官方的文件服務器(或鏡像站點):

http://mirrors.aliyun.comhttp://mirrors.sohu.comhttp://mirrors.163.com

(2)各個項目自己的官方站點

(3)第三方組織:

      1) EPEL等可靠地開源社區組織

      2) 搜索引擎http://pkgs.org http://rpmfind.net http://rpm.pbone.net

(4)自動編譯二進制代碼、製作

 

 

 

 

二、RPM方式管理(CentOS 7.1爲例講解)

rpm命令:rpm  [OPTIONS]  [PACKAGE_FILE]

安裝:-i, --install

升級:-U, --update, -F, --freshen

卸載:-e, --erase

查詢:-q, --query

校驗:-V, --verify

數據庫維護:--builddb, --initdb

   前提:掛載官方鏡像CentOS-7-x86_64-Everything-1503-01.isoRPM包位置Packages目錄

wKiom1Z6O7Sj7XW1AAOoRO6eNDU517.jpg

     Last login: Mon Dec 21 06:57:01 2015 from 172.16.250.39

      [root@localhost ~]# mkdir /media/cdrom       #創建掛載點目錄

mkdir: 無法創建目錄"/media/cdrom": 文件已存在

      [root@localhost ~]# mount /dev/cdrom  /media/cdrom    #掛載光盤

mount: /dev/sr0 寫保護,將以只讀方式掛載

     [root@localhost ~]#    

 

    1.安裝:

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

  rpm  -ivh  PACKAGE_FILE ...

    GENERAL OPTIONS(通用選項)

 -v:verbose,詳細信息

-vv:更詳細的輸出

     [install-options]:

 -h:hash marks輸出進度條;每個#表示2%的進度;

--test:測試安裝,檢查並報告依賴關係及衝突消息等;

--nodeps:忽略依賴關係;不建議;

--replacepkgs:重新安裝

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

--nodigest:不檢查包完整性信息;

     注意:rpm可以自帶腳本;

四類:--noscripts

preinstall:安裝過程開始之前運行的腳本,%pre , --nopre

postinstall:安裝過程完成之後運行的腳本,%post , --nopost

preuninstall:卸載過程真正開始執行之前運行的腳本,%preun, --nopreun

postuninstall:卸載過程完成之後運行的腳本,%postun , --nopostun

       (2)實例演示

                1)[root@localhost Packages]#rpm  -ivh  zsh-5.0.2-7.el7.x86_64.rpm   #安裝zsh程序,顯示過程

wKiom1Z6O7uRAejeAAEsIPdmFDQ622.jpg

                2)[root@localhost Packages]# rpm -ivh --test zsh-5.0.2-7.el7.x86_64.rpm

[root@localhost Packages]# rpm -ql  zsh

測試安裝zsh,並不會真正的安裝。查看zsh程序安裝所生成的所有文件列表顯示無程序

wKiom1Z6O8jA1lJtAAEdRWtp5X8357.jpg

                3)[root@localhost Packages]# rpm -ivh --nosignature zsh-5.0.2-7.el7.x86_64.rpm

安裝時不檢驗簽名信息,此處則不再顯示警告信息,NOKEY

wKioL1Z6O-XjrRtSAADlBPb6_wA807.jpg

                5)[root@localhost Packages]# rpm -ivh --nodigest zsh-5.0.2-7.el7.x86_64.rpm

安裝時不檢查安裝包的完整性,直接強制安裝

一般除非在十分確定自己做什麼和相信此程序視乎纔會使用

                6)[root@localhost Packages]# rpm -ivh --test  php-mysqlnd-5.4.16-23.el7_0.3.x86_64.rpm

         [root@localhost Packages]# rpm -ivh --nodeps  php-mysqlnd-5.4.16-23.el7_0.3.x86_64.rpm

  #測試安裝 php-mysqlnd,需要安裝php-pdo(x86-64),直接安裝會報錯,安裝不了

  #--nodeps 參數會忽略安裝包之間的依賴關係,但時安裝後很大可能不能正常使用,癡肥依賴關係實際上用不到,如.doc的幫助文檔等

wKioL1Z6PXHR22KAAAJeAdHHO9E850.jpg

  

    2.升級:

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

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

     -U:升級或安裝  -Uvh;    rpm  -Uvh PACKAGE_FILE ...

      -F:純粹升級,必須存在老版本,不支持安裝操作 -Fvh     rpm  -Fvh PACKAGE_FILE ...

--oldpackage:降級;

--force:強制升級;

         注意:

                1) 不要對內核做升級操作;Linux支持多內核版本並存,直接安裝新版本內核;

     2) 如果某原程序包的配置文件安裝後曾被修改過,升級時,新版本的程序提供的同一個配置文件 不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)後提供;

        (2)實例演示

                1)[root@localhost Packages]# rpm -e zsh   

          [root@localhost Packages]# rpm -F zsh-5.0.2-7.el7.x86_64.rpm

          [root@localhost Packages]# rpm -U  zsh-5.0.2-7.el7.x86_64.rpm

  #卸載zsh程序包

  # -F參數升級安裝zsh程序細胞,查詢結果顯示無法安裝

 # -C 參數則在當不存在原有安裝包的時候能夠安裝該程序

wKioL1Z6PXrRfGPAAAIoC_ZLcG4454.jpg

                2)zsh-4.3.10版本升級到zsh-5.0.2版本

wKioL1Z6PYuAhvTRAAJ-WS58YfA937.jpg

       [root@localhost /]# rpm -q zsh          #查看當前系統上的zsh程序

           未安裝軟件包 zsh         #顯示當前系統上未安裝zsh相關程序

       [root@localhost /]# rpm -ivh zsh-4.3.10-9.el6.x86_64.rpm           #安裝4.3.10版本

           警告:zsh-4.3.10-9.el6.x86_64.rpm: 頭V3 RSA/SHA1 Signature, 密鑰 ID c105b9de: NOKEY

          準備中...                          ################################# [100%]

          正在升級/安裝...

                 1:zsh-4.3.10-9.el6                 ################################# [100%]

       [root@localhost /]# rpm -q zsh              #顯示當前zsh版本信息

           zsh-4.3.10-9.el6.x86_64

       [root@localhost /]# cd /media/cdrom/Packages/               #移動到光盤鏡像5.0版本位置

       [root@localhost Packages]# rpm -F zsh-5.0.2-7.el7.x86_64.rpm           #升級安裝更高版本

          警告:zsh-5.0.2-7.el7.x86_64.rpm: 頭V3 RSA/SHA256 Signature, 密鑰 ID f4a80eb5: NOKEY

       [root@localhost Packages]# rpm -q zsh          #顯示當前zsh版本信息

             zsh-5.0.2-7.el7.x86_64

   

    3.卸載:

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

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

    --nodeps:忽略依賴關係

    --test:測試卸載,dry run模式

       (2)實例演示

                1)[root@localhost Packages]#rpm  -e   --test   zsh    #測試卸載zsh

        [root@localhost Packages]#rpm -ql  zsh    #查看zsh程序安裝所生成的所有文件列表

結論:--test不會真的卸載程序

wKiom1Z6PYGx-_fAAADax9vyAxo318.jpg

                2)[root@localhost Packages] rpm  -e  zsh

 #卸載程序

wKiom1Z6PYSADyLwAAB3H36W2uM287.jpg

 

    4.查詢:

       (1)rpm {-q|--query} [select-options] [query-options]

   [select-options]

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

-a, --all:查詢所有已經安裝過的包;

-f  FILE:查詢指定的文件由哪個程序包安裝生成;

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

--whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個程序包提供;

--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴;

   [query-options]

--changelog:查詢rpm包的changlog;

-l, --list:程序安裝生成的所有文件列表;

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

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

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

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

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

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

       用法總結

   -qi  PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE

   -qpi  PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE, ...d

       (2)實例演示

                1)[root@localhost Packages]# rpm -ql  php-mysqlnd

#查詢程序安裝所以生成的所有文件列表

wKioL1Z6PenzGuSHAAEp55JfFXI611.jpg

                2)[root@localhost Packages]# rpm -qi zsh  

 #顯示程序的相關信息

wKiom1Z6PdnD7k-TAAOjfdBEbmg086.jpg

    顯示內容註解:

[root@localhost Packages]# rpm -qi zsh   

Name        : zsh           #安裝包名稱

Version     : 5.0.2        #版本號

Release     : 7.el7        #發行號

Architecture: x86_64       #所編譯的安裝平臺64位架構平臺

Install Date: 2015年12月22日 星期二 09時30分50秒       #安裝日期

Group       : System Environment/Shells        #屬在組:系統環境的shell中的一種

Size        : 5834441        #程序大小

License     : MIT             #許可證:麻省理工大學

Signature   : RSA/SHA256, 2014年07月04日 星期五 13時54分12秒, Key ID 24c6a8a7f4a80eb5   #簽名

Source RPM  : zsh-5.0.2-7.el7.src.rpm         #安裝源碼RPM

Build Date  : 2014年06月10日 星期二 10時47分02秒        #RPM包創建時間

Build Host  : worker1.bsys.centos.org       #創建的主人

Relocations : (not relocatable)       #重新安置

Packager    : CentOS BuildSystem <http://bugs.centos.org>        #製作人

Vendor      : CentOS        #賣主

URL         : http://zsh.sourceforge.net/        # 文件所在URL

Summary     : Powerful interactive shell       # 簡介:強大的交互式shell

Description :       #詳細描述

The zsh shell is a command interpreter usable as an interactive login

shell and as a shell script command processor.  Zsh resembles the ksh

shell (the Korn shell), but includes many enhancements.  Zsh supports

command line editing, built-in spelling correction, programmable

command completion, shell functions (with autoloading), a history

mechanism, and more.

     3)[root@localhost Packages]# rpm -qd zsh     #查看包所提供文檔位置

wKioL1Z6Pe7jiPzdAASCiyTtUzU776.jpg

                4)[root@localhost Packages]# rpm -qc  zsh     #顯示zsh相關的配置文件的位置

wKioL1Z6PfOzeuBVAACOYADTTQg122.jpg

                5)[root@localhost Packages]# rpm -q --changelog  zsh    #查詢zsh的改變日誌

從近到遠顯示出該程序每次改版更新的相關信息

wKiom1Z6PeXSYOUdAAMRaA-Go9c686.jpg

                6)[root@localhost Packages]# rpm -q --provides  zsh    #顯示程序包所提供的功能

wKioL1Z6PfnTydONAACNsPM7s-M648.jpg

                7)[root@localhost Packages]# rpm -qR  zsh      #顯示安裝包所要依賴的庫及其他相關

wKiom1Z6PeiBo11vAANNOmLxlRA801.jpg

                8)[root@localhost Packages]# rpm -q  --scripts  zsh      #顯示程序包自帶的運行腳本片段

  此處有四類腳本中的三類:

#postinstall scriptlet (using /bin/sh):安裝完成會後執行腳本

#preuninstall scriptlet (using /bin/sh):卸載開始之前執行腳本

#postuninstall scriptlet (using /bin/sh):卸載完成之後執行腳本

wKioL1Z6Pf3z9ctDAAOZbdUEA-c258.jpg

                9)[root@localhost Packages]# rpm -q --whatprovides   zsh

#顯示zsh功能是被哪個程序包所提供

wKioL1Z6PgKA1ADmAABtAaDEpk0456.jpg

                10)[root@localhost Packages]# rpm -q --whatrequires   zsh  

 #查詢功能被哪個所依賴,此處zsh未被系統上安裝的包做依賴

wKioL1Z6PgKDM2XzAABqc3p0ZjE961.jpg

      

 

    5.校驗:

       (1)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          #MD5校驗碼是否改變

   D Device major/minor number mismatch         #設備的主次版本號是否錯配

   L readLink(2) path mismatch       # readlink路徑是否錯配

               U User ownership differs              #用戶本身關係

   G Group ownership differs          # 用戶組本身關係

   T mTime differs                             # 修改時間modify time

    P caPabilities differ

       (2)實例演示

               測試安裝的程序的校驗信息

       [root@localhost Packages]# rpm  -ivh  --nodeps php-5.4.16-23.el7_0.3.x86_64.rpm

       [root@localhost Packages]# rpm  -V php

忽略依賴關係安裝php程序,此處爲了測試使用

#測試程序的校驗信息

wKiom1Z6PfLwTjnlAAL6s_ftmN4057.jpg

       

 

    6.包來源合法性驗正和完整性驗證

       (1) 檢驗方式

    數字簽名:用私鑰加密對應程序的特徵碼

       (2) 獲取並導入信任的包製作者的密鑰:

   1)對於CentOS發行版來說:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

wKiom1Z6PfKyDnEAAADU2kOBWzc817.jpg

   2)對於官方光盤內祕鑰導入:[root@localhost cdrom]# rpm --import RPM-GPG-KEY-CentOS-7

           此處的RPM-GPG-KEY-CentOS-7爲光盤內適配當前系統的光盤所自帶的驗證祕鑰,不同系統不同

當祕鑰導入到系統之後,再次安裝後會自動執行驗證,此時不會警告NOKEY

wKiom1Z6PfTTVDZIAAO0DqiXUYE256.jpg

        (3)驗證

   1) 安裝此組織簽名的程序時,會自動執行驗證

    2) 手動驗正:rpm   -K    PACKAGE_FILE  

在導入祕鑰的CentOS7.1上驗證 

wKioL1Z6Pgei6OFDAACR2geLb3M024.jpg

在未導入祕鑰的CentOS 6.7 系統上驗證

wKiom1Z6PfWy_0SOAADQZ3-2FSM657.jpg

 

 

  7.數據庫重建:

       (1)rpm管理器數據庫路徑:/var/lib/rpm/

      查詢操作:通過此處的數據庫進行;

       (2)獲取幫助:CentOS命令查詢位置不同

      CentOS 6:man rpm

      CentOS 7:man rpmdb

       (3)rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]

  --initdb:初始化數據庫,當前無任何數據庫可實始化創建一個新的;當前有時不執行任何操作;

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

[--dbpath DIRECTORY]  :指明建立位置

       (4)實例演示

                1)在指定目錄下/rpmdb下初始化一個rpm的數據庫

  注意:此時的庫是沒用的,所以大小和原來的庫不同

wKioL1Z6PgqSgpfkAANh-NnzAJo323.jpg

                2)查看/var/lib/rpm

wKioL1Z6PgzRT7BWAANlu-gZ_h8028.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章