首頁 > 軟體

Linux軟體包管理之rpm

2020-06-16 17:22:14

一、前言

在沒有軟體包管理器前,使用者都是通過原始碼的方式來安裝軟體。但是我們很容易發現,在每次安裝軟體時都必須對作業系統的境、編譯的引數進行對應的編譯,並且操作過程很是複雜,這對於不熟悉作業系統的朋友來說真心困難,那麼有沒有一款軟體能讓使用者能很簡單的安裝所需的軟體呢?

隨著自由軟體蓬勃發展,Linux系統的飛快發展,很多軟體開發者、企業和社群將這些軟體開始通過收集、整理、編譯製作成distributions發布到常用的Linux作業系統上,但是後來發現,這樣做在日後軟體更新、系統更新上面都需要做很多操作。為了解決這個問題,一些社群和企業開始思考關於Linux的軟體管理方式。

通過社群與企業的共同努力,Linux開發商將固定的硬體平台和作業系統需要安裝或升級的軟體編譯好,並且將這些軟體通過特定的打包方式將軟體打包成一個特殊格式的檔案,這些軟體的檔案含有能檢測作業系統環境和軟體依賴性的指令碼,並提供記載該軟體提供的所有檔案資訊等,最後將這個軟體發佈出去供使用者使用。那麼使用者得到這個軟體包,通過特定的命令,就能執行檢測系統環境,根據環境所需的要求,對軟體進行安裝。這就是軟體管理器的誕生。

二、目前常見Linux軟體安裝方式有2種

2.1、dpkg

這個軟體安裝方法是通過Debian Linux社群開發出來的,通過dpkg機制,Debian所提供的軟體就能通過很簡單的方法安裝軟體,並且能記錄安裝後的軟體資訊。只有是Debian的Linux distributions大多數都是使用這個方法管理軟體。例如B2D、Ubuntu

2.2、RPM

這個軟體安裝方法是由Red Hat公司開發出來的,由於非常的簡單實用,很多的distributions都使用這個機制來安裝和管理軟體。例如:CentOSSUSE

三、程式包管理器

功能:將編譯好的程式打包成一個檔案或有限的幾個檔案,可以用於實現安裝、解除安裝、升級、查詢等功能

包含:

1、資料庫

程式名及版本

依賴關係: X –> Y,Z

功能性說明(rpm -qi bash)

安裝生成的各檔案路徑及校驗碼

2、程式的組成清單

檔案清單

安裝解除安裝時執行的指令碼

四、RPM介紹

RPM(RedHat Package Manager),RPM通過以一個資料庫記錄的方式來將你所需的軟體安裝到你的Linux系統上的。在你所安裝的軟體前先通過編譯完成,打包成RPM格式的檔案,資料庫記錄的方式搜尋對應需要具備的依賴關係的軟體,那麼當你在安裝該軟體的時候,RPM會檢視你系統環境和依賴性關係來判定你是否能安裝此軟體。若能滿足,則允許安裝。否則將不給予安裝。並且在安裝的時候將該軟體的資訊寫入RPM的資料庫中,以便日後查詢、檢驗和升級。

五、RPM包的命名格式

格式:

name–version–release.arch.rpm

 

例如:

bash-4.2.3-3.centos5.x86_64.rpm 
#表示bash-4.2.3,第三次發行,支援CentOS5系統,支援硬體平台x86_64位元系統

獲取rpm包的途徑:

1、發行的光碟或站點伺服器

映象:

2、專案的官網

  • 原始碼

  • rpm包

3、很多第三方機構或個人製作並公開發布許多的rpm包

  • http://rpmfind.net

  • http://rpm.pbone.net/

六、打包工具的分包機制

假設一個程式有20個功能:常用功能有8個,特殊功能A:3個,特殊功能B:6個,二次開發相關功能:3個。那如果使用者只需要常用功能,可是必須要全部安裝,那麼就會很佔用空間,而且其他功能根本不會使用,這時就會分包機制了。

分包機制:

核心包(主包) + 子包(分包)組成

核心包:命令與源程式一致

例如:bash-4.2.3-3.centos7.x86_64.rpm

子包:(安裝子包前必須安裝核心包)

例如: bash-a-4.2.3-3.centos7.x86_64.rpm

bash-devel-4.2.3-3.centos7.x86_64.rpm   #devel就表示開發功能

 

七、RPM包的使用

7.1、安裝(組合選項:-ivh)

rpm [option] Package_file

-i:install安裝操作

-v:安裝時顯示詳細資訊

-vv:安裝時顯示更詳細資訊

-h:hash碼,在安裝過程中使用#號來顯示安裝進度

–-test:僅作測試,不做安裝操作

-–nodeps:忽略依賴關係,強制安裝如果某包依賴於其他包,要麼解決所有的依賴關係,要麼忽略依賴關係,強制安裝。但是如果強制安裝完成後,軟體未必能正常使用。

–-replacepkgs:重新安裝程式包
備註:如果原有組態檔作了修改,很有可能不執行替換檔案,而是將新生成的組態檔重新命名字尾為 .rpmnew

例子:

#測試安裝RPM包
[root@localhost mnt]# mount /dev/cdrom /mnt                         #掛載光碟映象到/mnt目錄下
mount: block device /dev/sr0 is write-protected, mounting read-only 
[root@localhost mnt]# cd /mnt/Packages/                             #進入光碟目錄
[root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm     #安裝zsh-4.3.10-7.el6.x86_64.rpm包
warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY 
#這裡的是提示金鑰,無法校驗包的合法性
Preparing...                ########################################### [100%] 
#使用#代表安裝進度,一個#代表2%
   1:zsh                    ########################################### [100%]
#僅作測試,不做安裝
[root@localhost Packages]# rpm -q zsh    
package zsh is not installed
[root@localhost Packages]# rpm --test -ivh zsh-4.3.10-7.el6.x86_64.rpm#僅作測試安裝,實際上未安裝
warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]
[root@localhost Packages]# rpm -q zsh                                                              
package zsh is not installed

7.2、解除安裝

rpm [option] Package_name

     -e:erase 刪除

解除安裝的時候也會存在依賴關係的,如果被其他包所依賴:

  • 1、將依賴於此包的所有包一併解除安裝

  • 2、忽略依賴關係能解除安裝,但依賴於此包程式包可能會執行不正常

    –nodeps 忽略依賴關係

練習:

[root@localhost Packages]# rpm -q zsh  #檢視軟體是否安裝,顯示出包的資訊證明已經安裝
zsh-4.3.10-7.el6.x86_64
[root@localhost Packages]# rpm -e zsh  #解除安裝zsh軟體
[root@localhost Packages]# rpm -q zsh
package zsh is not installed           #提示該軟體未安裝

注意:如果包的組態檔安裝後曾被改動過,解除安裝時,此檔案將不會解除安裝,而是重新命名並儲存,會出現下面的欄位

            warning: /etc/zshrc saved as /etc/zshrc.rpmsave

例如:

[root@localhost Packages]# rpm -e zsh
warning: /etc/zshrc saved as /etc/zshrc.rpmsave
[root@localhost Packages]# ls /etc/ | grep "zsh*"
zshrc.rpmsave

7.3、升級(一般而言是新版本取代老版本)

rpm [option] Package_file

(1)、升級或安裝 (如果有老版本就升級,如果沒有就安裝)

   組合 -Uvh

(2)、直接升級 (如果有老版本就安裝新版本)

   組合 -Fvh

升級的時候也可能會出現版本衝突等問題,所以如果想強制升級可以使用 --force

注意:不應該對核心執行升級操作,而是安裝(因為Linux系統允許多核心並存)

7.4、查詢

(1)、查詢某包是否安裝

rpm -q package_name…..

(2)、查詢所有已經安裝的包

rpm -qa           #a表示all

按條件過濾: rpm -qa | grep 'PATTERN'

(3)、查詢包的表述資訊

rpm -qi package_name         (這裡查詢僅查詢已安裝的包)

(4)、查詢某包生成了哪些檔案

rpm -ql package_name

①查詢某包生成了哪些組態檔

rpm -qc package_name

②查詢某包生成了哪些幫助檔案

rpm -qd package_name

③查詢程式包的相關指令碼

rpm -q –scripts package_name

指令碼有四類

preinstall:安裝前指令碼

postinstall:安裝後指令碼

preuninstall:解除安裝前指令碼

postuninstall:解除安裝後指令碼

(5)、查詢某檔案是由哪個包安裝生成的

rpm -qf /path/to/some_file

 

(6)查詢某包所提供的capabilities

rpm -q provides PACKAGE_NAME

(7)查詢某包所依賴的capabilities

rpm -q --requires PACKAGE_NAME

(8)、對尚未安裝的包執行查詢

rpm [option] /path/to/package_file

-q  :檢視軟體包是否安裝

-qpi:包的資訊

-qpl:安裝以後會生成什麼檔案

-qpc:安裝以後會生成什麼組態檔

-qpd:安裝以後會生成什麼幫助檔案

(9)查詢指定的CAPABILITY由哪個包所提供

 

rpm  -q --whatprovides CAPABILITY

(10)查詢指定的CAPABILITY被哪個包所依賴

 

rpm  -q --whatrequires CAPABILITY

(11)查詢某包製作時隨版本變化的changelog資訊

 

rpm -q --changelog PACKAGE_NAME

(12)預覽包內檔案

 

rpm2cpio 包檔案|cpio –itv   #需要制定包的路徑

(13)釋放包內檔案

 

rpm2cpio 包檔案|cpio –id “ *.conf” #需要制定包的路徑

練習:

[root@localhost Packages]# rpm -q zsh             #檢視zsh軟體是否安裝                    
zsh-4.3.10-7.el6.x86_64
[root@localhost Packages]# rpm -qa | grep zsh     #檢視zsh軟體是否安裝  
zsh-4.3.10-7.el6.x86_64
[root@localhost Packages]# rpm -qd zsh            #查詢zsh包生成了哪些幫助檔案
[root@localhost Packages]# rpm -qpl httpd-2.2.15-29.el6.centos.x86_64.rpm  #在未安裝httpd時,查詢安裝httpd會生成什麼檔案
[root@localhost Packages]# rpm -qf /etc/bashrc    #查詢bashrc這個檔案是通過什麼程式包安裝生成的
setup-2.8.14-20.el6_4.1.noarch

7.5、校驗(用於檢查包裝後檔案屬性是否發生變化)

rpm -V Package_name

    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     路徑發生改變

    U User ownership differs        屬主發生改變

    G Group ownership differs     屬組發生改變       

    T mTime differs        修改時間發生變化

    P caPabilities differ    能力發生變化(可以理解為功能)

某屬性無改變,則顯示為:

[root@localhost Packages]# tail -5 /etc/zshrc 
}
_src_etc_profile_d
unset -f _src_etc_profile_d
#test file                               #在 /etc/zshrc檔案中最後一行新增了最後一段
[root@localhost Packages]# rpm -V zsh    #查詢該zsh軟體的組態檔是否更改
S.5....T.  c /etc/zshrc                  #看出檔案大小,MD5校驗,修改時間都發生了變化

7.6、RPM資料庫重建

rpm 的資料庫目錄: /var/lib/rpm

rpm –-initdb:初始化如果事先沒有庫,會新建一個;如果有,則不覆蓋

rpm –-rebuilddb:重建直接重建,覆蓋原有的資料庫

7.7、校驗RPM包來源合法性及完整性

前言:包製作者製作完成之後會附加數位簽章於包上;包的製作者使用單向加密提取原始資料的特徵碼,而後使用自己的私鑰加密這段特徵碼,附加原始資料後面。

驗證包來源合法性和完整性的過程:

前提:必須有可靠機制獲取到包製作者的公鑰

  • 1、使用製作者的公鑰解密加密的特徵碼,能解密則意味著來源合法

  • 2、使用與製作者同樣的一樣加密演算法提取原始資料的特徵碼,並與解密出來的特徵碼比對,相同,則意味著完整性沒問題,所以我們必須在當前系統上匯入包的製作者的公鑰

匯入公鑰:

 rpm –-import /path/to/key_file

小貼士:centos6的金鑰是在光碟裡的“RPM-GPG-KEY-CentOS-6 ”檔案

顯示所有已匯入的gpg格式的公鑰:

rpm -qa gpg-pubkey*

顯示公鑰的詳細資訊:

rpm -qi gpg-pubkey-name

檢查包安裝過程中會自動執行,若要手動檢測請如下操作:

手動檢查:

rpm -K /path/to/package_file

rpm –-checksig /path/to/package_file

不檢查包完整性:

rpm -K –-nodigest

不檢查來源合法性:

rpm -K –-nosignature

實驗:

 

誤刪除rpm修復方法:

1.進入救援模式

2.建立掛載目錄:

mkdir /mnt/cdrom

3.掛載光碟映象:

mount -r /dev/sr0 /mnt/cdrom

4.進入軟體包目錄:

cd /mnt/cdrom/Packages/

5.安裝rpm:

rpm -ivh rpm-4.11.3-17.el6.x86_64- --root=/mnt/sysimage/


練習:

[root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm                              
#安裝時會提示你沒有公鑰,無法校驗包的完整性與合法性
warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
[root@localhost Packages]# rpm --import /mnt/RPM-GPG-KEY-CentOS-6                            
#匯入金鑰
[root@localhost Packages]# rpm -qa gpg-pubkey*                                               
#檢視所以已匯入的gpg格式的金鑰
gpg-pubkey-c105b9de-4e0fd3a3
[root@localhost Packages]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3                              
#檢視金鑰詳細資訊
[root@localhost Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm                
#可以匯入金鑰後安裝軟體會自動執行檢查,通過後直接安裝      
Preparing...                ########################################### [100%]    
   1:zsh                    ########################################### [100%]
[root@localhost Packages]# rpm -K zsh-4.3.10-7.el6.x86_64.rpm                                
#手動檢查包的完整性與合法性
zsh-4.3.10-7.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

八、知識要點總結

  • 8.1、了解軟體包管理器的來源與使用

  • 8.2、熟悉RPM包的命名格式 name-version-release.arch.rpm

  • 8.3、熟悉打包和分包機制

  • 8.4、熟悉RPM命令的使用 ,包括 安裝、解除安裝、查詢、升級、校驗、公鑰匯入、合法性的檢驗、RPM資料庫重建

雖然在安裝軟體時還有其他更好的命名,比如yum(日後再介紹),但是yum也是基於RPM而衍生出來的,而且在查詢軟體包很有用,日後也會經常使用這個命令,所以必須要對RPM命令非常熟悉,尤其是查詢命令,對日後維護Linux系統幫助很大。建議多加練習

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-02/140277.htm


IT145.com E-mail:sddin#qq.com