天天看點

Linux 軟體包管理之RPM

      在 GNU/Linux( 以下簡稱 Linux) 作業系統中,RPM 和 DPKG 是最為常見的兩類軟體包管理工具,他們分别應用于基于 RPM 軟體包的 Linux 發行版本和 DEB 軟體包的 Linux 發行版本中。

      Linux軟體包管理器主要用于管理Linux系統中的軟體包,其主要用于實作安裝、解除安裝、更新等功能,并提供對系統中所有軟體包狀态資訊的查詢。  

       RPM 最開始官方解釋為:“Redhat Package Manager”,由 Red Hat 公司制定實施,由于被 GNU 開源作業系統接受并成為很多Linux 系統(RHEL) 的既定軟體标準,其很多分支都使用其來作為軟體安裝的管理方式,包括 Fedora, CentOS, SUSE 等等,之後RPM被官方解釋為:“Rpm is Package Manager”,其前端工具為yum。

      與RPM并駕齊驅的是基于Debian 作業系統 (UBUNTU) 的 DEB 軟體包管理工具-DPKG,全稱為 Debian Package,功能方面與 RPM 相似。最早是由 Debian Linux 社群所開發出來的, 隻要是Debian系列衍生的 分支系統,大多使用 dpkg 這個機制來管理軟體的, 包括B2D, Ubuntu 等等,其前端工具為apt-get。

       本文主要以RHEL的RPM軟體包管理程式為主要内容,關于DPKG的使用方法,還請自行Google!

       Linux的軟體包,主要有兩種,一種是檔案名形如Name-VERSION.tar.gz以源碼的形式釋出,一種是已經編譯好的檔案名類似于Name-VERSION-release.arch.rpm的二進制程式包。

      下面主要介紹下rpm軟體管理工具的常用參數和使用方法。

rpm指令:rpm  [OPTIONS]  [PACKAGE_FILE]
       安裝:-i, --install
       更新:-U, --update, 
       更新到新版本:-F, --freshen  [僅當系統中确實存在老版本時,才會更新軟體包,否則什麼也不做]
       解除安裝:-e, --erase  [注意:參數-e 後跟的是軟體包名未必就是軟體包的全稱。]
       查詢:-q, --query
       校驗:-V, --verify  [校驗軟體包,是指将已安裝的檔案資訊與儲存在 rpm 資料庫中的中繼資料(來自于rpm包)進行比較。校驗将會比較每個檔案的大小、摘要資訊(哈希值)、權限、類型、屬主與屬組。任何不一緻的地方都将被顯示出來。]
       
常用其他參數:
        --builddb:資料庫維護;
        --initdb:RPM資料庫的建立;
        --nodeps:忽略依賴關系,不建議這樣安裝!
        --replacepkgs:強制重新安裝;
        --test:測試安裝,檢查并報告依賴關系及沖突消息等;
        --nosignature:不檢查包簽名資訊,不檢查來源合法性;      

(1)RPM軟體包的安裝

      以安裝mysql57-community-release-el6-7.noarch.rpm為例:

[root@xlogin ~]# rpm -ivh mysql57-community-release-el6-7.noarch.rpm      

      其中參數-i是表示安裝,參數-v表示安裝時要顯示安裝資訊,-h表示安裝時顯示安裝的進度,通常這三個參數是一起組合起來使用的。

 在安裝RPM包時可能會遇到以下問題:

      ①重複安裝問題:當要安裝的軟體包的某些檔案已經在安裝其他軟體包時安裝過了時,可以通過 --replacefiles參數來替換屬于其他軟體包的檔案;

      如果安裝RPM軟體包發生沖突時,可以通過 --replacepkgs參數強制重新安裝。

Linux 軟體包管理之RPM

     ②軟體沖突問題:因軟體之間不相容而産生沖突導緻無法安裝.可以通過 ----replacefiles參數或 --force參數強制安裝,但不保證安裝成功。

     ③軟體關聯問題:有時一個軟體包的安裝會依賴其他軟體包,隻有在所依賴的軟體包安裝完成後該軟體包才能繼續安裝,如果不這樣的話我們可以通過 --nodeps參數強制安裝,但同樣不能保證安裝成功。而且建議不到萬不得已,最好不要這麼做。

Linux 軟體包管理之RPM

(2)RPM軟體包的更新

rpm -Uvh /PATH/TO/NEW_PACKAGE_FILE:如果裝有老版本的,則更新;否則,安裝;
rpm -Fvh /PATH/TO/NEW_PACKAGE_FILE:如果裝有老版本的,則更新;否則,退出;
rpm -Uvh --oldpackage 強制恢複低版本的包:降級      

    例如,要把目前系統中的postfix-2.6.6-6.el6_5.x86_64更新為postfix-2.10.1-6.0.1.el7.centos.x86_64.rpm,則可執行如下指令:

[root@xlogin ~]# rpm -qa |grep postfix
postfix-2.6.6-6.el6_5.x86_64
[root@xlogin ~]# rpm -Uvh postfix-2.10.1-6.0.1.el7.centos.x86_64.rpm
[root@xlogin ~]# rpm -Fvh postfix-2.10.1-6.0.1.el7.centos.x86_64.rpm      

    進行軟體更新後,舊版本檔案會以“舊版本檔案名.rpmsave”名稱儲存。

      如果以後需要恢複原來的舊版本檔案,可以通過 --oldpackage參數來強制恢複。

(3)RPM軟體包的查詢

      ①查詢目前系統中安裝的全部RPM軟體包: # rpm -qa |more  (為便于浏覽具體内容,建議結合管道操作符)

      ②查詢某個RPM軟體包是否安裝: 

[root@xlogin ~]# rpm -q httpd   #查詢Apache軟體是否安裝,注意-q 後跟的是軟體包名未必就是軟體包的全稱
httpd-2.2.15-45.el6.centos.x86_64
[root@xlogin ~]#  rpm -qa |grep httpd  #在已安裝的軟體包中查詢包含httpd關鍵字的軟體包
httpd-tools-2.2.15-45.el6.centos.x86_64
httpd-2.2.15-45.el6.centos.x86_64      

       ③查詢軟體包的說明資訊: 

       -i, --info:查詢程式包軟體相關的資訊,版本号、大小、所屬的包組,等資訊;

        以檢視mysql57-community-release軟體包的描述資訊為例:

[root@xlogin ~]# rpm -qi mysql57-community-release
Name        : mysql57-community-release    Relocations: (not relocatable)
Version     : el6                               Vendor: MySQL
Release     : 7                             Build Date: Fri 16 Oct 2015 08:26:18 PM CST
Install Date: Wed 23 Dec 2015 08:20:01 PM CST      Build Host: tyr77
Group       : System Environment/Base       Source RPM: mysql57-community-release-el6-7.src.rpm
Size        : 8038                             License: GPLv2
Signature   : DSA/SHA1, Fri 16 Oct 2015 09:25:29 PM CST, Key ID 8c718d3b5072e1f5
Packager    : MySQL Release Engineering <[email protected]>
URL         : http://dev.mysql.com
Summary     : MySQL repository configuration for yum
Description :
Package for installation of setup/configuration files required for
installation of MySQL packages by yum.      

      ④查詢軟體包内所有包含的檔案名稱清單: 

         -l, --list:程式安裝生成的所有檔案清單;

         以查詢htop軟體包含有哪些檔案,以及這些檔案都安裝在什麼位置為例:

[root@xlogin ~]# rpm -ivh htop-1.0.1-2.el6.x86_64.rpm 
warning: htop-1.0.1-2.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing...                ########################################### [100%]
   1:htop                   ########################################### [100%]
[root@xlogin ~]# rpm -ql htop
/usr/bin/htop
/usr/share/applications/fedora-htop.desktop
/usr/share/doc/htop-1.0.1
/usr/share/doc/htop-1.0.1/AUTHORS
/usr/share/doc/htop-1.0.1/COPYING
/usr/share/doc/htop-1.0.1/ChangeLog
/usr/share/doc/htop-1.0.1/README
/usr/share/man/man1/htop.1.gz
/usr/share/pixmaps/htop.png      

      ⑤查詢某個檔案屬于哪個RPM包: 

        以查詢/etc/fstab目錄是屬于哪個RPM軟體包安裝的為例:

[root@xlogin ~]# rpm -qf /etc/fstab 
setup-2.8.14-20.el6_4.1.noarch      

      ⑥其他的查詢情況

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

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

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

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

[root@xlogin ~]# rpm -q --provides bash       #列出bash程式包的依賴關系
config(bash) = 4.1.2-33.el6
bash = 4.1.2-33.el6
bash(x86-64) = 4.1.2-33.el6
[root@xlogin ~]# rpm -q --whatprovides bash   #查詢bash是由哪個包所提供的
bash-4.1.2-33.el6.x86_64
[root@xlogin ~]# rpm -q --whatprovides 'config(bash)' 
bash-4.1.2-33.el6.x86_64
[root@xlogin ~]# rpm -q --whatrequires bash   #查詢bash被哪個包所依賴
initscripts-9.03.49-1.el6.centos.x86_64
dracut-004-388.el6.noarch
rsyslog-5.8.10-10.el6_6.x86_64
cronie-1.4.4-15.el6.x86_64
autofs-5.0.5-113.el6.x86_64
lvm2-2.02.118-2.el6.x86_64      

(4)RPM軟體包來源合法性和完整性的驗證 

     所謂rpm軟體包來源合法性和軟體包完整性的驗證,是指軟體安裝包的制作者使用單向加密算法提取出原始資料的特征碼,并使用自己的私鑰加密這段特征碼,附加在原始資料之後,在使用者在獲得相應的軟體安裝包後或者是在執行RPM軟體包安裝時,對于軟體包的可靠性及完整性進行的相關驗證。

    驗證前提:使用者必須有可靠的機制擷取到包制作者的公鑰!

    ①使用包制作者的公鑰解密那段加密的特征碼,能解密則說明來源合法;

    ②使用與制作者同樣的單向加密算法提取資料的特征碼,并與解密得到的特征碼比對,相同則說明包完整性沒問題。

      驗證時使用-V參數檢查軟體包中的元件是否與原始軟體包的組織簽名相同。

      首先必須擷取并導入信任的包制作者的密鑰,對于CentOS 6發行版來說,可以通過執行如下指令來進行操作:

[root@xlogin ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #在目前系統上導入包的制作者的公鑰:
[root@xlogin ~]# rpm -qa gpg-pubkey*   #查詢系統上已經安裝的秘鑰
gpg-pubkey-c105b9de-4e0fd3a3
[root@xlogin ~]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3      #查詢此秘鑰的詳細資訊
Name        : gpg-pubkey                   Relocations: (not relocatable)
Version     : c105b9de                          Vendor: (none)
Release     : 4e0fd3a3                      Build Date: Thu 24 Dec 2015 07:15:03 PM CST
Install Date: Thu 24 Dec 2015 07:15:03 PM CST      Build Host: localhost
Group       : Public Keys                   Source RPM: (none)
Size        : 0                                License: pubkey
Signature   : (none)
Summary     : gpg(CentOS-6 Key (CentOS 6 Official Signing Key) <[email protected]>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.8.0 (NSS-3)

mQINBE4P06MBEACqn48FZgYkG2QrtUAVDV58H6LpDYEcTcv4CIFSkgs6dJ9TavCW
...............................
-----END PGP PUBLIC KEY BLOCK-----      

     RPM軟體包來源合法性和完整性的驗證分為兩種情況:

  (1)軟體包在安裝過程中會自動用已經導入的的公鑰,對程式包進行檢驗,一般無需進行手動校驗。但是如果沒有給系統中導入相應的秘鑰檔案,則會報NO KEY等資訊提示。

[root@xlogin ~]# rpm -ivh htop-1.0.1-2.el6.x86_64.rpm 
warning: htop-1.0.1-2.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing...                ########################################### [100%]
   1:htop                   ########################################### [100%]      

  (2)管理者人為的手動操作進行驗正:rpm -K PACKAGE_FILE

  手動檢查:
          rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE 
              選項說明:
                    -K :等同于 --checksig ,進行檢查并顯示結果;
                    --nodigest:不檢查包完整性;
                    --nosignature:不檢查來源合法性。      
Linux 軟體包管理之RPM
Linux 軟體包管理之RPM

      ①要驗證下載下傳的postfix-2.10.1-6.0.1.el7.centos.x86_64.rpm軟體包,可用以下指令:

[root@xlogin ~]# rpm -K postfix-2.10.1-6.0.1.el7.centos.x86_64.rpm 
postfix-2.10.1-6.0.1.el7.centos.x86_64.rpm: rsa sha1 (md5) pgp md5 OK      

      ②要驗證已經安裝的postfix-2.10.1-6.el7.x86_64軟體包,可用以下指令:

[root@xlogin ~]# rpm -V postfix-2.10.1-6.el7.x86_64      

      ③ 當你感覺到你的系統好像不對勁,懷疑有人已經突破了你的系統防禦。确定此事是否發生的途徑之一就是檢查你的系統上軟體包安裝生成的檔案有沒有變化,通常隻有root才能檢查整個系統檔案的完整性,要驗證所有已經安裝的軟體包,可用以下指令:

[root@xlogin ~]# rpm -Va
S.5....T.  c /etc/modprobe.d/blacklist.conf
S.5....T.  c /etc/issue
missing   c /etc/yum.repos.d/CentOS-Base.repo
missing   c /etc/yum.repos.d/CentOS-Debuginfo.repo
missing   c /etc/yum.repos.d/CentOS-Media.repo
missing   c /etc/yum.repos.d/CentOS-Vault.repo
missing   c /etc/yum.repos.d/CentOS-fasttrack.repo
Unsatisfied dependencies for vim-clustershell-1.6-1.el6.noarch:
	clustershell = 1.6-1.el6 is needed by vim-clustershell-1.6-1.el6.noarch
S.5....T.  c /etc/rsyslog.conf      

     常見的校驗錯誤碼含義:

    對應屬性位說明:
              S file Size differs  檔案大小發生改變 
              M Mode differs (includes permissions and file type)  檔案的權限或類型被修改
              5 digest (formerly MD5 sum) differs  檔案内容發生改變
              D Device major/minor number mismatch 主裝置号、次裝置号發生改變
              L readLink(2) path mismatch  路徑改變
              U User ownership differs  屬主發生改變
              G Group ownership differs  屬組發生改變
              T mTime differs    檔案的修改時間發生改變
              P caPabilities differ 檔案的權限發生改變
              missing   相關檔案丢失
    在檔案屬性發生某項屬性變化時,對應屬性位的辨別才會顯示,若屬性無變化,則顯示為.      

(5)RPM軟體包的删除 

         rpm -e參數解除安裝時,預設如果正常解除安裝是不會輸出任何資訊的,在linux中,no news is good news!是以如果确實想看到解除安裝過程資訊,可以加vv參數。

    例如,要删除htop軟體包,可通過以下指令:

Linux 軟體包管理之RPM

    有時删除軟體包時會遇到關聯性的問題而無法删除,這時可以通過 --nodeps參數來強制删除,但不一定就可以删除成功。

Linux 軟體包管理之RPM

(6)RPM- 資料庫重建:

         如果rpm資料庫損壞或誤删除,可以參考RPM Guide。

   rpm的資料庫目錄預設是在/var/lib/rpm目錄下,建議做好該目錄備份工作。
        重建資料庫:
            rpm --initdb:初始化
                如果事先沒有庫,會建立一個;如果有,則不建立;
            rpm --rebuilddb : 重建
                直接重建,覆寫原有的資料庫      
Linux 軟體包管理之RPM

(7)其他

 rpm擷取幫助:
		CentOS 6:man rpm
		CentOS 7:man rpmdb      
rpm  [OPTIONS]  [PACKAGE_FILE]      

      [PACKAGE_FILE]可以是軟體包,也可以指定為ftp或http的URL等,rpm 内置 FTP/HTTP 用戶端,可以安裝、更新、查詢用 URL 指定的軟體封包件,比如:

ftp://USER:PASSWORD@HOST:PORT/path/to/package.rpm      

     如果省略了:PASSWORD 部分,将為每個使用者名/主機對提示一次密碼。