Linux 基礎 —— RPM

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 安裝一些軟件包,好比 apachemysql-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 表示主版本號,次版本號,發行版本號分別是221539.el6.centos 表示 RPM 包的修訂號和 OS 信息,x86_64 表示此軟件包適用的平臺,常見的有i386i586x86_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 TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX` grep -v '^/bin/zsh$' /etc/shells > $TmpFile cp -f $TmpFile /etc/shells rm -f $TmpFile fi fi

這裏包含了安裝後,卸載前/後腳本。

檢驗

還能夠查詢軟件包安裝以後的文件是否發生了改變

rpm {-V|--verify} [select-options] [verify-options]

如:

[root@localhost rpm]# rpm -V httpd S.5....T. c /etc/httpd/conf/httpd.conf

檢驗時使用了多個位表示文件的多個屬性是否發生了變化:

S 文件大小 M 文件權限 5 文件摘要信息(一般是 MD5 碼) D 設備文件的主/次設備號 L 軟連接變化 U 屬主 G 屬組 T 文件的 mtime P caPabilities

程序包的合法性驗證

在軟件包製做時,爲了防止軟件包被人修改植入後門,製做者可使用本身私鑰對軟件包進行數字簽名,安裝者就可使用公鑰驗證軟件包的合法性。同時還可使用摘要算法提取軟件包的摘要信息用於驗證軟件包的完整性。

一般,RHEL 系的安裝光盤中包含有用於驗證其軟件包合法性的公鑰文件。

導入公鑰

rpm --import /path/to/RPM-GPG-KEY-FILE

驗證合法性

rpm {-K|--checksig} PACKAGE_FILE

RPM 管理器的數據庫

每次安裝 rpm 包時,rpm 系統會將一些元信息存儲在它的數據庫中,使用 rpm -q 命令查詢軟件包的相關信息時將會查詢這些數據庫,數據庫文件位於 /var/lib/rpm 目錄中。若是 RPM 的數據庫損壞,將會致使一些 RPM 數據丟失,一些功能將沒法正常使用。

[root@bogon ~]# file /var/lib/rpm/* /var/lib/rpm/Basenames: Berkeley DB (Hash, version 9, native byte-order) /var/lib/rpm/Conflictname: Berkeley DB (Hash, version 9, native byte-order) /var/lib/rpm/__db.001: Applesoft BASIC program data /var/lib/rpm/__db.002: 386 pure executable /var/lib/rpm/__db.003: 386 pure executable not stripped /var/lib/rpm/__db.004: 386 pure executable /var/lib/rpm/Dirnames: Berkeley DB (Btree, version 9, native byte-order) /var/lib/rpm/Filedigests: Berkeley DB (Hash, version 9, native byte-order) /var/lib/rpm/Group: Berkeley DB (Hash, version 9, native byte-order) /var/lib/rpm/Installtid: Berkeley DB (Btree, version 9, native byte-order) /var/lib/rpm/Name: Berkeley DB (Hash, version 9, native byte-order) /var/lib/rpm/Obsoletename: Berkeley DB (Hash, version 9, native byte-order) /var/lib/rpm/Packages: Berkeley DB (Hash, version 9, native byte-order) /var/lib/rpm/Providename: Berkeley DB (Hash, version 9, native byte-order) /var/lib/rpm/Provideversion: Berkeley DB (Btree, version 9, native byte-order) /var/lib/rpm/Pubkeys: Berkeley DB (Hash, version 9, native byte-order) /var/lib/rpm/Requirename: Berkeley DB (Hash, version 9, native byte-order) /var/lib/rpm/Requireversion: Berkeley DB (Btree, version 9, native byte-order) /var/lib/rpm/Sha1header: Berkeley DB (Hash, version 9, native byte-order) /var/lib/rpm/Sigmd5: Berkeley DB (Hash, version 9, native byte-order) /var/lib/rpm/Triggername: Berkeley DB (Hash, version 9, native byte-order)

能夠看到這裏有不少 Berkeley DB 格式的數據庫文件和幾個 __db 數據文件。

重建數據庫

若是 RPM 的數據庫損壞,首先能夠嘗試重建它,若是沒法重建,那麼須要從新初始化數據庫。

rpm --rebuilddb 表示重建數據庫

這個命令會從已安裝的軟件包提取信息重建數據庫,它從 /var/lib/rpm/Packages 這個文件中提取信息,其餘全部的數據庫文件均可以由這個文件重建。若是 RPM 的數據庫是無缺的,這個命令不會重建,而是對數據庫中未使用的條目進行空間回收。

rpm --initdb 建立一個新的 RPM 數據

若是已經沒有其餘別的辦法了,--initdb 會建立一個新的空的 RPM 數據庫。因爲新建的數據庫是空的,不要萬不得已不要使用這個命令。

相關文章
相關標籤/搜索