Linux 平臺(tái)上的軟件包管理

RPM/DPKG 兩大陣營(yíng)簡(jiǎn)介
在 GNU/Linux( 以下簡(jiǎn)稱 Linux) 操作系統(tǒng)中,RPM 和 DPKG 為最常見的兩類軟件包管理工具,他們分別應(yīng)用于基于 RPM 軟件包的 Linux 發(fā)行版本和 DEB 軟件包的 Linux 發(fā)行版本。軟件包管理工具的作用是提供在操作系統(tǒng)中安裝,升級(jí),卸載需要的軟件的方法,并提供對(duì)系統(tǒng)中所有軟件狀態(tài)信息的查詢。
RPM 全稱為 Redhat Package Manager,最早由 Red Hat 公司制定實(shí)施,隨后被 GNU 開源操作系統(tǒng)接受并成為很多 Linux 系統(tǒng) (RHEL) 的既定軟件標(biāo)準(zhǔn)。與 RPM 進(jìn)行競(jìng)爭(zhēng)的是基于 Debian 操作系統(tǒng) (UBUNTU) 的 DEB 軟件包管理工具- DPKG,全稱為 Debian Package,功能方面與 RPM 相似。二者之具體比較不在本文范圍之內(nèi)。

RPM 包的安裝 / 升級(jí) / 查詢 / 卸載
一個(gè) RPM 包包含了已壓縮的軟件文件集以及該軟件的內(nèi)容信息(在頭文件中保存),通常表現(xiàn)為以 .rpm 擴(kuò)展名結(jié)尾的文件,例如 package.rpm 。對(duì)其操作,需要使用 rpm 命令。下面介紹 rpm 工具的參數(shù)和使用方法,并以 IBM Lotus Notes 在 RHEL 5.2 安裝為例做具體說明。
RPM 命令常用參數(shù)
RPM 的常規(guī)使用方法為 rpm -? package.rpm,其中 -? 為操作參數(shù) ( 更多信息,請(qǐng)查閱幫助 $man rpm):
-q 在系統(tǒng)中查詢軟件或查詢指定 rpm 包的內(nèi)容信息
-i 在系統(tǒng)中安裝軟件
-U 在系統(tǒng)中升級(jí)軟件
-e 在系統(tǒng)中卸載軟件
-h 用 #(hash) 符顯示 rpm 安裝過程
-v 詳述安裝過程
-p 表明對(duì) RPM 包進(jìn)行查詢,通常和其它參數(shù)同時(shí)使用,如:
-qlp 查詢某個(gè) RPM 包中的所有文件列表
-qip 查詢某個(gè) RPM 包的內(nèi)容信息

RPM 命令參數(shù)使用方法
以上參數(shù)有些需要組合使用,比如說 rpm -h package.rpm 是沒有意義的,但 rpm -ih package.rpm 即表示安裝 package 并用 # 符顯示安裝進(jìn)度。
安裝 RPM 包

rpm -ivh package.rpm

升級(jí) RPM 包命令

rpm -Uvh package.rpm

卸載 RPM 包命令

rpm -ev package

查詢 RPM 包中包含的文件列表命令

rpm -qlp package

查詢 RPM 包中包含的文件列表命令

rpm -qlp package

查詢 RPM 包中包含的內(nèi)容信息命令

rpm -qip package

查詢系統(tǒng)中所有已安裝 RPM 包

rpm -qa

RPM 包管理示例
以下步驟描述了一個(gè)普通用戶安裝 IBM Lotus Notes V85 ( 以下簡(jiǎn)稱 Notes) 的典型操作過程。 Notes 的 RPM 包名為 ibm_lotus_notes-8.5.i586.rpm 。
首先查詢是否該軟件是否已經(jīng)在系統(tǒng)中存在# rpm -qa | grep ibm_lotus_notes

如果返回信息為空那么說明該軟件還未被安裝。

查詢 Notes 軟件包內(nèi)容:# rpm -qip ibm_lotus_notes-8.5.i586.rpm Name : ibm_lotus_notes Relocations: /opt/ibm/lotus/notes Version : 8.5 Vendor: IBM Release : 20081211.1925 Build Date: Sat 13 Dec 2008 09:38:55 AM CST Install Date: (not installed) Build Host: dithers.notesdev.ibm.com Group : Applications/Office Source RPM: ibm_lotus_notes-8.5-20081211.1925.src.rpm Size : 603779427 License: Commercial Signature : DSA/SHA1, Sat 13 Dec 2008 09:43:02 AM CST, Key ID 314c8c6534f9ae75 Summary : IBM Lotus Notes Description : IBM Lotus Notes software provides a robust ...

安裝 Notes:# rpm -ivh ibm_lotus_notes-8.5.i586.rpm

返回信息 :
Preparing... ########################################### [100%] 1:ibm_lotus_notes ########################################### [100%]

升級(jí) Notes:若今后需要基于該版本升級(jí)至更高版本的 Notes( 縫 .0 - ibm_lotus_notes-9.0.i586.rpm),則使用 -U 參數(shù):

rpm -Uvh ibm_lotus_notes-8.5.i586.rpm

在該步驟中如果使用 -i 則系統(tǒng)通常會(huì)報(bào)文件沖突錯(cuò)誤,無法正常安裝。

卸載 Notes注意卸載軟件使用軟件名稱,而不是包文件名:

rpm -ev ibm_lotus_notes

回頁首
DEB 包的安裝 / 升級(jí) / 查詢 / 卸載
一個(gè) DEB 包包含了已壓縮的軟件文件集以及該軟件的內(nèi)容信息(在頭文件中保存),通常表現(xiàn)為以 .deb 擴(kuò)展名結(jié)尾的文件,例如 package.deb 。對(duì)其操作,需要使用 dpkg 命令。下面介紹 dpkg 工具的參數(shù)和使用方法,并以 IBM Lotus Notes 在 UBUNTU 904 安裝為例做具體說明。
DPKG 命令常用參數(shù)
DPKG 的常規(guī)使用方法為 dpkg -? Package(.rpm), 其中 -? 為安裝參數(shù) ( 更多信息,請(qǐng)查閱幫助 $man rpm):
-l 在系統(tǒng)中查詢軟件內(nèi)容信息
--info 在系統(tǒng)中查詢軟件或查詢指定 rpm 包的內(nèi)容信息
-i 在系統(tǒng)中安裝 / 升級(jí)軟件
-r 在系統(tǒng)中卸載軟件 , 不刪除配置文件
-P 在系統(tǒng)中卸載軟件以及其配置文件

DPKG 命令參數(shù)使用方法
安裝 DEB 包命令
$ sudo dpkg -i package.deb

升級(jí) DEB 包命令
$ sudo dpkg -i package.deb ( 和安裝命令相同)

卸載 DEB 包命令
$ sudo dpkg -r package.deb # 不卸載配置文件或 $ sudo dpkg -P package.deb # 卸載配置文件

查詢 DEB 包中包含的文件列表命令
$ sudo dpkg-deb -c package.deb

查詢 DEB 包中包含的內(nèi)容信息命令
$ dpkg --info package.deb

查詢系統(tǒng)中所有已安裝 DEB 包
$ dpkg -l package

DEB 包管理示例
以下步驟描述了一個(gè)普通用戶安裝 IBM Lotus Notes V85 ( 以下簡(jiǎn)稱 Notes) 的典型操作過程。 Notes 的 DEB 包名為 ibm_lotus_notes-8.5.i586.deb.
首先查詢是否該軟件是否已經(jīng)在系統(tǒng)中存在$ dpkg -l ibm-lotus-*

如果系統(tǒng)中從未安裝過 Lotus 產(chǎn)品,那么返回信息為 :
No pakcages found matching ibm-lotus-*

如果系統(tǒng)安裝過 Lotus 產(chǎn)品,但已被刪除,那么返回信息為 :
pn ibm-lotus-notes none (no description available)

查詢 Notes 軟件包內(nèi)容:$ dpkg --info ibm_lotus_notes-8.5-i586.deb

返回信息 :
new debian package, version 2.0. size 335012296 bytes: control archive= 231821 bytes. ... Package: ibm-lotus-notes Version: 8.5-20081211.1925 Section: IBM Priority: extra Architecture: i386 Installed-Size: 619444 Maintainer: IBM Lotus Product Description: IBM Lotus Notes IBM Lotus Notes software provides a robust ... ...

安裝 Notes:$ sudo dpkg -i ibm_lotus_notes-8.5.i586.deb

返回信息 :
(Reading database ... 151150 files and directories currently installed.) Preparing to replace ibm-lotus-notes 8.5-20081211.1925 (using ibm-lotus-notes-higher-version.i586.deb) ... Unpacking replacement ibm-lotus-notes ... Setting up ibm-lotus-notes (higher-version) ...

升級(jí) Notes:$ sudo dpkg -i ibm_lotus_notes-8.5.i586.deb

返回信息 :
(Reading database ... 151150 files and directories currently installed.) Preparing to replace ibm-lotus-notes 8.5-20081211.1925 (using ibm-lotus-notes-higher-version.i586.deb) ... Unpacking replacement ibm-lotus-notes ... Setting up ibm-lotus-notes (higher-version) ...

卸載 Notes注意卸載軟件使用軟件名稱,而不是包文件名:
$ sudo dpkg -P ibm-lotus-notes

回頁首
軟件包依賴性關(guān)系
由于開源的多態(tài)性,Linux 操作系統(tǒng)中的軟件之間的依賴性關(guān)系處理一直令用戶感到頭疼。如果 package_a 依賴于 package_b,那么在一個(gè)沒有安裝 package_b 的系統(tǒng)中,package_a 是不被系統(tǒng)推薦安裝的,強(qiáng)制安裝很可能會(huì)導(dǎo)致軟件無法正常工作?;谝陨?package_a 和 package_b 的關(guān)系,在一個(gè)干凈的系統(tǒng)中 ( 未安裝 package_a 或 package_b),欲安裝 package_a,錯(cuò)誤通常會(huì)表現(xiàn)為:
RHEL 5.2

rpm -ivh package_a.rpm error: Failed dependencies: pacakge_b = version info is needed by package_a

Ubuntu 904
$ sudo dpkg -i package_a.deb dpkg: regarding package_a.deb containing package, pre-dependency problm: package_a pre-depends on package_b (version info) dpkg: error processing package_a.deb (--install): pre-dependency problem - not installing package_a Errors were encountered while processing: package_a.deb

查詢軟件包依賴關(guān)系
查詢 RPM 包的依賴關(guān)系,使用 rpm -qRp:

rpm -qRp package_a.rpm package_b = version_info 或 package_b >= version_info 或 package_b <= version_info

表明 package_a.rpm 依賴于 version_info 版的 package_b,或者任何高于并包括 version_info 版的 package_b,亦或低于或包括 version_info 版的 package_b 。所以 package_b.rpm 必須在 package_a 之前安裝于系統(tǒng)中。
查詢 DEB 包的依賴關(guān)系,可解讀 dpkg --info 結(jié)果中的 Pre-Depends 字段:
$ dpkg --info package_a.deb Pre-depends: package_b (= version_info) Depends: package_b (= version_info) 或 Pre-depends: package_b (>= version_info) Depends: package_b (>= version_info) 或 Pre-depends: package_b (<= version_info) Depends: package_b (<= version_info)

表明 package_a.deb 依賴于 version_info 版的 package_b 或者任何高于并包括 version_info 版的 package_b 亦或低于或包括 version_info 版的 package_b. 所以 package_b.deb 必須在 package_a 之前安裝于系統(tǒng)中。
所以正確的安裝方法如下節(jié)所示。
安裝方法
對(duì)于 package_a,正確的安裝方法應(yīng)該是:

RPM # rpm -ivh package_b.rpm # rpm -ivh package_a.rpm ##DEB $ sudo dpkg -i package_b.deb $ sudo dpkg -i package_a.deb

嵌套的依賴關(guān)系
如上示例為最理想的依賴關(guān)系,實(shí)際應(yīng)用中往往最令用戶頭疼的是 package_a 依賴于 package_b/c/d/e/f 等多個(gè)包 , 而 package_b/c/d/e/f 等包又依賴于 package_b1,b2,b3/c1,c2/d1,d2/e1,e2/f1,f2 等等 ... ... 為保證軟件的正常使用,必須找到所有依賴包以及子依賴包并且安裝。過多的依賴關(guān)系大大降低了 Linux 軟件安裝的用戶友好性。所以針對(duì)此類問題,使用了更高級(jí)的包管理策略去解決 - Yum/APT 。

更友好的包管理軟件 - YUM
YUM
YUM 基于 RPM 包管理工具,能夠從指定的源空間(服務(wù)器,本地目錄等)自動(dòng)下載目標(biāo) RPM 包并且安裝,可以自動(dòng)處理依賴性關(guān)系并進(jìn)行下載、安裝,無須繁瑣地手動(dòng)下載、安裝每一個(gè)需要的依賴包。此外,YUM 的另一個(gè)功能是進(jìn)行系統(tǒng)中所有軟件的升級(jí)。如上所述,YUM 的 RPM 包來源于源空間,在 RHEL 中由 /etc/yum.repos.d/ 目錄中的 .repo 文件配置指定,如 rhel-debuginfo.repo 的內(nèi)容:
rhel-debuginfo.repo
[rhel-debuginfo] name=Red Hat Enterprise Linux 5Client - i386 - Debug baseurl=ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Client/en/os/i386/Debuginfo/ enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

YUM 的系統(tǒng)配置文件位于 /etc/yum.conf,內(nèi)容如:
[main] cachedir=/var/cache/yum keepcache=1 debuglevel=2 pkgpolicy=newest logfile=/var/log/yum.log distroverpkg=redhat-release tolerant=1 exactarch=1 obsoletes=1 gpgcheck=1 plugins=1 exclude= firefox gftp

配置文件用來定義用戶期望的 yum 行為,比如,gpgcheck? 表明安裝時(shí)不進(jìn)行 gpg 驗(yàn)證,exclued=firefox gftp 表明進(jìn)行系統(tǒng)全軟件升級(jí)時(shí)不升級(jí) firefox 和 gftp 。
YUM 常用命令
安裝指定軟件 :

yum -y install package-name

列出系統(tǒng)中已安裝軟件

yum list

列出系統(tǒng)中可升級(jí)的所有軟件

yum check-update

升級(jí)系統(tǒng)中可升級(jí)的所有軟件

yum update

升級(jí)指定軟件

yum update package-name

在升級(jí)過程中接受所有互動(dòng)問答

yum -y update

卸載指定軟件

yum remove package-name

更多有關(guān) YUM 的信息,請(qǐng)查閱 http://fedoraproject.org/wiki/Tools/yum 。

更友好的包管理軟件 - APT
APT
APT 的全稱為 Advanced Packaging Tools 。與 YUM 對(duì)應(yīng),它最早被設(shè)計(jì)成 DPKG 的前端軟件,現(xiàn)在通過 apt-rpm 也支持 rpm 管理。而本節(jié)本節(jié)將介紹 APT 作為 DPKG 前端的使用。 APT 的主要包管理工具為 APT-GET,通過此工具可滿足和上述 YUM 相似的功能要求。
APT 的軟件源定義來自 /etc/apt/sources.list 文件:

See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to # newer versions of the distribution. deb http://cn.archive.ubuntu.com/ubuntu/ hardy main restricted deb-src http://cn.archive.ubuntu.com/ubuntu/ hardy main restricted

注意每次手動(dòng)修改上述文件后,需要使用 sudo apt-get update 來更新系統(tǒng)的源使新的源數(shù)據(jù)被當(dāng)前系統(tǒng)識(shí)別。
UBUNTU 中 APT 的配置文件位于 /etc/apt/apt.conf.d,其中的多個(gè)配置文件依功能分類。
APT 常用命令
更新源索引
$ sudo apt-get update

安裝指定軟件
$ sudo apt-get install package-name

下載指定軟件的源文件
$ sudo apt-get source package-name

將系統(tǒng)中所有軟件升級(jí)到最新版本
$ sudo apt-get upgrade

將操作系統(tǒng)連同所有軟件升級(jí)到最新版本
$ sudo apt-get dist-upgrade

卸載指定軟件
$ sudo apt-get remove package-name

更多有關(guān) APT 的信息,請(qǐng)查閱 http://www.debian.org/doc/manuals/apt-howto/index.en.html 。

回頁首
RPM 與 DEB 的兼容 - Alien
Alien 工具可以將 RPM 軟件包轉(zhuǎn)換成 DEB 軟件包,或把 DEB 軟件包轉(zhuǎn)換成 RPM 軟件包,以此適應(yīng)兼容性的需要。注意首先請(qǐng)?jiān)谙到y(tǒng)中安裝 alien 。
在 UBUNTU 中使用 alien 將 rpm 轉(zhuǎn)換為 deb 并安裝 :
$ sudo alien -d package.rpm $ sudo dpkg -i package.deb

在 RHEL 中使用 alien 將 deb 轉(zhuǎn)換為 rpm 并安裝 :

alien -r package.deb # rpm -ivh package.rpm

更多 alien 相關(guān)信息請(qǐng)查閱 http://linux.die.net/man/1/alien

回頁首
總結(jié)
本文以 RHEL 5.2 和 Ubuntu 904 為例,基于命令行操作,介紹了 Linux 系統(tǒng)中兩大常用軟件包管理工具- RPM 與 DPKG 。首先從最底端的 rpm/dpkg 命令操作開始列舉了它們的基本使用方法,隨后指出了軟件的依賴關(guān)系以及由此帶來的問題,并對(duì)此問題的解決方案,也是最流行的 YUM 與 APT 前端軟件管理系統(tǒng)進(jìn)行了操作介紹。最后本文簡(jiǎn)要說明了當(dāng)前 RPM/DEB 的兼容性問題的常規(guī)解決方法。

回頁首
常見問題列表
可以手動(dòng)強(qiáng)制不進(jìn)行 RPM/DEB 的依賴性關(guān)系檢查嗎?
RPM可以。使用 --nodeps 輔助參數(shù),則安裝過程將不理會(huì)依賴性關(guān)系限制,強(qiáng)制安裝目標(biāo)包,如:

rpm -i --nodeps package_a.rpm

DEB可以。使用— force-depends 輔助參數(shù),如:
$ sudo dpkg -i --force-depends package_a.deb

RPM 中的 --force 是干什么用的?
RPM 中的默認(rèn)安裝規(guī)則是不允許同一個(gè)包多次安裝的,也不允許降級(jí)安裝。使用 --force 輔助參數(shù)將不考慮以上因素,強(qiáng)制安裝 RPM 包。但是,--force 無法強(qiáng)制安裝一個(gè)不滿足系統(tǒng)依賴性關(guān)系的包 ( 此時(shí)需要用到 --nodeps 參數(shù) ) 。使用方法如:

rpm -i --force package_a.rpm

RPM/DPKG 支持遠(yuǎn)程安裝嗎?
RPM是。 RPM 支持 HTTP 和 FTP 協(xié)議,如:

rpm -Uvh ftp://user:pass@ftpserver/package.rpm

DPKG最新的基于 DEB 包的系統(tǒng)中,遠(yuǎn)程安裝通常被更先進(jìn)的 APT 代替。

可以從 RPM/DPKG 中抽取個(gè)別文件嗎?
RPM是??梢允褂?rpm2cpio 工具來提取文件:http://www.rpm.org/max-rpm/s1-rpm-miscellania-rpm2cpio.html

DPKG是??梢允褂?dpkg-deb 工具來提取文件:
$ dpkg-deb --extract ibm_lotus_notes-8.5.i586.deb $dir( 目標(biāo)目錄 )

RPM/DPKG 提供包安裝成功的驗(yàn)證機(jī)制嗎?
RPM是??梢允褂?-V 參數(shù)進(jìn)行驗(yàn)證。

DPKGDebian 系統(tǒng)通常使用 debsums 工具參數(shù)進(jìn)行驗(yàn)證。

RPM/DPKG 提供包安全簽名嗎?
RPM是??梢允褂?--import 導(dǎo)入與軟件同時(shí)發(fā)布的 GPG KEY, 接著使用 -K 命令來驗(yàn)證包的安全性,如:

rpm --import pub_ibm_lotus_notes.gpg # rpm -K ibm_lotus_notes-8.5.i586.rpm 返回信息 : ibm_lotus_notes-8.5.i586.rpm: (sha1) dsa sha1 md5 gpg OK

DPKGDPKG 不提供原生的 Key 驗(yàn)證機(jī)制??梢允褂?debsigs 和 debsigs-verify,詳情請(qǐng)見:http://man.ddvip.com/os/debiansecuring-howto/ch7.zh-cn.html

如果 RPM 的底層數(shù)據(jù)庫損壞,RPM 還能使用嗎?
RPM如果底層數(shù)據(jù)庫損壞,RPM 將無法正常使用。此時(shí)最常用的解決方法是重構(gòu)數(shù)據(jù)庫:

rm -f /var/lib/rpm/__* ; rpm -vv --rebuilddb

RPMDPKG 本身不提供底層數(shù)據(jù)庫恢復(fù)機(jī)制。它的數(shù)據(jù)庫以文件形式保存在 /var/lib/dpkg 目錄中。及時(shí)地備份這個(gè)目錄是最好的預(yù)防數(shù)據(jù)庫損壞措施。

可以查詢系統(tǒng)中已經(jīng)安裝的某個(gè)文件屬于哪個(gè) RPM 包嗎?
RPM可以。使用 -qf 參數(shù) , 如在安裝了 Notes8.5 的系統(tǒng)中:

rpm -qf /opt/ibm/lotus/notes/notes 返回信息 : Ibm_lotus_notes-8.5-20081211.1920

DPKG可以。使用— search 參數(shù) , 如在安裝了 Notes8.5 的系統(tǒng)中:
$ dpkg --search /opt/ibm/lotus/notes/notes 返回信息 : ibm-lotus-notes: /opt/ibm/lotus/notes/notes

可以查詢 RPM 包的安裝時(shí)間嗎?
RPM可以。可使用 --last 查詢。如:
rpm -qa --last 返回信息 : 系統(tǒng)中所有軟件的安裝時(shí)間。

DPKGDPKG 不提供直接的查詢參數(shù),但是可以用過查詢 dpkg 的日志文件實(shí)現(xiàn)這個(gè)功能。如:
cat /var/log/dpkg.log | grep "\ install\ "

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容