[Linux]rpm,dpkg安裝,查詢,解除安裝,升級

大搜車-自娛發表於2012-04-06
在 GNU/Linux( 以下簡稱 Linux) 作業系統中,RPM 和 DPKG 為最常見的兩類軟體包管理工具,他們分別應用於基於 RPM 軟體包的 Linux 發行版本和 DEB 軟體包的 Linux 發行版本。軟體包管理工具的作用是提供在作業系統中安裝,升級,解除安裝需要的軟體的方法,並提供對系統中所有軟體狀態資訊的查詢。

RPM 全稱為 Redhat Package Manager,最早由 Red Hat 公司制定實施,隨後被 GNU 開源作業系統接受併成為很多 Linux 系統 (RHEL) 的既定軟體標準。與 RPM 進行競爭的是基於 Debian 作業系統 (UBUNTU) 的 DEB 軟體包管理工具- DPKG,全稱為 Debian Package,功能方面與 RPM 相似。二者之具體比較不在本文範圍之內。

回頁首

RPM 包的安裝 / 升級 / 查詢 / 解除安裝

一個 RPM 包包含了已壓縮的軟體檔案集以及該軟體的內容資訊(在標頭檔案中儲存),通常表現為以 .rpm 副檔名結尾的檔案,例如 package.rpm 。對其操作,需要使用 rpm 命令。下面介紹 rpm 工具的引數和使用方法,並以 IBM Lotus Notes 在 RHEL 5.2 安裝為例做具體說明。

RPM 命令常用引數

RPM 的常規使用方法為 rpm -? package.rpm,其中 -? 為操作引數 ( 更多資訊,請查閱幫助 $man rpm):

-q 在系統中查詢軟體或查詢指定 rpm 包的內容資訊 -i 在系統中安裝軟體 -U 在系統中升級軟體 -e 在系統中解除安裝軟體 -h 用 #(hash) 符顯示 rpm 安裝過程 -v 詳述安裝過程 -p 表明對 RPM 包進行查詢,通常和其它引數同時使用,如: -qlp 查詢某個 RPM 包中的所有檔案列表 -qip 查詢某個 RPM 包的內容資訊

RPM 命令引數使用方法

以上引數有些需要組合使用,比如說 rpm -h package.rpm 是沒有意義的,但 rpm -ih package.rpm 即表示安裝 package 並用 # 符顯示安裝進度。


安裝 RPM 包
# rpm -ivh package.rpm


升級 RPM 包命令
# rpm -Uvh package.rpm


解除安裝 RPM 包命令
# rpm -ev package


查詢 RPM 包中包含的檔案列表命令
# rpm -qlp package


查詢 RPM 包中包含的檔案列表命令
# rpm -qlp package


查詢 RPM 包中包含的內容資訊命令
# rpm -qip package


查詢系統中所有已安裝 RPM 包
# rpm -qa


RPM 包管理示例

以下步驟描述了一個普通使用者安裝 IBM Lotus Notes V85 ( 以下簡稱 Notes) 的典型操作過程。 Notes 的 RPM 包名為 ibm_lotus_notes-8.5.i586.rpm 。

首先查詢是否該軟體是否已經在系統中存在
# rpm -qa | grep ibm_lotus_notes


如果返回資訊為空那麼說明該軟體還未被安裝。

查詢 Notes 軟體包內容:
# 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%]

升級 Notes:

若今後需要基於該版本升級至更高版本的 Notes( 縫 .0 - ibm_lotus_notes-9.0.i586.rpm),則使用 -U 引數:

# rpm -Uvh ibm_lotus_notes-8.5.i586.rpm


在該步驟中如果使用 -i 則系統通常會報檔案衝突錯誤,無法正常安裝。

解除安裝 Notes

注意解除安裝軟體使用軟體名稱,而不是包檔名:

# rpm -ev ibm_lotus_notes


回頁首

DEB 包的安裝 / 升級 / 查詢 / 解除安裝

一個 DEB 包包含了已壓縮的軟體檔案集以及該軟體的內容資訊(在標頭檔案中儲存),通常表現為以 .deb 副檔名結尾的檔案,例如 package.deb 。對其操作,需要使用 dpkg 命令。下面介紹 dpkg 工具的引數和使用方法,並以 IBM Lotus Notes 在 UBUNTU 904 安裝為例做具體說明。

DPKG 命令常用引數

DPKG 的常規使用方法為 dpkg -? Package(.rpm), 其中 -? 為安裝引數 ( 更多資訊,請查閱幫助 $man rpm):

-l 在系統中查詢軟體內容資訊 --info 在系統中查詢軟體或查詢指定 rpm 包的內容資訊 -i 在系統中安裝 / 升級軟體 -r 在系統中解除安裝軟體 , 不刪除配置檔案 -P 在系統中解除安裝軟體以及其配置檔案

DPKG 命令引數使用方法


安裝 DEB 包命令
$ sudo dpkg -i package.deb


升級 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 包中包含的內容資訊命令
$ dpkg --info package.deb


查詢系統中所有已安裝 DEB 包
$ dpkg -l package


DEB 包管理示例

以下步驟描述了一個普通使用者安裝 IBM Lotus Notes V85 ( 以下簡稱 Notes) 的典型操作過程。 Notes 的 DEB 包名為 ibm_lotus_notes-8.5.i586.deb.

首先查詢是否該軟體是否已經在系統中存在
$ dpkg -l ibm-lotus-*


如果系統中從未安裝過 Lotus 產品,那麼返回資訊為 :
No pakcages found matching ibm-lotus-*


如果系統安裝過 Lotus 產品,但已被刪除,那麼返回資訊為 :
pn ibm-lotus-notes none (no description available)

查詢 Notes 軟體包內容:
$ 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) ...

升級 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


回頁首

軟體包依賴性關係

由於開源的多型性,Linux 作業系統中的軟體之間的依賴性關係處理一直令使用者感到頭疼。如果 package_a 依賴於 package_b,那麼在一個沒有安裝 package_b 的系統中,package_a 是不被系統推薦安裝的,強制安裝很可能會導致軟體無法正常工作。基於以上 package_a 和 package_b 的關係,在一個乾淨的系統中 ( 未安裝 package_a 或 package_b),欲安裝 package_a,錯誤通常會表現為:


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


查詢軟體包依賴關係


查詢 RPM 包的依賴關係,使用 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 之前安裝於系統中。


查詢 DEB 包的依賴關係,可解讀 dpkg --info 結果中的 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 之前安裝於系統中。

所以正確的安裝方法如下節所示。

安裝方法


對於 package_a,正確的安裝方法應該是:
##RPM # rpm -ivh package_b.rpm # rpm -ivh package_a.rpm ##DEB $ sudo dpkg -i package_b.deb $ sudo dpkg -i package_a.deb


巢狀的依賴關係

如上示例為最理想的依賴關係,實際應用中往往最令使用者頭疼的是 package_a 依賴於 package_b/c/d/e/f 等多個包 , 而 package_b/c/d/e/f 等包又依賴於 package_b1,b2,b3/c1,c2/d1,d2/e1,e2/f1,f2 等等 ... ... 為保證軟體的正常使用,必須找到所有依賴包以及子依賴包並且安裝。過多的依賴關係大大降低了 Linux 軟體安裝的使用者友好性。所以針對此類問題,使用了更高階的包管理策略去解決 - Yum/APT 。

回頁首

更友好的包管理軟體 - YUM

YUM

YUM 基於 RPM 包管理工具,能夠從指定的源空間(伺服器,本地目錄等)自動下載目標 RPM 包並且安裝,可以自動處理依賴性關係並進行下載、安裝,無須繁瑣地手動下載、安裝每一個需要的依賴包。此外,YUM 的另一個功能是進行系統中所有軟體的升級。如上所述,YUM 的 RPM 包來源於源空間,在 RHEL 中由 /etc/yum.repos.d/ 目錄中的 .repo 檔案配置指定,如 rhel-debuginfo.repo 的內容:


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 的系統配置檔案位於 /etc/yum.conf,內容如:
[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 表明安裝時不進行 gpg 驗證,exclued=firefox gftp 表明進行系統全軟體升級時不升級 firefox 和 gftp 。

YUM 常用命令


安裝指定軟體 :
# yum -y install package-name


列出系統中已安裝軟體
# yum list


列出系統中可升級的所有軟體
# yum check-update


升級系統中可升級的所有軟體
# yum update


升級指定軟體
# yum update package-name


在升級過程中接受所有互動問答
# yum -y update


解除安裝指定軟體
# yum remove package-name


更多有關 YUM 的資訊,請查閱 http://fedoraproject.org/wiki/Tools/yum 。

回頁首

更友好的包管理軟體 - APT

APT

APT 的全稱為 Advanced Packaging Tools 。與 YUM 對應,它最早被設計成 DPKG 的前端軟體,現在通過 apt-rpm 也支援 rpm 管理。而本節本節將介紹 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


注意每次手動修改上述檔案後,需要使用 sudo apt-get update 來更新系統的源使新的源資料被當前系統識別。

UBUNTU 中 APT 的配置檔案位於 /etc/apt/apt.conf.d,其中的多個配置檔案依功能分類。

APT 常用命令


更新源索引
$ sudo apt-get update


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


下載指定軟體的原始檔
$ sudo apt-get source package-name


將系統中所有軟體升級到最新版本
$ sudo apt-get upgrade


將作業系統連同所有軟體升級到最新版本
$ sudo apt-get dist-upgrade


解除安裝指定軟體
$ sudo apt-get remove package-name


更多有關 APT 的資訊,請查閱 http://www.debian.org/doc/manuals/apt-howto/index.en.html 。

回頁首

RPM 與 DEB 的相容 - Alien

Alien 工具可以將 RPM 軟體包轉換成 DEB 軟體包,或把 DEB 軟體包轉換成 RPM 軟體包,以此適應相容性的需要。注意首先請在系統中安裝 alien 。


在 UBUNTU 中使用 alien 將 rpm 轉換為 deb 並安裝 :
$ sudo alien -d package.rpm $ sudo dpkg -i package.deb


在 RHEL 中使用 alien 將 deb 轉換為 rpm 並安裝 :
# alien -r package.deb # rpm -ivh package.rpm


更多 alien 相關資訊請查閱 http://linux.die.net/man/1/alien

回頁首

總結

本文以 RHEL 5.2 和 Ubuntu 904 為例,基於命令列操作,介紹了 Linux 系統中兩大常用軟體包管理工具- RPM 與 DPKG 。首先從最底端的 rpm/dpkg 命令操作開始列舉了它們的基本使用方法,隨後指出了軟體的依賴關係以及由此帶來的問題,並對此問題的解決方案,也是最流行的 YUM 與 APT 前端軟體管理系統進行了操作介紹。最後本文簡要說明了當前 RPM/DEB 的相容性問題的常規解決方法。

回頁首

常見問題列表

可以手動強制不進行 RPM/DEB 的依賴性關係檢查嗎?

RPM

可以。使用 --nodeps 輔助引數,則安裝過程將不理會依賴性關係限制,強制安裝目標包,如:

# rpm -i --nodeps package_a.rpmDEB

可以。使用— force-depends 輔助引數,如:

$ sudo dpkg -i --force-depends package_a.deb

RPM 中的 --force 是幹什麼用的?

RPM 中的預設安裝規則是不允許同一個包多次安裝的,也不允許降級安裝。使用 --force 輔助引數將不考慮以上因素,強制安裝 RPM 包。但是,--force 無法強制安裝一個不滿足系統依賴性關係的包 ( 此時需要用到 --nodeps 引數 ) 。使用方法如:

# rpm -i --force package_a.rpm

RPM/DPKG 支援遠端安裝嗎?

RPM

是。 RPM 支援 HTTP 和 FTP 協議,如:

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

最新的基於 DEB 包的系統中,遠端安裝通常被更先進的 APT 代替。

可以從 RPM/DPKG 中抽取個別檔案嗎?

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( 目標目錄 )

RPM/DPKG 提供包安裝成功的驗證機制嗎?

RPM

是。可以使用 -V 引數進行驗證。

DPKG

Debian 系統通常使用 debsums 工具引數進行驗證。

RPM/DPKG 提供包安全簽名嗎?

RPM

是。可以使用 --import 匯入與軟體同時釋出的 GPG KEY, 接著使用 -K 命令來驗證包的安全性,如:

# 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 OKDPKG

DPKG 不提供原生的 Key 驗證機制。可以使用 debsigs 和 debsigs-verify,詳情請見:http://man.ddvip.com/os/debiansecuring-howto/ch7.zh-cn.html

如果 RPM 的底層資料庫損壞,RPM 還能使用嗎?

RPM

如果底層資料庫損壞,RPM 將無法正常使用。此時最常用的解決方法是重構資料庫:

# rm -f /var/lib/rpm/__* ; rpm -vv --rebuilddbRPM

DPKG 本身不提供底層資料庫恢復機制。它的資料庫以檔案形式儲存在 /var/lib/dpkg 目錄中。及時地備份這個目錄是最好的預防資料庫損壞措施。

可以查詢系統中已經安裝的某個檔案屬於哪個 RPM 包嗎?

RPM

可以。使用 -qf 引數 , 如在安裝了 Notes8.5 的系統中:

# rpm -qf /opt/ibm/lotus/notes/notes 返回資訊 : Ibm_lotus_notes-8.5-20081211.1920DPKG

可以。使用— search 引數 , 如在安裝了 Notes8.5 的系統中:

$ dpkg --search /opt/ibm/lotus/notes/notes 返回資訊 : ibm-lotus-notes: /opt/ibm/lotus/notes/notes

可以查詢 RPM 包的安裝時間嗎?

RPM

可以。可使用 --last 查詢。如:

rpm -qa --last 返回資訊 : 系統中所有軟體的安裝時間。DPKG

DPKG 不提供直接的查詢引數,但是可以用過查詢 dpkg 的日誌檔案實現這個功能。如:

cat /var/log/dpkg.log | grep "\ install\ "

參考資料

在 Linux System Administration and Configuration(yolinux.com, 日期不祥)中學習詳盡的 Linux 常用的配置管理工具。

快速查閱最常用 rpm/dpkg 命令,請參考 Linux Software Management(摘自 Kurt Seifried 的 Linux Administrator's Security Guide 第 14 章, 2002 年 10 月)。

瞭解更全面的 APT 資訊,請參考 APT HOWTO (Debian 系統手冊, 2005 年 8 月)。

瞭解更全面的 YUM 資訊,請參考 Fedora Tools/yum(federaproject.org 的 Wiki, 2009 年 7 月)。

參考 RPMAlienHowto(Ubuntu 官方文件, 2009 年 4 月)進行 Alien 在 Ubuntu 上的安裝和常規使用。

在 developerWorks Linux 專區 尋找為 Linux 開發人員(包括 Linux 新手入門)準備的更多參考資料,查閱我們 最受歡迎的文章和教程。

在 developerWorks 上查閱所有 Linux 技巧 和 Linux 教程。

此文為引用文,尊重作者,並附原文地址:http://hi.baidu.com/%D2%BB%C9%FA%D2%BB%D3%F6/blog/item/1a48bb2e07b2e13bd52af1dc.html

相關文章