RPM即RPM Package Manager,RPM軟件包管理器。原來是Red Hat Package Manager的縮寫,現在相當於一個遞歸縮寫。
所謂程序包管理器,就是將編譯好的應用程序的各組成文件打包成一個或幾個程序包文件,從而更方便地實現程序包的安裝、升級、卸載和查詢等管理操作。RPM算是衆多程序包管理器中的一種,現在衆多Linux的發行版本都有采用,可以算是行業的標準了。現將RPM包管理功能做詳細解說。
CentOS系統上rpm命令可對程序包進行:安裝、升級、卸載、查詢、校驗和數據庫維護等管理。
命令格式:rpm [OPTIONS] [PACKAGE_FILE]
GENERAL OPTIONS:
-i,--install:程序包安裝
-U,--update,-F,--freshen:程序包升級
-e,--erase:程序包卸載
-q,--query:程序包查詢
-V,--verify:程序包校驗
--builddb,--initdb:數據庫維護
其它常用選項:
-v,verbose:顯示詳細信息
-vv:輸出更詳細信息
以下將針對各選項分別說明:
安裝:
格式:rpm {-i|--install} [install-options] PACKAGE_FILE ...
[install-options]:
-h:hash marks輸出進度條;每個#表示2%的進度;
這是一個很常用的選項,安裝過程一般與i和v一同使用。
rpm -ivh PACKAGE_FILE ...
--test:測試安裝,檢查並報告依賴關係及衝突消息等;
--nodeps:忽略依賴關係安裝;
但一般不建議使用,忽略依賴關係安裝可能會導致程序包無法正常使用。
--replacepkgs:重新安裝;
注意:如果因修改某配置文件而導致程序無法正常使用的話,重新安裝後修改過的配置文件
還將修改過後的狀態,程序還是一樣無法正常使用。此時需要刪除修改過的配置文件,再執行
重新安裝後,配置文件恢復原來配置,程序可正常使用。
--nosignature:不檢查包簽名信息,不檢查來源合法性;
--nodigest:不檢查包完整性信息;
--noscripts:不執行rpm所有自帶的腳本;
rpm自帶的腳本有:
preinstall:安裝過程開始之前運行的腳本,%pre;
postinstall:安裝過程完成之後運行的腳本,%post;
preuninstall:卸載過程真正開始執行之前運行的腳本,%preun;
postuninstall:卸載過程完成之後運行的腳本,%postun;
所以:
--nopre:不執行安裝過程開始之前運行的腳本;
--nopost:不執行安裝過程完成之後運行的腳本;
--nopreun:不執行卸載過程真正開始執行之前運行的腳本;
--nopostun:不執行卸載過程完成之後運行的腳本;
例如:查找並安裝光盤鏡像下zsh-5.0.2-14.el7.x86_64.rpm程序包,並不檢測來源合法性。
1、需先掛載光盤,此處將光盤掛載至/media/cdrom目錄下。具體操作如下:
掛載成功;
2、查看光盤鏡像下是否有zsh-5.0.2-14.el7.x86_64.rpm程序包,操作如下:
經查找在/media/cdrom/Packages目錄下有此程序包。
3、安裝程序包,操作如下:
安裝成功!
升級:
格式:rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-U和-F區別:
-U:表示升級或安裝,即當系統內有安裝老版本包時,則升級;沒有安裝老版本包時
直接安裝新版本。
-F:表示系統內有安裝老版本程序包,直接升級安裝。
升級其實和安裝一樣,升級只是替換老版本的安裝,所以升級常用選項和安裝相同
可表示爲:
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
安裝中[install-options]同樣也可以用於升級中。
升級中其它常用[install-options]:
--oldpackage:降級安裝;
當現有系統不兼容新安裝版本時可階級安裝老版本;
--force:強制升級;
當新版本對系統中其它程序的依賴關係不支持時,可選擇強制升級,相當於忽略依賴關係並安裝。
但不建議強制升級,可能會影響系統內其它程序正常使用。
注意:(1) 不要對內核做升級操作;Linux支持多內核版本並存,因此,直接安裝新版本內核;
(2)如果某原程序包的配置文件安裝後曾被修改過,升級時新版本的程序提供的同一個配置文件
不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)後提供;
例如:在CentOS 7.1系統中,查看所安裝zch版本,並將升級爲zsh-5.0.2-14.el7.x86_64.rpm,
操作如下:
1、查看系統中zch版本:查看命令隨後會介紹
查看現系統安裝zch版本爲:zsh-5.0.2-7.el7.x86_64.rpm
2、掛載光盤鏡像並升級安裝:
成功升級爲zsh-5.0.2-14.el7.x86_64.rpm
卸載:
格式:rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
--allmatches:卸載所有匹配指定名稱的程序包的各版本;
因爲Liunx程序包在系統內可以並在,此選項可卸載所有匹配名稱程序包的版本;
--nodeps:忽略依賴關係;
別的程序包可能對將卸載程序包程序有依賴關係,將無法卸載,此選項可忽略依賴關係卸載,
但可能會導致依賴它的程序無法正常使用,謹慎使用。
--test:測試卸載,dry run模式;
--noscripts:不執行rpm自帶腳本,同安裝選項;
例如:卸載剛纔所安裝的zsh-5.0.2-14.el7.x86_64.rpm程序包。
卸載完成,注意:卸載時後跟的是包名,而非包的路徑,上面的安裝與升級是在包自己的目錄下直接
安裝或升級的,所以直接跟包名了,請大家注意!
查詢:
格式:rpm {-q|--query} [select-options] [query-options]
[select-options]挑選選項
PACKAGE_NAME:查詢指定的程序包是否已經安裝及其版本;
上面已簡單用過,例如:上面卸載的演示
可對比包自裁前後查看結果;
-a, --all:查詢所有已經安裝過的包;
此命令和grep命令聯合使用,可以快速查找你想要找的安裝包;
例如:查詢所有安裝過的有關bash的包:
-f FILE:查詢指定的文件由哪個程序包安裝生成;
例如:查詢/etc/fstab文件由哪個程序包安裝生成:
-p, --package PACKAGE_FILE:用於實現對未安裝的程序包執行查詢操作;
通常配合[query-options]對未安裝的包進行查詢;[query-options]下面會介紹;
例如:查詢zsh-5.0.2-14.el7.x86_64.rpm相關信息:
對比用rpm -qi 和 rpm -qpi命令區別;
--whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個程序包提供;
例如:查詢bash特性由哪個程序包提供:
--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴;
例如:查詢bash特性被哪個包所依賴
[query-options]查詢選項
--changelog:查詢rpm包的changlog;
即查詢rpm包自第一版到目前版本日誌變更,不再詳述;
-l, --list:程序安裝生成的所有文件列表;
例如:查看安裝bash所生成所有文件
由於文件太多,不一一列舉,只截了幾個;
-i, --info:程序包相關的信息,版本號、大小、所屬的包組,等;
例如:查看bash包詳細信息
-c, --configfiles:查詢指定的程序包提供的配置文件;
例如:查詢bash包提供的配置文件:
-d, --docfiles:查詢指定的程序包提供的文檔;
例如:查詢bash提供的文檔:
由於文檔過多,不一一列舉,只截了幾個;
--provides:列出指定的程序包提供的所有的CAPABILITY;
可以跟 --whatprovides 對比一下
例如:列出bash所提供的特性:
-R, --requires:查詢指定的程序包的依賴關係;
可以比較 --whatrequires 不同
例如:查詢bash包依賴關係:
--scripts:查看程序包自帶的腳本片段;
例如:查詢bash包自事的腳本片段:
rpm查詢功能在工作中是很常用的,一定要掌握。
常用方法:
-qi PACKAGE:查詢程序包相關信息;
-qf FILE:查詢指定文件由哪個程序包生成;
-qc PACKAGE:查詢指定程序包提供的配置文件;
-ql PACKAGE:查詢指定程序包安裝生成所有文件列表;
-qd PACKAGE:查詢指定程序包提供的文檔:
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE:查詢未安裝程序包一些信息;
校驗:
格式:rpm {-V|--verify} [select-options] [verify-options]
[select-options]選項與查詢[select-options]選項相同不再詳述;
[verify-options]選項都是以--no開頭,表示不驗證某選項,默認情況全部驗證,不再一一列舉;
驗證後顯示選項含義如下:
S:表示包文件大小發生改變;
M:表示包權限發生改變;
5:表示包MD5碼發生改變;
D:表示包的主次設備號不匹配;
L:表示readLink路徑不匹配;
U:表示包屬主發生改變;
G:表示包屬組發生改變;
T:表示包最後一次修改的時間戳發生改變;
P:表示caPabilities發生改變;
無輸出則是最好的輸出,驗證無問題。
程序包的驗證既要驗證包來源的合法性又要驗證包的數據完整性,驗證需要用對方公鑰來解密驗證。
獲取信任的包製作者公鑰:
1、光盤鏡像中存有包製作者公鑰;
2、/etc/pki/rpm-gpg/公鑰名 目錄下存有;
3、信任網站獲取;
導入信任的包製作者公鑰:
對於CentOS發行版來說:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7,以CentOS7爲例。
驗證方法:
1、安裝此組織簽名的程序時,會自動執行驗正;
2、手動驗正:rpm -K PACKAGE_FILE
數據庫重建:
格式:
rpm {--initdb|--rebuilddb} [--dbpath=DIRECTORY] [--root DIRECTORY]
--initdb:初始化數據庫,當前無任何數據庫可實始化創建一個新的;當前有時不執行任何操作;
--rebuilddb:重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重新創建;
rpm管理器數據庫路徑:/var/lib/rpm/
查詢操作(安裝、升級、卸載、查詢、驗證):通過此處的數據庫進行;
當rpm數據庫損壞時需重建數據庫;
例如:在/tmp目錄下建立臨時rmp數據庫,並重建:
對比--initdb和--rebuilddbu效果的不同。
至此,RPM包管理功能介紹完成,希望對學習Linux的小夥伴們有用,rpm在日後工作中常會用到,希望大家日後可多多交流。