歸納:html
rpm/yum redhat前端
dpkg/apt debiannode
alien 轉換linux
在 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 包ubuntu
# rpm -ivh package.rpm
升級 RPM 包命令安全
# rpm -Uvh package.rpm
卸載 RPM 包命令服務器
# rpm -ev package
查詢 RPM 包中包含的文件列表命令ide
# 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.debRPM 中的 --force 是幹什麼用的?RPM 中的默認安裝規則是不容許同一個包屢次安裝的,也不容許降級安裝。使用 --force 輔助參數將不考慮以上因素,強制安裝 RPM 包。可是,--force 沒法強制安裝一個不知足系統依賴性關係的包 ( 此時須要用到 --nodeps 參數 ) 。使用方法如:# rpm -i --force package_a.rpmRPM/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.htmlDPKG是。可使用 dpkg-deb 工具來提取文件:$ dpkg-deb --extract ibm_lotus_notes-8.5.i586.deb $dir( 目標目錄 )RPM/DPKG 提供包安裝成功的驗證機制嗎?RPM是。可使用 -V 參數進行驗證。DPKGDebian 系統一般使用 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 OKDPKGDPKG 不提供原生的 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 --rebuilddbRPMDPKG 自己不提供底層數據庫恢復機制。它的數據庫以文件形式保存在 /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 返回信息 : 系統中全部軟件的安裝時間。DPKGDPKG 不提供直接的查詢參數,可是能夠用過查詢 dpkg 的日誌文件實現這個功能。如:cat /var/log/dpkg.log | grep "\ install\ "