天天看點

Linux包管理工具(rpm/dpkg,yum/apt,alien)

概括:

rpm/yum  redhat

dpkg/apt  debian

alien 轉換

在 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.rpm

DEB

可以。使用— 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:[email protected]/package.rpm

DPKG

最新的基于 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 OK

DPKG

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 --rebuilddb

RPM

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

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

RPM

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

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

DPKG

可以。使用— 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\ "

轉載于:https://www.cnblogs.com/sonice-cinsy/p/6612887.html