[Linux]rpm,dpkg安裝,查詢,解除安裝,升級
在 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
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
相關文章
- rpm包安裝升級與解除安裝
- Linux RPM包安裝、解除安裝、升級命令講解Linux
- rpm安裝、升級、查詢與安全驗證
- Centos Docker安裝、升級、解除安裝CentOSDocker
- RPM 解除安裝
- Linux下Go的安裝、配置 、升級和解除安裝LinuxGo
- mysql安裝------RPM包安裝及解除安裝MySql
- debian軟體解除安裝|deb包解除安裝|dpkg命令
- RPM包的安裝與升級
- yum如何解除安裝已安裝的rpm並安裝本地rpm包
- Linux rpm -e --nodeps rpm解除安裝Linux
- RPM應用——查詢(已安裝包和未安裝包)
- Linux安裝解除安裝MySQLLinuxMySql
- Linux下查詢命令對應的RPM安裝包Linux
- (轉)CentOS 下 rpm包與 yum 安裝與解除安裝CentOS
- windows10升級程式解除安裝怎麼操作 windows10升級程式怎樣解除安裝刪除Windows
- linux 解除安裝jdk和安裝LinuxJDK
- Linux下安裝、解除安裝mysqlLinuxMySql
- Linux 解除安裝openjdk 安裝oraclejdkLinuxJDKOracle
- rpm -e --nodeps 無法解除安裝的包怎樣解除安裝 ?
- Postgresql Linux版本安裝——RPM包安裝SQLLinux
- Linux教程-系統管理-RPM解除安裝篇(轉)Linux
- Linux CentOS升級安裝gitLinuxCentOSGit
- 安裝升級Linux GCC版本LinuxGC
- Linux下JDK安裝與解除安裝LinuxJDK
- Linux 圖形介面安裝解除安裝Linux
- Linux-Ubuntu-mysql-安裝&解除安裝LinuxUbuntuMySql
- Mysql for Linux安裝配置之—— rpm(bundle)安裝MySqlLinux
- Linux rpm安裝MySQLLinuxMySql
- Linux解除安裝MySQLLinuxMySql
- 解除安裝websphere for linuxWebLinux
- linux 安裝ps需要先安裝的rpm包Linux
- zt_Red Hat 5.5中java JDK的解除安裝和安裝rpmJavaJDK
- docker安裝及解除安裝Docker
- Ubuntu解除安裝和安裝Ubuntu
- Oracle 安裝與解除安裝Oracle
- solaris mysql 安裝 解除安裝MySql
- JDK安裝和解除安裝JDK