http://liaoph.com/linux-rpm/node
這篇文章主要講 RPM 軟件包管理器的使用。mysql
軟件包的演變史
最先期時,軟件包是一些能夠運行的程序組成的集合,可能還要加上若干配置文件和動態庫。例如,程序員將針對某個平臺編譯好的二進制文件、程序所依賴的動態庫文件(如 .so
和 .dll
爲擴展名的文件)以及配置文件複製到一個目錄中,這個目錄就能夠稱爲一個軟件包。linux
爲了保證使用的軟件包可以方便且快速地複製到別的機器上, 人們開始選用壓縮文件的方式來封裝軟件包。 好比經過 tar
或者 gzip
壓縮後獲得 .tar.gz
、 .rar
或者 .zip
格式的文件, 這時咱們就得到了一個較爲高級的軟件包。程序員
再日後發展, 就出現了更高級的軟件包, 好比 .rpm
、 .bin
或者 .deb
格式的軟件包。 這些格式的軟件包, 相對於壓縮格式的軟件包又有了更進一步的發展, 它們不只支持文件壓縮功能, 還有依賴維護、 腳本的嵌入等功能。RedHat 公司開發貢獻的 RedHat Package Manager(RPM) 能夠說是這些高級別軟件包中最典型的一個。算法
RPM 軟件包的功能
RPM 軟件包的功能以下:sql
- 存儲和數據壓縮
- 文件安裝
- 配置文件生成
- 系統服務註冊
- 軟件依賴檢查和依賴輸出
存儲數據壓縮
RPM具備軟件包的基本功能——數據壓縮存儲,RPM 安裝列表中的文件在按照某個指定的算法(如 gzip
)壓縮後,做爲最終 RPM 文件的一個數據塊,與其餘控制信息存儲進同一個文件中。最終全部的數據都存儲在同一個 RPM 文件中。shell
文件安裝
文件安裝是軟件包的一個基本功能,它將壓縮的文件解壓至目標操做系統上。安裝過程當中,還可能動態生成一些文件,並安裝到系統中。數據庫
配置文件生成
配置文件既多是預先寫好的靜態文件,也多是根據安裝環境動態生成的文件。apache
系統服務註冊
使用 rpm 安裝一些軟件包,好比 apache
,mysql-server
等,在安裝完成後,目錄 /etc/init.d/
下會生成一個服務啓動腳本文件,並且此服務還可能被加入到系統的自動啓動服務中。centos
軟件依賴檢查
大多數程序都會依賴其餘組件,好比數據庫操做程序可能須要 libmysql
的支持。爲了保證每一個軟件在安裝後都能正常運行,在安裝過程當中,軟件安裝程序須要對該軟件包所依賴的全部元素進行檢查。
其餘功能
RPM 還有一個重要功能就是對嵌入腳本的支持:它支持在安裝軟件或者卸載軟件的過程當中,執行用戶預約義的指令。經常使用的腳本執行點以下:
- pre install
- post install
- pre uninstall
- post uninstall
pre/post install 表示在安裝以前或以後;pre/post uninstall 表示在卸載以前或者以後。
除此以外,RPM 包還能夠支持對源包進行數字簽名,在安裝時可使用公鑰驗證 RPM 包的合法性等等。
RPM 包的命名方式
以 httpd-2.2.15-39.el6.centos.x86_64.rpm
爲例,這裏 httpd
表示軟件名,2.2.15
表示主版本號,次版本號,發行版本號分別是2
,2
,15
,39.el6.centos
表示 RPM 包的修訂號和 OS 信息,x86_64
表示此軟件包適用的平臺,常見的有i386
,i586
,x86_64
等等。
RPM 包管理命令的使用
安裝
rpm {-i|--install} [install-options] PACKAGE_FILE1..
安裝時可使用 -h
顯式安裝進度,使用 -v
顯示詳細信息。
[root@localhost ~]# rpm -ivh httpd-2.2.15-39.el6.centos.x86_64.rpm Preparing... ########################################### [100%] 1:httpd ########################################### [100%]
使用 --test
能夠用於測試安裝是否可以成功,而不實際安裝。
在安裝過程當中,可能遇到軟件包的依賴問題,而須要先安裝其餘軟件包,這時可使用 --nodeps
忽略依賴強制安裝,可是這樣安裝的軟件包一般也會由於依賴缺失而沒法正常工做。
若是須要從新安裝並覆蓋原有的文件,可使用 --replacepkgs
選項。
使用 --force
能夠進行強制覆蓋安裝,它等同於--replacepkgs, --replacefiles, 和 --oldpackage
。
升級
升級或安裝
若是不知道一個軟件包是否已經安裝,並但願若是已經安裝那麼升級次軟件包,使用 -U
選項。
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
若是僅僅但願升級軟件包,使用 -F
選項
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
升級軟件包和安裝軟件包同樣,可使用 --test
,--nodeps
,--force
等選項。
示例:安裝並升級 zsh 軟件包
[root@localhost rpm]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm Preparing... ########################################### [100%] 1:zsh ########################################### [100%] [root@localhost rpm]# rpm -Uvh zsh-4.3.10-9.el6.x86_64.rpm Preparing... ########################################### [100%] 1:zsh ########################################### [100%]
若是想要將軟件包降級到舊版本,使用 --oldpackage
選項
[root@localhost rpm]# rpm -Uvh --oldpackage zsh-4.3.10-7.el6.x86_64.rpm Preparing... ########################################### [100%] 1:zsh ########################################### [100%]
在升級軟件包時,原來軟件包的配置文件可能已經被修改,升級時,新版本的文件不會將老版本的配置文件覆蓋,而是將新版本的配置文件加上 .rpmnew
後綴後保存。
注意:內核也是軟件包,可是不要直接對內核進行升級(若是新的內核有兼容問題啓動不了而舊內核又被覆蓋就悲劇了),由於 Linux 容許多內核共存,因此能夠直接安裝多個不一樣版本內核。
卸載
rpm {-e|--erase} [--allmatches] [--nodeps] [--test] PACKAGE_NAME ...
一般使用 rpm -e PACKAGE_ANEM
便可簡單卸載一個軟件包。
使用 --nodeps
忽略依賴關係。--test
測試卸載。--allmatches
表示若是一個程序包同時安裝多個版本,則次選項一次所有卸載之。
若是卸載正常,不會輸出任何信息。
注意:若是程序包的配置文件安裝後曾被修改,卸載時,此文件一般不會被刪除,而是被重命名爲 .rpmsave
後綴後留存。
查詢:
查詢使用 -q
選項,能夠檢查安裝的全部包,還能夠查看某包的詳細信息。
rpm {-q|--query} [select-options] [query-options]
查詢某包是否已經安裝
rpm -q PACKAGE_NAME...
如:
[root@localhost rpm]# rpm -q zsh zsh-4.3.10-9.el6.x86_64
查詢安裝的全部包
rpm -qa
查詢未安裝包的信息
在 -q
同時使用 -p
選項
注意:查詢未安裝包的信息指定的是 RPM 包的文件名而不是某個包的軟件名。
查詢選項
查詢某包的簡要說明信息
rpm -qi PACKAGE_NAME
如:
[root@localhost rpm]# rpm -qi zsh Name : zsh Relocations: (not relocatable) Version : 4.3.10 Vendor: CentOS Release : 9.el6 Build Date: Wed 05 Nov 2014 07:20:52 PM CST Install Date: Sat 11 Apr 2015 11:37:12 PM CST Build Host: c6b8.bsys.dev.centos.org Group : System Environment/Shells Source RPM: zsh-4.3.10-9.el6.src.rpm Size : 5009102 License: BSD Signature : RSA/SHA1, Wed 05 Nov 2014 08:05:42 PM CST, Key ID 0946fca2c105b9de Packager : CentOS BuildSystem <http://bugs.centos.org> URL : http://zsh.sunsite.dk/ Summary : A powerful interactive shell Description : The zsh shell is a command interpreter usable as an interactive login shell and as a shell script command processor. Zsh resembles the ksh shell (the Korn shell), but includes many enhancements. Zsh supports command line editing, built-in spelling correction, programmable command completion, shell functions (with autoloading), a history mechanism, and more.
這裏顯式了 zsh
這個包的各種元信息,如名字,版本,發行商,打包做者,描述信息等。
查詢軟件包安裝的文件列表
rpm -ql PACKAGE_NAME
如:
[root@localhost rpm]# rpm -ql zsh /bin/zsh /etc/skel/.zshrc /etc/zlogin /etc/zlogout /etc/zprofile /etc/zshenv /etc/zshrc /usr/lib64/zsh /usr/lib64/zsh/4.3.10 ... /usr/share/zsh/4.3.10/functions/zstyle+ /usr/share/zsh/4.3.10/scripts /usr/share/zsh/4.3.10/scripts/newuser /usr/share/zsh/site-functions
使用 rpm -qc PACKAGE_NAME
能夠查看軟件包安裝後生成的全部配置文件。
使用 rpm -qd PACKAGE_NAME
能夠查看軟件包安裝後生成的全部說明文件和幫助文件。
查看軟件包製做時隨版本變化的 changelog 信息
rpm -q --changelog PACKAGE_NAME
查看軟件包提供的 capabilities (即輸出給其餘軟件包的依賴)
rpm -q --provides PACKAGE_NAME
查看軟件包所需的依賴
rpm -q --requires PACKAGE_NAME
查看軟件包安裝或卸載時執行的腳本
rpm -q --scripts PACKAGE_NAME
如:
[root@localhost rpm]# rpm -q --scripts zsh postinstall scriptlet (using /bin/sh): if [ ! -f /etc/shells ] ; then echo "/bin/zsh" > /etc/shells else grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells fi if [ -f /usr/share/info/zsh.info.gz ]; then # This is needed so that --excludedocs works. /sbin/install-info /usr/share/info/zsh.info.gz /usr/share/info/dir \ --entry="* zsh: (zsh). An enhanced bourne shell." fi : preuninstall scriptlet (using /bin/sh): if [ "$1" = 0 ] ; then if [ -f /usr/share/info/zsh.info.gz ]; then # This is needed so that --excludedocs works. /sbin/install-info --delete /usr/share/info/zsh.info.gz /usr/share/ info/dir \ --entry="* zsh: (zsh). An enhanced bourne shell." fi fi : postuninstall scriptlet (using /bin/sh): if [ "$1" = 0 ] ; then if [ -f /etc/shells ] ; then