Linux基礎知識之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包管理

rpm命令:rpm  [OPTIONS]  [PACKAGE_FILE]

安裝:-i, --install

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

卸載:-e, --erase

查詢:-q, --query

校驗:-V, --verify

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

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-28.el7.x86_64.rpm   #安裝zsh程序,顯示過程

[root@localhost Packages]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm
準備中...                          ################################# [100%]
正在升級/安裝...
   1:zsh-5.0.2-28.el7                 ################################# [100%]

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)實例演示

                [root@localhost Packages]# rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm

[root@localhost Packages]# rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm
準備中...                          ################################# [100%]
	軟件包 zsh-5.0.2-28.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不會真的卸載程序

[root@localhost Packages]# rpm -e --test zsh
[root@localhost Packages]# rpm -ql zsh
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile

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

  #卸載程序

[root@localhost Packages]# rpm -e zsh
[root@localhost Packages]# rpm -ql zsh
未安裝軟件包 zsh
[root@localhost Packages]#

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  sed

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

[root@localhost Packages]# rpm -ql sed

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

 #顯示程序的相關信息

[root@localhost Packages]# rpm -qi sed
Name        : sed
Version     : 4.2.2
Release     : 5.el7
Architecture: x86_64
Install Date: 2018年12月10日 星期一 05時28分49秒
Group       : Applications/Text
Size        : 601208
License     : GPLv3+
Signature   : RSA/SHA256, 2014年07月04日 星期五 12時58分02秒, Key ID 24c6a8a7f4a80eb5
Source RPM  : sed-4.2.2-5.el7.src.rpm
Build Date  : 2014年06月10日 星期二 09時01分55秒
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://sed.sourceforge.net/
Summary     : A GNU stream text editor
Description :
The sed (Stream EDitor) editor is a stream or batch (non-interactive)

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

[root@localhost Packages]# rpm -qd sed
/usr/share/doc/sed-4.2.2/AUTHORS
/usr/share/doc/sed-4.2.2/BUGS
/usr/share/doc/sed-4.2.2/COPYING
/usr/share/doc/sed-4.2.2/COPYING.DOC
/usr/share/doc/sed-4.2.2/NEWS
/usr/share/doc/sed-4.2.2/README
/usr/share/doc/sed-4.2.2/THANKS
/usr/share/doc/sed-4.2.2/sedfaq.txt.gz
/usr/share/info/sed.info.gz
/usr/share/man/man1/sed.1.gz

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

[root@localhost Packages]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc

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

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

[root@localhost Packages]# rpm -q --changelog zsh
\* 四 2月 16 2017 Kamil Dudka <[email protected]> - 5.0.2-28
- zero new space allocated in prompt buffer (#1408619)

* 一 11月 28 2016 Kamil Dudka <[email protected]> - 5.0.2-27
- fix parsing of parameter subscript expression with NOEXEC (#1398740)

* 一 10月 17 2016 Kamil Dudka <[email protected]> - 5.0.2-26
- fix crash while parsing the here-document syntax (#1374752)

* 四 7月 14 2016 Kamil Dudka <[email protected]> - 5.0.2-25
- improve use of new command substitution in completion (#1356388)

* 五 6月 10 2016 Kamil Dudka <[email protected]> - 5.0.2-24
- fix off-by-one error in completion utility cache code (#1344599)

 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-45.el7_0.3.x86_64.rpm

       [root@localhost Packages]# rpm  -V php

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

#測試程序的校驗信息

[root@localhost Packages]# rpm -ivh --nodeps php-5.4.16-45.el7.x86_64.rpm
準備中...                          ################################# [100%]
正在升級/安裝...
   1:php-5.4.16-45.el7                ################################# [100%]
[root@localhost Packages]# rpm -V php
未滿足的依賴關係 php-5.4.16-45.el7.x86_64:
	php-common(x86-64) = 5.4.16-45.el7 被 (已安裝) php-5.4.16-45.el7.x86_64 需要
	php-cli(x86-64) = 5.4.16-45.el7 被 (已安裝) php-5.4.16-45.el7.x86_64 需要

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

       (1) 檢驗方式

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

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

[root@localhost rpm-gpg]# cd /etc/pki/rpm-gpg/
[root@localhost rpm-gpg]# rpm --import RPM-GPG-KEY-CentOS-7

       (3)驗證

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

    2) 手動驗正:rpm   -K    PACKAGE_FILE  

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

[root@localhost Packages]# rpm -K zsh-5.0.2-28.el7.x86_64.rpm
zsh-5.0.2-28.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 確定

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的數據庫

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

[root@localhost Packages]# rpm -initdb --dbpath /rpmdb/
[root@localhost Packages]# ll /rpmdb/
總用量 440
-rw-r--r--. 1 root root   8192 12月 16 16:05 Basenames
-rw-r--r--. 1 root root   8192 12月 16 16:05 Conflictname
-rw-r--r--. 1 root root 311296 12月 16 16:05 __db.001
-rw-r--r--. 1 root root  90112 12月 16 16:05 __db.002
-rw-r--r--. 1 root root 107048 12月 16 16:05 __db.003
-rw-r--r--. 1 root root   8192 12月 16 16:05 Dirnames
-rw-r--r--. 1 root root   8192 12月 16 16:05 Group
-rw-r--r--. 1 root root   8192 12月 16 16:05 Installtid
-rw-r--r--. 1 root root   8192 12月 16 16:05 Name
-rw-r--r--. 1 root root   8192 12月 16 16:05 Obsoletename
-rw-r--r--. 1 root root  12288 12月 16 16:05 Packages
-rw-r--r--. 1 root root   8192 12月 16 16:05 Providename
-rw-r--r--. 1 root root   8192 12月 16 16:05 Requirename
-rw-r--r--. 1 root root   8192 12月 16 16:05 Sha1header
-rw-r--r--. 1 root root   8192 12月 16 16:05 Sigmd5
-rw-r--r--. 1 root root   8192 12月 16 16:05 Triggername

                2)查看/var/lib/rpm

[root@localhost Packages]# cd /var/lib/rpm
[root@localhost rpm]# ll
總用量 101428
-rw-r--r--. 1 root root  5173248 12月 16 15:55 Basenames
-rw-r--r--. 1 root root    16384 12月 13 21:25 Conflictname
-rw-r--r--. 1 root root   311296 12月 16 16:02 __db.001
-rw-r--r--. 1 root root    90112 12月 16 16:02 __db.002
-rw-r--r--. 1 root root  1318912 12月 16 16:02 __db.003
-rw-r--r--. 1 root root  1376256 12月 16 15:55 Dirnames
-rw-r--r--. 1 root root    32768 12月 16 15:55 Group
-rw-r--r--. 1 root root    24576 12月 16 15:55 Installtid
-rw-r--r--. 1 root root    81920 12月 16 15:55 Name
-rw-r--r--. 1 root root    36864 12月 16 15:55 Obsoletename
-rw-r--r--. 1 root root 92139520 12月 16 15:55 Packages
-rw-r--r--. 1 root root  2527232 12月 16 15:55 Providename
-rw-r--r--. 1 root root   614400 12月 16 15:55 Requirename
-rw-r--r--. 1 root root   147456 12月 16 15:55 Sha1header
-rw-r--r--. 1 root root    86016 12月 16 15:55 Sigmd5
-rw-r--r--. 1 root root     8192 12月 13 22:33 Triggername

參考博客:http://blog.51cto.com/xuding/1727510

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