系統管理之程序包管理(一) rpm詳解

系統管理之程序包管理(1):

    程序包管理是運維人員的基本工作素質之一。在操作系統上,不斷的安裝,卸載,配置應用程序包,讓不同程序包運行提供不同的服務;利用某種工具完成某些操作的過程。這就要求運維工作人員熟悉安裝,管理應用程序包。 在linux上,程序包主要有兩種:tar,rpm包。


一、程序包概述:


  • 系統接口

      API:Application Program Interface  應用編程接口

      ABI:APPlication Binary Interface 應用二進制接口

      不同操作系統,API兼容,ABI不一定相同(windows與linux不兼容)

        Unix-like:(程序后綴名的區別)

          ELF

        windows:

          exe;msl


  • 跨平臺程序

     平臺不同,二進制程序的類型不同,借助庫級別的虛擬化;運行跨系統的二進制程序

       linux:WinE

       windows:cywin


  • 開發語言分類

     系統級開發語言:C/C++  go : httpd,vsftpd,nginx

     應用級開發語言:JAVA/python/perl/ruby/PHP/go: 

          java:hadoop ,hbase,(jvm虛擬機) j虛擬機 c/c++研發

          python:openstack   (pvm虛擬機)

          perl:   (rvm解釋器)

     復雜應用程序糅合不同級別開發語言,系統級語言寫程序核心,應用級輔助類的工具程序


  • 語言程序格式

    C/C++程序格式:

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

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

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

    java/python程序格式:

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

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

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


  • 項目構建工具:

       借助配置文檔,自動決定程序包的編譯順序,依賴關系

      依賴于開發環境

             c/c++:make 

             java:maven

          


二、程序包管理器概論:


 

  • 程序包的構建過程:

        源代碼–>目標二進制格式–>把(二進制程序,庫文件,配置文件,幫助文件)組織成為一個或幾個包文件;

  

  • 程序包管理器類型:

        deblan: dpt(命令dpkg) 程序包以“.deb”為后綴

        redhat: redhat package manager:rpm(命令rpm) 程序包以“.rpm””為后綴

        Su.S.E: rpm包,(命令rpm) 與redhat的rpm包的路徑格式不兼容

        Gentoo:ports

        ArchLinux: 輕量級Linux 


  • 程序包命名格式

    源代碼:

            name-VERSION.tar.gz

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

             例:mysql-5.0.2.tar.gz

    rpm包:

           name-VERSION-release.arch.rpm

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

           release.arch:rpm包的發行號.操作系統的平臺架構類型

           release.os: 操作系統類型 (rhat,centos,el7)

          arch:i386,X64,ppc,noarch(適用全部平臺,java編寫)

             例:redis-3.0.2-1.centos7.x64.rpm

    拆包:拆除多余功能的包,按需安裝程序包內的包,分主包和子包

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

                 php-5.4.16-36.el7_1.x86_64.rpm

          子包:name-function-CERSION-release.arch.rpm

              php-bcmath-5.4.16-36.el7_1.x86_64.rpm

  • 程序包依賴關系

       包之間:可能存在依賴關系,甚至循環依賴

         x,y,z

          x–>y,z

             y–>a,b,c

               c–>D    

     安裝某個主包,必須安裝主包依賴的副包

     解決依賴關系,使用rpm前端工具

  • 庫文件:    

       ldd命令    查看軟件包的庫依賴性

      查看二進制程序所依賴的庫文件:

         ldd /PATH/TO/BINARY_FILE

      管理及查看本機裝載的庫文件:

         ldconfig 

         /sbin/ldconfig -p: 顯示本機已經緩存的所有可用庫文件名及文件路徑映射關系

      配置文件: /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf

      緩存文件: /etc/ld.so.cache

  • 程序包前端工具

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

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

     zypper:suse的rpm管理器前段工具

     dnf: Fedora 22+系統上rpm包管理器的前端工具

  • 程序包管理器介紹

    功能:將編譯好的應用程序的各組成文件打包成一個或幾個程序包文件,從而更方便的實現 安裝,卸載,查詢,校驗功能

      1.程序包的組成清單(每個程序包都獨立實現)

        文件清單

         程序包的元數據(名稱,版本,依賴性,描述)

        安裝或卸載時運行的腳本

     2.數據庫(公共)

       存儲程序包的名稱和版本

       依賴關系

       功能說明

       包安裝生成后的各文件的文件路徑及校驗碼信息;

      注意:/var/lib/rpm/  centos程序庫的存放位置


  • 獲取程序包的途徑

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

          http://mirrors.aliyun.com/

          http://mirrors.sohu.com

          http://mirrors.163.com

     (2)項目的官方站點

           http://www.zabbix.com

     (3)第三方組織 社區組織維護

          Fedora-EPEL:

           Rpmforge:RHEL推薦,包很全

     (4)搜索引擎:不安全

           http://pkgs.org

            http://rpmfind.net/

           http://rpm.pbone.net/

            http://sourceforge.net/

     (5)自已動手,豐衣足食  

      

       建議:對網上下載的程序包進行md5校驗,檢查其完整性,合法性

      來源合法性:

      程序包的完整性;


三、centos7系統上rpm命令管理程序包:


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

   


rpm命令

    rpm [OPTIONS] [PACKAGE_FILE]

     安裝:-i,–install

    升級:-U,–update,–freshen

    卸載:-e,–erase

    查詢:-q

    校驗:-V

    數據庫維護:–builddb,–initdb

    

  • 安裝:

    rpm {-i|–install} [install-options] PACKAGE_FILE…

    rpm -ivh PACKAGE_FILE..

      GENERAL OPTIONS:

          -v:詳細信息

          -VV:更詳細的輸出

      [install-options]:

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

          –test:測試安裝,檢查并報告依賴關系及沖突消息,并不真正安裝程序

          –nodeps:忽略依賴關系,強制安裝 ,但程序不一定能使用 不建議

          –replacepkgs重新安裝

           —replacefiles  重新安裝,忽略重復文件

           –nosignature:不檢查報名簽名信息,不檢查來源合法性

          –nodigest:不檢查包的完整性信息 (校驗 MD5) 

          –justdb:更新數據庫,但不重新安裝

           –noscripts 不執行全部程序包腳本

             注意:rpm可以自帶腳本

                  腳本分四類:(特定的腳本的參數,可以單獨選擇)

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

                  postinstall:安裝過程完成之后運行的腳本 $post –nopost

                  preuninstall:卸載過程真正開始前運行的腳本 $preun –nopreun

                  postuninstall:卸載過程中運行的腳本 $postun –nopreun

    

    

  • 升級:原文件丟失

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

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

       [PTIONS]

        -U:有舊版本升級或原程序不存在執行安裝

        -F:只執行升級

         rpm -Uvh PACKAGE_FILE..

          rpm -Fvh PACKAGE_FILE.

     [install-options]:

        –oldpackage:降級安裝舊版本 

        –force:強制;新版本的程序包不滿足老版本的依賴關系 ,強制安裝或強制升級,忽略依賴關系,也可配合rpm -ivh選項

     注意:

        (1)不要對內核kernel做升級操作 linux支持多內核并存,因此,直接安裝新版本內核即可

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

  • 卸載:

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

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

        –nodeps:強制忽略依賴關系

        –test:測試卸載:dry run模式

  • 查詢:

    rpm {-q|–query} [select-options] [query-options] PACKAGE_NAME …

      

     select-options:

        PACKAGE_NAME :查詢指定程序包是否安裝及安裝信息

         -a:所有已安裝的程序包列表

        -f:查詢指定的文件由那個程序包安裝

        -g:查詢指定包組中包含哪些包

        -p:對未安裝的程序包執行查詢操作;

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

        –whatrequires CAPABILITY:查詢指定的CAPABILITY被那個程序包所依賴;

     query-options:

          –changelog:查詢rpm包的changlog

          -l:rpm包生成的所有文件列表

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

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

        -d:查詢指定的程序包提供的幫助文檔

        –provides:列出指定的程序包提供的所有的CAPABILITY. 在確定–whatprovides CAPABILITY 

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

        –scripts:查詢指定程序包自帶的腳本片段

        哪個包所依賴
            rpm2cpio 包文件|cpio –itv 預覽包內文件
             rpm2cpio 包文件|cpio –id “ *.conf” 釋放包內文件

  

       用法:

        -ql ,-qd,-qc,-qi,-qa PACKAGE_NAME

        -qp{i,c,d,f} PACKAGE_FILE :未安裝程序的詳細信息

  • 校驗:

     rpm {-V|–verify} [select-options] [verify-options]  程序名

      只要改變服務下的任意文件,使用-V校驗,都可看到修改信息 

        例:修改httpd的配置文件,校驗httpd服務    

            [root@wen-7 ~]# rpm -qc httpd        
            /etc/httpd/conf.d/autoindex.conf
            /etc/httpd/conf.d/userdi
            .......
            [root@wen-7 ~]# vim /etc/sysconfig/httpd[
            root@wen-7 ~]# rpm -V httpd
            S.5....T.  c /etc/httpd/conf/httpd.conf
            S.5....T.  c /etc/sysconfig/httpd		

    

        顯示信息的含義:

         S file Size differs     文件大小

         M Mode differs (includes permissions and file type) 權限    

         5 digest (formerly MD5 sum) differs MD5

         D Device major/minor number mismatc  主次設備號不配備

         L readLink(2) path mismatch  路徑不匹配

         U User ownership differs  屬主匹配

         G Group ownership differs       屬組比匹配

         T mTime differs  時間戳改變

         P caPabilities differ

 

  • 數據庫重建:

    rpm管理器數據庫路徑:/var/lib/rpm/  該目錄嚴重保護,全額備份

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

     NAME

       rpmdb – RPM Database Tool

      SYNOPSIS

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

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

        –rebuilddb:重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重新創建(不管如何,直接重建)

          例:

         [root@wen-7 ~]# mkdir /tmp/rpm
         [root@wen-7 ~]# rpm --initdb --dbpath=/tmp/rpm/
         [root@wen-7 ~]# ls /tmp/rpm/
         Basenames     __db.001  __db.003  Group       Name          Packages     Requirename  Sigmd5
         Conflictname  __db.002  Dirnames  Installtid  Obsoletename  Providename  Sha1header   Triggername
         [root@wen-7 ~]# rpm --initdb --dbpath=/tmp/rpm/
         [root@wen-7 ~]# ls /tmp/rpm/
         Basenames     __db.001  __db.003  Group       Name          Packages     Requirename  Sigmd5
         Conflictname  __db.002  Dirnames  Installtid  Obsoletename  Providename  Sha1header   Triggername
         [root@wen-7 ~]# rpm --rebuilddb --dbpath=/tmp/rpm/
         [root@wen-7 ~]# ls /tmp/rpm/
         Basenames     Dirnames  Installtid  Obsoletename  Providename  Sha1header  Triggername
        Conflictname  Group     Name        Packages      Requirename  Sigmd5

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

    來源合法性驗證:RSA

    完整性驗證:SHA256

    公鑰加密:
        對稱加密:加密、解密使用同一密鑰;
        非對稱加密:密鑰是成對兒的
        public key: 公鑰,公開所有人
        secret key: 私鑰, 不能公開

    獲取并導入信任的包制作者的公鑰:

        rpm -K|checksig rpmfile 檢查包的完整性和簽名
        rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
        CentOS 7發行版光盤提供: RPM-GPG-KEY-CentOS-7
        rpm -qa gpg-pubkey

      對于Centos發行版來說:rpm-import /etc/pki/rpm-gpg/RPM-GPG-KEY-centos-7

    驗正:

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

     (2)手動驗證:rpm- k PACEAGE-FILE

實戰:

1.某程序的某文件被破壞,為了保留原來其他文件的配置,只恢復單個文件.

[root@wen-7 ~]#rpm -q  --whatprovides zsh             查看指定功能所依賴的包(針對文件丟失情況,不知道文件名稱)
zsh-4.3.10-9.el6.x86_64
[root@wen-7 ~]# rpm -qf /usr/share/zsh       或查看某個文件所依賴的包 (針對文件未丟失,僅損壞)
systemd-219-19.el7.x86_64
pulseaudio-6.0-7.el7.x86_64
zsh-4.3.10-9.el6.x86_64
[root@wen-7 ~]# cp zsh-4.3.10-7.el6.x86_64.rpm  ~              #復制包文件
root@wen-7 ~]# rpm2cpio zsh-4.3.10-7.el6.x86_64.rpm | cpio -itv    #查看包內文件
[root@wen-7 ~]# rpm2cpio zsh-4.3.10-7.el6.x86_64.rpm | cpio -id /usr/share/zsh      # 提取包內的某個文件,至當前目錄
[root@wen-7 ~]# ll usr/share/                                       #查看提取出的文件,
總用量 0 
drwxr-xr-x 3 root root  23 8月  21 14:52 doc
drwxr-xr-x 2 root root 124 8月  21 14:52 info
drwxr-xr-x 3 root root  17 8月  21 14:52 man
drwxr-xr-x 4 root root  40 8月  21 14:52 zsh
[root@wen-7 share]# cp -r zsh /usr/share/         #復制文件至原來位置(即提取出的文件的路徑)
[root@wen-7 share]# ll /usr/share/zsh             # 查看原來位置的文件是否復制成功
總用量 0
drwxr-xr-x 4 root root 36 8月  21 14:56 4.3.10
drwxr-xr-x 2 root root  6 8月  21 14:56 site-functions

2.安裝程序包

[root@wen-7 base]# rpm -ivh zsh-html-4.3.10-7.el6.x86_64.rpm               -ivh :安裝程序,顯示詳細信息,并顯示進度條
警告:zsh-html-4.3.10-7.el6.x86_64.rpm: 頭V3 RSA/SHA1 Signature, 密鑰 ID c105b9de: NOKEY
準備中...                          ################################# [100%]
正在升級/安裝...
   1:zsh-html-4.3.10-7.el6            ################################# [100%]
[root@wen-7 base]# rpm -qi zsh-html                               #查詢程序包的相關信息
Name        : zsh-html
Version     : 4.3.10
Release     : 7.el6
Architecture: x86_64
Install Date: 2016年08月21日 星期日 15時01分03秒

[root@wen-7 base]# rpm -ivh --test zd1211-firmware-1.4-4.el6.noarch.rpm          --test : 測試安裝 測試安裝情況,不真正安裝
警告:zd1211-firmware-1.4-4.el6.noarch.rpm: 頭V3 RSA/SHA256 Signature, 密鑰 ID c105b9de: NOKEY
準備中...                          ################################# [100%]
[root@wen-7 base]# rpm -qi zd1211-firmware
未安裝軟件包 zd1211-firmware 

[root@wen-7 base]# rpm -ivh --test zd1211-firmware-1.4-4.el6.noarch.rpm 
警告:zd1211-firmware-1.4-4.el6.noarch.rpm: 頭V3 RSA/SHA256 Signature, 密鑰 ID c105b9de: NOKEY
準備中...                          ################################# [100%]
[root@wen-7 base]# rpm -qi zd1211-firmware
未安裝軟件包 zd1211-firmware 
[root@wen-7 base]# rpm -ivh --nosignature  zd1211-firmware-1.4-4.el6.noarch.rpm         --nosigbature: 不檢查包的來源合法性,無頭V3 RSA/SHA256 
準備中...                          ################################# [100%]
正在升級/安裝...
   1:zd1211-firmware-1.4-4.el6        ################################# [100%]

3.升級程序包

[root@wen-7 base]# rpm -U zlib-1.2.3-29.el6.x86_64.rpm    升級某程序包,程序包不存在則執行安裝
[root@wen-7 base]# rpm -U   --force zlib-1.2.3-29.el6.x86_64.rpm  強制升級 ,不關心依賴關系,(可能強制升級單個程序包.但不能使用)

[root@wen-7 base]# rpm -U   --oldpackage --force zlib-1.2.3-29.el6.x86_64.rpm       :強制降級某程序包,安裝舊版本 可以不強制

4.卸載程序包

[root@wen-7 base]# rpm -e zsh     命令加上程序包名 直接卸載
[root@wen-7 base]# rpm -qi zsh
未安裝軟件包 zsh 


[root@wen-7 base]# rpm -e zlib         不能直接卸載有依賴關系的程序包
錯誤:依賴檢測失敗:
	libz.so.1()(64bit) 被 (已安裝) libxml2-2.9.1-5.el7_1.2.x86_64 需要
	libz.so.1()(64bit) 被 (已安裝) info-5.1-4.el7.x86_64 需要
	libz.so.1()(64bit) 被 (已安裝) libpng-2:1.5.13-5.el7.x86_64 需要
	libz.so.1()(64bit) 被 (已安裝) librevenge-0.0.2-2.el7.x86_64 需要
[root@wen-7 base]# rpm -e --nodeps zlib  如果想卸載某個有依賴關系的程序包,需使用--nodeps 選項,強制卸載某程序包,但不建議使用,會破壞某工具的使用

[root@wen-7 base]# rpm -e --test --nodeps zlib   測試卸載 ,不真實卸載

[root@wen-7 base]# rpm -e --allmatches   zlib    卸載所有匹配指定名稱的程序包的各版本

   

回顧:

 rpm命令實現程序管理:

         安裝:-ivh –nodepsd,–replacepkgs

         卸載:-e,–nodeps

         升級:-Uvh,-Fvh –nodeps,–oldpackage

         查詢:-q,-qa,-qf,-qi,-qd,-qc,-q –scripts,-q –changlog,-q –provides,-q –requires

         校驗:-v

         導入GPG密鑰:–import,-K,–nodigest,–nosignature

         數據庫重建:–initdb ,–redilddb

 以上是對程序包管理的概論和對rpm命令的總結,依據此文檔可以Centos6.8或7.2系統做練習,熟悉rpm的系列命令。下節將介紹程序包管理之Yum工具的介紹,歡迎閱讀,參考。

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

(0)
wencxwencx
上一篇 2016-08-21
下一篇 2016-08-21

相關推薦

  • Linux文件系統初識

    Linux文件系統初識        文件系統是一種用于向用戶提供數據訪問的機制,我們的硬盤,U盤等存儲設備會被文件系統分割為特定大小的塊,系統中的文件就被存儲在數據塊中,而我們平常接觸到的分區,目錄,文件等正是文件系統通過組織整合之后才呈現在我們面前的,我們無需去關心我們的數據到底存儲在硬盤的那個…

    2017-07-15
  • 用keepalived高可用nginx

    單主模型 環境四個虛擬機 upstream server:node1:172.16.100.6 ? ? ? ? CeotOS 6 upstream server:node3:172.16.100.69 ? ? ? ? CeotOS 7 節點1:172.16.100.67 ? ? ? ? ? ? ? ? ? ? ? ?CeotOS 7 節點2:node2:17…

    2017-10-15
  • linux 簡單命令

    前面介紹一些基本基礎篇 后面主要介紹screen命令的用法。

    2017-11-19
  • DNS域名系統

    【本文導航】DNS域名系統DNS域名系統DNS解析類型DNS查詢類型DNS服務器類型資源記錄   SOA記錄   NS記錄   MX記錄   A記錄與泛域名   PTR記錄   CNAME記錄   AAAA記錄子域區域傳…

    Linux干貨 2016-12-26
  • 終于成為馬幫的成員了

    終于成為馬幫的成員了

    Linux干貨 2016-09-18
  • DNS服務器搭建示例

    DNS服務器搭建示例 負責解析magedu.com域名,能夠對一些主機名進行正向解析和逆向解析 配置主配置文件 [root@slave1 etc]# vim /etc/named.conf options { listen-on port 53 { 192.168.91.132; }; // listen-on-v6 port 53 { ::1; }; di…

    2017-09-16
欧美性久久久久