佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 全面講解RedHat系Linux中的rpm包管理系統(tǒng)

全面講解RedHat系Linux中的rpm包管理系統(tǒng)

熱門標(biāo)簽:Win7旗艦版 智能手機(jī) 服務(wù)外包 網(wǎng)站建設(shè) 硅谷的囚徒呼叫中心 Linux服務(wù)器 百度競(jìng)價(jià)排名 免費(fèi)建站

在linux世界里流行兩種包管理方式,分別是redhat系的rpm和debian系的deb。其中rpm的使用更為廣泛,我打算接下來(lái)分多章詳細(xì)介紹一下rpm的包管理機(jī)制。
包管理是操作系統(tǒng)用來(lái)維護(hù)各組件版本的一種方式,對(duì)于軟件發(fā)行者來(lái)說(shuō),將自己的程序制作成標(biāo)準(zhǔn)的rpm格式也會(huì)使得程序的安裝、升級(jí)和卸載變得非常容易。因此linux下幾乎所有流行的程序都有rpm格式的包,有些是發(fā)行者自己打包,也有些第三方提供rpm包,例如redhat發(fā)行版里的rpm都是redhat自己打包,他們定期打patch,升級(jí)并且維護(hù)包之間的依賴關(guān)系,他們制作的rpm包是最可以信任的。除此之外,http://dag.wieers.com/rpm/這個(gè)網(wǎng)站也提供很多較新的rpm包,在redhat官方找不到的包很多在這里都可以找到。
在網(wǎng)上搜索rpm包最常用的方式是通過(guò)rpmfind.net進(jìn)行搜索,它會(huì)提供各個(gè)發(fā)行版下的各個(gè)版本的包下載。注意一定要找到正確的發(fā)行版下對(duì)應(yīng)的包,由于依賴底層庫(kù)和庫(kù)版本的不同,不同版本的發(fā)行版的包最好不要混裝。

RPM的安裝功能
先介紹rpm的安裝,基本的安裝命令如下

復(fù)制代碼
代碼如下:

rpm -ivh xxxxxxx.rpm

i代表安裝,e代表卸載,v代表顯示安裝過(guò)程,h代表顯示#號(hào)樣式的進(jìn)度
下面看一個(gè)簡(jiǎn)單的例子:

復(fù)制代碼
代碼如下:

[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包這樣就裝上了,但是很多時(shí)候沒(méi)有這么順利,由于rpm包之間可能存在依賴關(guān)系,在依賴關(guān)系無(wú)法滿足的情況下默認(rèn)是沒(méi)法繼續(xù)安裝的;再比如某個(gè)包已經(jīng)安裝過(guò),如果想再裝一次,也是無(wú)法繼續(xù)的。這種情況下可以通過(guò)一些參數(shù)來(lái)強(qiáng)制執(zhí)行,但是強(qiáng)制執(zhí)行的后果可能是裝的程序無(wú)法正常使用,因?yàn)樗蕾嚨陌阆到y(tǒng)并沒(méi)有提供。
安裝時(shí)常用的參數(shù)如下:
--test 測(cè)試安裝,并不真實(shí)安裝而僅僅是測(cè)試能否安裝。
--nodeps 忽略依賴關(guān)系強(qiáng)行安裝
--force 強(qiáng)制替換現(xiàn)有版本
--noscripts 僅安裝文件不執(zhí)行附加腳本
下面演示一個(gè)強(qiáng)行安裝的例子“

復(fù)制代碼
代碼如下:

[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并沒(méi)有裝,因此默認(rèn)是無(wú)法安裝的,但是通過(guò)nodeps可以強(qiáng)制安裝,而LWP::UserAgent可以通過(guò)cpan去后續(xù)安裝。也就是說(shuō),如果你明白你在做什么,那么強(qiáng)制安裝并不可怕。
需要注意的是,rpm包的安裝和卸載都需要在系統(tǒng)的rpm數(shù)據(jù)庫(kù)里保存信息,因此需要root權(quán)限。

RPM的查詢功能
接著介紹rpm的查詢功能,查詢是我們最常用的功能,例如查詢一個(gè)包里包含哪些文件、一個(gè)文件屬于哪個(gè)包、以及包之間的依賴關(guān)系等等。
rpm的-q參數(shù)是用來(lái)進(jìn)行查詢的,需要明確的是rpm既可以對(duì)安裝在系統(tǒng)上的包進(jìn)行查詢,也可以對(duì)一個(gè)未安裝的rpm包進(jìn)行查詢。當(dāng)一個(gè)rpm包安裝到系統(tǒng)上之后,安裝信息通常會(huì)保存在本地的/var/lib/rpm/目錄下,數(shù)據(jù)會(huì)以berkeley DB的方式保存。查看/var/lib/rpm/Packages文件的類型可以驗(yàn)證這一點(diǎn)。

復(fù)制代碼
代碼如下:

[leconte@localhost rpm]$ file /var/lib/rpm/Packages
/var/lib/rpm/Packages: Berkeley DB (Hash, version 8, native byte-order)

這種情況下的查詢其實(shí)就是對(duì)bdb的讀訪問(wèn)。而對(duì)一個(gè)未安裝的rpm包進(jìn)行查詢,則是通過(guò)解讀rpm包本身而獲取信息,這一點(diǎn)是首先需要明確的。
下面我就簡(jiǎn)單羅列一下rpm最常用的幾個(gè)查詢功能
1.rpm -qa 用來(lái)查詢系統(tǒng)安裝的所有包,a代表all
2.rpm -ql [包名] 用來(lái)查詢某個(gè)包里的文件列表,例如查詢包passwd里包含的內(nèi)容

復(fù)制代碼
代碼如下:

[leconte@localhost rpm]$ rpm -ql passwd
/etc/pam.d/passwd
/usr/bin/passwd
/usr/share/man/man1/passwd.1.gz

3.rpm -qi [包名] 用來(lái)查詢包信息,其中包含包的介紹,作者,打包日期等重要信息。
4.rpm -qf [文件名] 用來(lái)查詢一個(gè)文件所屬的rpm包,例如:

復(fù)制代碼
代碼如下:

[leconte@localhost rpm]$ rpm -qf /etc/passwd
setup-2.5.58-4.el5

系統(tǒng)配置文件/etc/passwd是屬于setup這個(gè)包的。
5.rpm -qV [包名] 用來(lái)驗(yàn)證某個(gè)包中安裝的各文件的狀態(tài),如果當(dāng)前文件的大小、md5和安裝時(shí)數(shù)據(jù)庫(kù)里保存的信息不一致,該命令則會(huì)將不一致的文件列出來(lái)。該命令對(duì)于系統(tǒng)出問(wèn)題的情況下的故障排查很有幫助。
上面是幾個(gè)最常用的查詢命令,都是針對(duì)查詢系統(tǒng)rpm包情況的。如果要查詢未安裝的rpm包則只需要加上p參數(shù)和包路徑即可。例如查詢包perl-Git-1.5.5.6-4.el5.i386.rpm的信息:

復(fù)制代碼
代碼如下:

[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時(shí)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時(shí)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包的依賴關(guān)系
rpm包之間會(huì)維持依賴關(guān)系,這是包管理系統(tǒng)的特色。我們都經(jīng)歷過(guò)安裝一個(gè)包而因?yàn)橐蕾嚾笔Фb不上的情況。后來(lái)yum的出現(xiàn)能一定程度解決這個(gè)問(wèn)題,但我們?nèi)匀挥斜匾私鈘pm依賴關(guān)系背后的細(xì)節(jié)。
自己打過(guò)rpm包的人都知道,在包的spec配置文件往往要明確寫出此包所依賴的包名或文件名,同時(shí)也可能需要明確寫出此包所提供的內(nèi)容。這個(gè)內(nèi)容可能是動(dòng)態(tài)庫(kù)也可能是其他一些名字,并不一定是文件名。各個(gè)包之間正是依靠這些內(nèi)容來(lái)建立依賴關(guān)系的,每個(gè)包都提供一些內(nèi)容同時(shí)依賴一些別的內(nèi)容,整個(gè)系統(tǒng)就在這樣一種相互依賴中形成了。
在看具體的例子之前先介紹幾個(gè)指令:
rpm -qR [包名] 可以用來(lái)查詢指定包所依賴的內(nèi)容
rpm -q –provides [包名] 可以用來(lái)查詢指定包所提供的內(nèi)容
rpm -q –whatprovides [內(nèi)容] 可以用來(lái)查詢哪個(gè)包提供了指定內(nèi)容
rpm -q –whatrequires [內(nèi)容] 可以用來(lái)查看哪些包依賴于指定內(nèi)容
例如我們以time這個(gè)包為例進(jìn)行查詢,結(jié)果如下:

復(fù)制代碼
代碼如下:

[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) lt;= 3.0.4-1
rpmlib(PayloadFilesHavePrefix) lt;= 4.0-1
rtld(GNU_HASH)

可見,time這個(gè)包如果要安裝,上述內(nèi)容必須已經(jīng)存在,否則將會(huì)提示依賴缺失而無(wú)法安裝。我們以列表中的/bin/sh為例進(jìn)行反查,可以看到系統(tǒng)中哪個(gè)包提供了/bin/sh

復(fù)制代碼
代碼如下:

[leconte@localhost soft]$ rpm -q --whatprovides "/bin/sh"
bash-3.2-24.el5

很明顯,bash這個(gè)包提供了/bin/sh,正是由于bash的安裝才滿足了time的安裝需求。
time依賴于bash等包,同時(shí)它也提供了一些內(nèi)容,有可能被別的包依賴:

復(fù)制代碼
代碼如下:

[leconte@localhost soft]$ rpm -q --provides time
time = 1.7-27.2.2
[leconte@localhost soft]$ rpm -q --whatrequires 'time'
no package requires time

不幸的是系統(tǒng)中并沒(méi)有包依賴于time,因?yàn)樗旧韺儆谳^上層的包。
對(duì)于一些底層內(nèi)容就會(huì)有很多包依賴它,例如之前碰到的/bin/sh:

復(fù)制代碼
代碼如下:

[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行
由于篇幅所限就不全列舉出來(lái)了,這種依賴關(guān)系應(yīng)該可以一目了然了。
和上節(jié)類似,rpm -qR和rpm -q –provides這兩個(gè)查詢指令同樣可以加上-p參數(shù)應(yīng)用到一個(gè)未安裝的rpm包,例如

復(fù)制代碼
代碼如下:

[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這個(gè)rpm包提供了動(dòng)態(tài)庫(kù)libenca.so.0和enca本身。
通過(guò)使用本節(jié)這四條依賴關(guān)系查詢指令基本可以了解到系統(tǒng)上眾多rpm包之間的耦合關(guān)系,明確了這一點(diǎn),我們對(duì)rpm的理解也就更深了一步。


RPM包的卸載和升級(jí)
rpm包的卸載和升級(jí)的指令如下:
rpm -e [包名] 用來(lái)卸載一個(gè)rpm包
rpm -U [包文件] 用來(lái)升級(jí)一個(gè)現(xiàn)有的rpm
需要注意的是,如果要卸載的rpm包中的內(nèi)容被別的rpm包依賴,那么則無(wú)法卸載,例如

復(fù)制代碼
代碼如下:

[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等包依賴而無(wú)法單獨(dú)卸載,php-pdo和php-common可以利用上節(jié)介紹過(guò)的依賴關(guān)系查詢指令查到:

復(fù)制代碼
代碼如下:

[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忽略依賴關(guān)系限制,但是這樣造成的后果就是php-pdo等包將無(wú)法正常使用,因此這種方式一般不推薦。
rpm包的升級(jí)指的是rpm包的版本升級(jí),這種情況下實(shí)際內(nèi)部執(zhí)行的動(dòng)作分兩步,即先安裝新版本然后卸載老版本。此外,rpm也可以進(jìn)行包的降級(jí),只需要指定–oldpackages參數(shù)即可。
值得注意的是在卸載和升級(jí)的過(guò)程中,包中的配置文件會(huì)被妥善處理,rpm會(huì)根據(jù)一系列規(guī)則決定配置文件是否保留,即使被替換,舊的配置文件也會(huì)被重命名后保存起來(lái),你之前對(duì)配置文件做過(guò)的修改不會(huì)因?yàn)閞pm包的升級(jí)而丟失。

標(biāo)簽:克拉瑪依 商丘 玉樹 武威 天水 石家莊 許昌 棗莊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《全面講解RedHat系Linux中的rpm包管理系統(tǒng)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    循化| 枣强县| 夏津县| 营山县| 嘉义市| 清苑县| 图木舒克市| 涞源县| 贡觉县| 田东县| 二手房| 荥阳市| 祥云县| 阿城市| 安远县| 旬阳县| 安图县| 洪泽县| 南城县| 榆树市| 锦州市| 北票市| 承德市| 于都县| 收藏| 佛冈县| 利辛县| 安吉县| 五原县| 彭山县| 乾安县| 湟中县| 博兴县| 历史| 承德县| 宜黄县| 满城县| 孟津县| 宜春市| 民县| 永康市|