RPM包管理器最先是由Red Hat公司研發的一款Linux上的程序包管理器,文件包的後綴名爲「.rpm」。目前是GNU/Linux下軟件包資源最豐富的軟件包類型之一。php
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
前端
rpm包命名格式:node
name-VERSION-release.arch.rpm redis
包的名字-版本號-發行號.架構平臺.rpm算法
VERSION:major.minor.release 源碼包的主版本號、次版本號、發行號數據庫
注意:rpm包事實上是將源代碼編譯製做成二進制格式的文件並打包成的rpm包,因此這裏的VERSION是指的源代碼的版本號bash
release:這裏的release纔是rpm包自己的發行號服務器
archetecture:i386, x64(amd64), powerpc... 架構
適用於的操做系統平臺,也有noarch適合於全平臺的,這是由於有些程序是運行在例如Java虛擬機中的,因此不管底層操做系統是什麼平臺都適用less
例如redis-3.0.2-2.e17.i686.rpm表示適用於redhat7的第二次製做的32位的rpm包
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rpm包的拆包:
通常rpm包均可以拆分爲:主包和支包。主包是將服務程序運行起來的核心包,支包是能夠提供更多功能的包。拆包能夠實現對rpm包按需安裝
主包:name-VERSION-release.arch.rpm 主包跟程序包的命名格式相同
支包:name-function-VERSION-release.arch.rpm
function:devel(開發功能), utils(工具程序), libs(庫文件), ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
依賴關係:
包和包之間存在依賴關係,例如安裝X包時須要安裝X包依賴的Y包,利用程序包管理器前端工具(例如yum)能夠實如今安裝rpm包時自動安裝所須要的依賴包。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
獲取程序包的途徑:
(1) 系統發行版的光盤或官方的文件服務器(或鏡像站點):
http://mirrors.aliyun.com,
http://mirrors.sohu.com,
http://mirrors.163.com
(2) 項目的官方站點
(3) 第三方組織:
(a) EPEL
(b) 搜索引擎
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
(4) 本身製做rpm包
建議:安裝rpm包時應檢查其來源合法性和程序包的完整性;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CentOS系統上rpm命令管理程序包:
安裝、升級、卸載、查詢和校驗、數據庫維護
rpm命令:rpm [OPTIONS] [PACKAGE_FILE]
安裝:-i, --install
升級:-U, --update, -F, --freshen
卸載:-e, --erase 清除
查詢:-q, --query
校驗:-V, --verify
數據庫維護:--builddb, --initdb
GENERAL OPTIONS:通用選項
-v:verbose,詳細信息
-vv:更詳細的過程輸出信息
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一、rpm包的安裝
rpm {-i|--install} [install-options] PACKAGE_FILE ...
經常使用選項:
rpm -ivh PACKAGE_FILE ...
[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
例如:
一、安裝光盤中的zsh程序包,顯示詳細進度,注意安裝rpm包時要輸入包的全名
二、安裝zlib包,顯示更加詳細的安裝進度信息
三、測試安裝php的common包,會顯示須要須要依賴的包
四、安裝php的common包,忽略依賴關係
五、從新安裝zsh包
六、從新安裝zsh包,不檢查包的來源合法性,注意安裝過程就不會顯示警告信息了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
二、rpm包的升級
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
升級rpm包時一樣可使用安裝時的通用選項,例如忽略依賴關係,測試升級等等
-U:升級或安裝;沒有老版本就會安裝
-F:升級;只能升級,若是沒有老版本將不會安裝
--oldpackage:降級;
--force:強制升級;
經常使用選項:
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
注意:
(1) 不要對內核作升級操做;Linux支持多內核版本並存,所以,直接安裝新版本內核;
(2) 若是某原程序包的配置文件安裝後曾被修改過,升級時,新版本的程序提供的同一個配置文件不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)後提供;
例如:
一、未安裝zsh包時,使用-Fvh選項將不會安裝,使用-Uvh就會直接安裝
二、將zsh降級回原來的版本
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
三、rpm包的卸載
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
注意卸載是PACKAGE_NAME只輸入包名就好了,安裝時PACKAGE_FILE必須寫包文件路徑全名
--allmatches:卸載全部匹配指定名稱的程序包的各版本;
--nodeps:忽略依賴關係
--test:測試卸載,dry run模式
例如:
一、卸載zsh程序包,卸載時選項後面只跟包名就能夠了
二、測試卸載zsh程序包,沒有輸出信息即表示能夠正常卸載
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
四、rpm包的查詢
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包的更新記錄;注意是rpm包的changelog而不是源碼包的changelog
-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; ...
例如:
一、查詢zsh包是否已經安裝,若是已安裝查看其版本
二、在已安裝的全部包裏面查詢安裝了的yum包
三、查詢/etc/inittab文件由哪一個程序包安裝生成
四、查詢bash包的更新記錄,可使用less查看
五、查詢安裝zsh包時生成了哪些文件
六、查詢gzip程序包的相關信息,版本號、大小、所屬的包組、簽名信息、源碼程序包、簡要功能說明等
七、查詢bash程序包提供了哪些配置文件
八、查詢bash程序包提供了哪些文檔
9、查詢bash程序包提供的全部的CAPABILITY
十、查詢/bin/bash此CAPABILITY由哪一個程序包提供
十一、查詢/bin/sh此CAPABILITY被哪些包所依賴
十二、查詢bash程序包所依賴的CAPABILITY
1三、查看bash程序包安裝時生成了哪些腳本
1四、查詢未安裝的zsh程序包安裝後會生成哪些配置文件
1五、查詢未安裝的zsh程序包的相關信息
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
五、rpm包的校驗
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 最近一次修改文件的時間戳發生改變
P caPabilities differ CAPABILITY改變
例如:
一、校驗zsh程序包,沒有輸出信息則表示zsh驗證經過
二、查詢zsh程序包安裝時生成的配置文件
三、在zsh的配置文件/etc/zprofile中加入內容爲new line的新行
四、再次校驗zsh程序就會顯示文件的大小,md5值,最近一次修改時間發生改變;每一個.號表明一種屬性
五、校驗zsh程序包時不檢查文件,因此就不會提示屬性改變了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
六、rpm包的來源合法性驗證和完整性驗證
包來源合法性驗正和完整性驗正:
來源合法性驗正:
完整性驗正:
程序包的製做者首先用單項加密計算出程序包的定長特徵碼,而後再用本身的私鑰加密這段特徵碼,加密後的結果這就是程序包的數字簽名,而且將加密後的特徵碼附加在程序包的後面;
使用者在獲得程序包之後用合法獲取的公鑰進行解密,由於私鑰只有製做者本身有,因此若是使用者能解密這段特徵碼,就意味着特徵碼是沒有被篡改過的;
使用者再用一樣的單向加密算法計算出程序包的特徵碼和解密出的特徵碼進行比較,若是二者一致,即表示程序包的來源是合法的。
獲取並導入信任的包製做者的密鑰:
對於CentOS發行版來講:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
驗正方式:
(1) 安裝此組織簽名的程序時,會自動執行驗正;
(2) 手動驗正:rpm -K PACKAGE_FILE
例如:
一、未導入密鑰時,安裝程序包會有警告信息
二、導入光盤中的密鑰,在/etc/pki-gpg中也有一樣的密鑰,任意導入其中一個便可
或
三、導入密鑰後從新安裝程序包,校驗經過就不會提示警告信息了
四、手動驗證程序包,前提是手動驗證以前已經導入過公鑰
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
七、rpm數據庫重建
數據庫重建:
rpm管理器數據庫路徑:/var/lib/rpm/
查詢操做:經過此處的數據庫進行;
獲取幫助:
CentOS 6:man rpm
CentOS 7:man rpmdb
rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
--initdb:初始化數據庫,當前無任何數據庫可實始化建立一個新的;當前有時不執行任何操做;
--rebuilddb:從新構建,經過讀取當前系統上全部已經安裝過的程序包進行從新建立;
例如:
一、建立/tmp/rpmdb目錄,初始化數據庫時指定數據庫的位置爲/tmp/rpmdb