在linux世界裏流行兩種包管理方式,分別是redhat系的rpm和debian系的deb。其中rpm的使用更爲普遍,我打算接下來分多章詳細介紹一下rpm的包管理機制。php
包管理是操做系統用來維護各組件版本的一種方式,對於軟件發行者來講,將本身的程序製做成標準的rpm格式也會使得程序的安裝、升級和卸載變得很是容易。所以linux下幾乎全部流行的程序都有rpm格式的包,有些是發行者本身打包,也有些第三方提供rpm包,例如redhat發行版裏的rpm都是redhat本身打包,他們按期打patch,升級而且維護包之間的依賴關係,他們製做的rpm包是最能夠信任的。除此以外,http://dag.wieers.com/rpm/這個網站也提供不少較新的rpm包,在redhat官方找不到的包不少在這裏均可以找到。node
在網上搜索rpm包最經常使用的方式是經過rpmfind.net進行搜索,它會提供各個發行版下的各個版本的包下載。注意必定要找到正確的發行版下對應的包,因爲依賴底層庫和庫版本的不一樣,不一樣版本的發行版的包最好不要混裝。linux
今天先介紹rpm的安裝,基本的安裝命令以下git
rpm -ivh xxxxxxx.rpmsql
i表明安裝,e表明卸載,v表明顯示安裝過程,h表明顯示#號樣式的進度數據庫
下面看一個簡單的例子bash
[leconte@localhost soft]$ sudo rpm -ivh enca-1.9-4.el5.rf.i386.rpm warning: enca-1.9-4.el5.rf.i386.rpm: Header V3 DSA signature: NOKEY, key ID 6b8d79e6 Preparing... ########################################### [100%] 1:enca ########################################### [100%]
rpm包這樣就裝上了,可是不少時候沒有這麼順利,因爲rpm包之間可能存在依賴關係,在依賴關係沒法知足的狀況下默認是無法繼續安裝的;再好比某個包已經安裝過,若是想再裝一次,也是沒法繼續的。這種狀況下能夠經過一些參數來強制執行,可是強制執行的後果多是裝的程序沒法正常使用,由於它依賴的包你係統並無提供。curl
安裝時經常使用的參數以下:
--test 測試安裝,並不真實安裝而僅僅是測試可否安裝。
--nodeps 忽略依賴關係強行安裝
--force 強制替換現有版本
--noscripts 僅安裝文件不執行附加腳本ide
下面演示一個強行安裝的例子測試
[leconte@localhost soft]$ sudo rpm -ivh awstats-6.9-1.noarch.rpm error: Failed dependencies: perl(LWP::UserAgent) is needed by awstats-6.9-1.noarch [leconte@localhost soft]$ sudo rpm -ivh awstats-6.9-1.noarch.rpm --nodeps Preparing... ########################################### [100%] 1:awstats ########################################### [100%]
awstats依賴的PERL模塊LWP::UserAgent並無裝,所以默認是沒法安裝的,可是經過nodeps能夠強制安裝,而LWP::UserAgent能夠經過cpan去後續安裝。也就是說,若是你明白你在作什麼,那麼強制安裝並不可怕。
須要注意的是,rpm包的安裝和卸載都須要在系統的rpm數據庫裏保存信息,所以須要root權限。
本節接着介紹rpm的查詢功能,查詢是咱們最經常使用的功能,例如查詢一個包裏包含哪些文件、一個文件屬於哪一個包、以及包之間的依賴關係等等。
rpm的-q參數是用來進行查詢的,須要明確的是rpm既能夠對安裝在系統上的包進行查詢,也能夠對一個未安裝的rpm包進行查詢。當一個rpm包安裝到系統上以後,安裝信息一般會保存在本地的/var/lib/rpm/目錄下,數據會以berkeley DB的方式保存。查看/var/lib/rpm/Packages文件的類型能夠驗證這一點。
[leconte@localhost rpm]$ file /var/lib/rpm/Packages /var/lib/rpm/Packages: Berkeley DB (Hash, version 8, native byte-order)
這種狀況下的查詢其實就是對bdb的讀訪問。而對一個未安裝的rpm包進行查詢,則是經過解讀rpm包自己而獲取信息,這一點是首先須要明確的。
下面我就簡單羅列一下rpm最經常使用的幾個查詢功能
1.rpm -qa 用來查詢系統安裝的全部包,a表明all
2.rpm -ql [包名] 用來查詢某個包裏的文件列表,例如查詢包passwd裏包含的內容
[leconte@localhost rpm]$ rpm -ql passwd /etc/pam.d/passwd /usr/bin/passwd /usr/share/man/man1/passwd.1.gz
3.rpm -qi [包名] 用來查詢包信息,其中包含包的介紹,做者,打包日期等重要信息。
4.rpm -qf [文件名] 用來查詢一個文件所屬的rpm包,例如:
[leconte@localhost rpm]$ rpm -qf /etc/passwd setup-2.5.58-4.el5
系統配置文件/etc/passwd是屬於setup這個包的。
5.rpm -qV [包名] 用來驗證某個包中安裝的各文件的狀態,若是當前文件的大小、md5和安裝時數據庫裏保存的信息不一致,該命令則會將不一致的文件列出來。該命令對於系統出問題的狀況下的故障排查頗有幫助。
上面是幾個最經常使用的查詢命令,都是針對查詢系統rpm包狀況的。若是要查詢未安裝的rpm包則只須要加上p參數和包路徑便可。例如查詢包perl-Git-1.5.5.6-4.el5.i386.rpm的信息:
[leconte@localhost soft]$ rpm -qip perl-Git-1.5.5.6-4.el5.i386.rpm warning: perl-Git-1.5.5.6-4.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 217521f6 Name : perl-Git Relocations: (not relocatable) Version : 1.5.5.6 Vendor: Fedora Project Release : 4.el5 Build Date: 2009年06月19日 星期五 21時28分05秒 Install Date: (not installed) Build Host: xenbuilder2.fedora.redhat.com Group : Development/Libraries Source RPM: git-1.5.5.6-4.el5.src.rpm Size : 24878 License: GPL Signature : DSA/SHA1, 2009年06月20日 星期六 04時07分18秒, Key ID 119cc036217521f6 Packager : Fedora Project URL : http://kernel.org/pub/software/scm/git/ Summary : Perl interface to Git Description : Perl interface to Git.
rpm包之間會維持依賴關係,這是包管理系統的特點。咱們都經歷過安裝一個包而由於依賴缺失而裝不上的狀況。後來yum的出現能必定程度解決這個問題,但咱們仍然有必要了解rpm依賴關係背後的細節。
本身打過rpm包的人都知道,在包的spec配置文件每每要明確寫出此包所依賴的包名或文件名,同時也可能須要明確寫出此包所提供的內容。這個內容多是動態庫也多是其餘一些名字,並不必定是文件名。各個包之間正是依靠這些內容來創建依賴關係的,每一個包都提供一些內容同時依賴一些別的內容,整個系統就在這樣一種相互依賴中造成了。
在看具體的例子以前先介紹幾個指令:
rpm -qR [包名] 能夠用來查詢指定包所依賴的內容
rpm -q –provides [包名] 能夠用來查詢指定包所提供的內容
rpm -q –whatprovides [內容] 能夠用來查詢哪一個包提供了指定內容
rpm -q –whatrequires [內容] 能夠用來查看哪些包依賴於指定內容
例如咱們以time這個包爲例進行查詢,結果以下:
[leconte@localhost soft]$ rpm -qR time /bin/sh /bin/sh /sbin/install-info libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) libc.so.6(GLIBC_2.3.4) rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rtld(GNU_HASH)
可見,time這個包若是要安裝,上述內容必須已經存在,不然將會提示依賴缺失而沒法安裝。咱們以列表中的/bin/sh爲例進行反查,能夠看到系統中哪一個包提供了/bin/sh
[leconte@localhost soft]$ rpm -q --whatprovides "/bin/sh" bash-3.2-24.el5
很明顯,bash這個包提供了/bin/sh,正是因爲bash的安裝才知足了time的安裝需求。
time依賴於bash等包,同時它也提供了一些內容,有可能被別的包依賴:
[leconte@localhost soft]$ rpm -q --provides time time = 1.7-27.2.2 [leconte@localhost soft]$ rpm -q --whatrequires 'time' no package requires time
不幸的是系統中並無包依賴於time,由於它自己屬於較上層的包。
對於一些底層內容就會有不少包依賴它,例如以前碰到的/bin/sh:
[leconte@localhost soft]$ rpm -q --whatrequires '/bin/sh' bash-3.2-24.el5 bash-3.2-24.el5 info-4.8-14.el5 ncurses-5.5-24.20060715 libxml2-2.6.26-2.1.2.7 readline-5.1-1.1 ......................省略n行
因爲篇幅所限就不全列舉出來了,這種依賴關係應該能夠一目瞭然了。
和上節相似,rpm -qR和rpm -q –provides這兩個查詢指令一樣能夠加上-p參數應用到一個未安裝的rpm包,例如
[leconte@localhost soft]$ rpm -qp --provides enca-1.9-4.el5.rf.i386.rpm warning: enca-1.9-4.el5.rf.i386.rpm: Header V3 DSA signature: NOKEY, key ID 6b8d79e6 libenca.so.0 enca = 1.9-4.el5.rf
能夠看到,enca這個rpm包提供了動態庫libenca.so.0和enca自己。
經過使用本節這四條依賴關係查詢指令基本能夠了解到系統上衆多rpm包之間的耦合關係,明確了這一點,咱們對rpm的理解也就更深了一步。
介紹完了rpm包的安裝和查詢,本節接着來介紹rpm包的卸載和升級,這樣以來rpm包的「增刪改查」就都涉及到了。
rpm包的卸載和升級的指令以下:
rpm -e [包名] 用來卸載一個rpm包
rpm -U [包文件] 用來升級一個現有的rpm
須要注意的是,若是要卸載的rpm包中的內容被別的rpm包依賴,那麼則沒法卸載,例如
[leconte@localhost ~]$ rpm -e php-common error: Failed dependencies: php-common = 5.2.9-4 is needed by (installed) php-pdo-5.2.9-4.i386 php-common = 5.2.9-4 is needed by (installed) php-bcmath-5.2.9-4.i386 php-common = 5.2.9-4 is needed by (installed) php-curl-5.2.9-4.i386 php-common = 5.2.9-4 is needed by (installed) php-dba-5.2.9-4.i386
php-common因爲被 php-pdo等包依賴而沒法單獨卸載,php-pdo和php-common能夠利用上節介紹過的依賴關係查詢指令查到:
[leconte@localhost ~]$ rpm -qR php-pdo config(php-pdo) = 5.2.9-4 libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1.3) libc.so.6(GLIBC_2.3) libc.so.6(GLIBC_2.4) librt.so.1 libsqlite3.so.0 php-common = 5.2.9-4 .............. [leconte@localhost ~]$ rpm -q --whatrequires php-common php-pdo-5.2.9-4 php-bcmath-5.2.9-4 php-curl-5.2.9-4 php-dba-5.2.9-4 php-gd-5.2.9-4 ...............
這種狀況下想要卸載php-common,只能將它依賴的全部包所有卸載掉。更暴力的方式是指定-nodeps忽略依賴關係限制,可是這樣形成的後果就是php-pdo等包將沒法正常使用,所以這種方式通常不推薦。
rpm包的升級指的是rpm包的版本升級,這種狀況下實際內部執行的動做分兩步,即先安裝新版本而後卸載老版本。此外,rpm也能夠進行包的降級,只須要指定–oldpackages參數便可。
值得注意的是在卸載和升級的過程當中, 包中的配置文件會被妥善處理,rpm會根據一系列規則決定配置文件是否保留,即便被替換,舊的配置文件也會被重命名後保存起來,你以前對配置文件作過的修改不會由於rpm包的升級而丟失。
© 2010, Linux愛好者. 版權全部. 轉載請註明來自http://www.linuxers.cn