4.2 RPM — 套件管理員

RPM (RPM 套件管理員) 用於管理軟體套件。主要指令為 rpmrpmbuild。使用者、系統管理員和套件建立者可在威力強大的 RPM 資料庫中查詢已安裝軟體的詳細資訊。

rpm 主要包括五種模式︰安裝、解除安裝或更新軟體套件;重建 RPM 資料庫;查詢 RPM 基礎或個別的 RPM 歸檔;套件完整性檢查;簽署套件。rpmbuild 可用於建立初始來源的可安裝套件。

可安裝的 RPM 歸檔以特殊二進位格式包裝封裝。這些歸檔由要安裝的程式檔和 rpm 在安裝期間用來設定軟體套件或儲存在 RPM 資料庫中供記錄之用的特定中繼資訊所組成。RPM 歸檔的副檔名通常為 .rpm

提示: 軟體開發套件

對於許多套件,軟體開發所需的元件 (程式庫、標頭、Include 檔案等) 分別封裝在單獨的套件中。只有在您想要自行編譯軟體 (例如最新的 GNOME 套件) 時,才需要這些開發套件。由副檔名 -devel 即可識別出開發套件,例如 alsa-develgimp-develkdelibs3-devel 套件。

4.2.1 確認套件驗證性

RPM 套件具有 GnuPG 簽章。包含指紋的金鑰為:

1024D/9C800ACA 2000-10-19 SuSE Package Signing Key <build@suse.de>
Key fingerprint = 79C1 79B2 E1C8 20C1 890F  9994 A84E DAE8 9C80 0ACA

rpm --checksig package-1.2.3.rpm 指令可用來驗證 RPM 套件的簽章,以判斷它確實來自 SUSE,還是來自其他可信任的設備。特別建議在從網際網路更新套件時使用此指令。SUSE 公用套件簽章金鑰通常位於 /root/.gnupg/ 中。在 /usr/lib/rpm/gnupg/ 目錄中也額外放置了金鑰,以便讓一般使用者確認 RPM 套件的簽名。

4.2.2 管理套件︰安裝、更新和解除安裝

一般而言,安裝 RPM 歸檔很簡單︰rpm -i package.rpm。使用此指令可安裝套件,但是必須滿足套件的相依性,而且套件不可與其他套件衝突。如果 rpm 要求要安裝的套件必須符合相依性要求,會顯示錯誤訊息。RPM 資料庫會在背景中確認沒有產生衝突 — 特定的檔案僅可屬於一個套件。藉由選擇不同選項,您可以強迫 rpm 忽略這些預設,但只有進階使用者才可以這樣做。否則,會有危害系統完整性的風險,而且可能會危害更新系統的能力。

選項 -U--upgrade-F--freshen 可用來更新套件,例如,rpm -F package.rpm。此指令會移除舊版的檔案,並立刻安裝新檔案。兩個版本之間的不同在於 -U 會安裝先前系統中沒有的套件,而 -F 僅更新先前安裝的套件。在更新時,rpm 會使用下列策略小心地更新組態檔:

  • 如果系統管理員未變更組態檔,rpm 會安裝新版本的相應檔案。系統管理員不需要做任何動作。

  • 如果系統管理員在更新之前變更了組態檔,rpm 會將變更的檔案以副檔名 .rpmorig.rpmsave (備份檔案) 儲存,並安裝新套件的版本,但此操作僅在原始安裝的檔案與新版本不同時才會發生。在這種情況下,請比較備份檔案 (.rpmorig.rpmsave) 與新安裝的檔案,然後再對新檔案做一次變更。之後,請確定刪除所有 .rpmorig.rpmsave 檔案以避免未來更新的問題。

  • .spec如果組態檔已存在,如果在 檔案中指定了 noreplace 標籤,便會出現 .rpmnew 檔案。

在更新之後,應該在比較完 .rpmsave.rpmnew 之後將它們移除,才不會妨礙未來的更新。如果 RPM 資料庫之前無法辨識檔案,會指定 .rpmorig 副檔名。

否則,會使用 .rpmsave。換言之,.rpmorig 是在將外來格式更新為 RPM 後產生的。.rpmsave 是在將舊版 RPM 更新為新版 RPM 後產生的。.rpmnew 不會透露任何關於系統管理員是否曾對組態檔做過任何變更的資訊。可在 /var/adm/rpmconfigcheck 找到這些檔案的清單。部分組態檔 (如 /etc/httpd/httpd.conf) 不會覆寫以允許後續操作。

-U 切換參數的功能不完全等同於使用 -e 選項進行解除安裝以及使用 -i 選項進行安裝。如果可能,請使用 -U

若要移除套件,請輸入 rpm -e package。如果沒有無法解析的相依性,rpm 僅會刪除套件。只要其他應用程式還需要它,理論上無法刪除 Tcl/Tk,。即使是這種情況下,RPM 還是可從資料庫呼叫以得到協助。如果此種刪除是 (不論出於何種原因或處於不尋常的狀況下) 不可行的 — 即使存在額外的相依性,使用選項 --rebuilddb 來重建 RPM 資料庫可能有幫助。

4.2.3 RPM 與修補程式

為了確保系統的操作安全性,必須經常在系統上安裝更新套件。以前,要除去套件中的錯誤,只能夠更換整個套件。在大型套件中,如果有包含錯誤的小檔案就很容易產生大量的資料。但是,SUSE RPM 提供在套件中安裝修補程式的功能。

最重要的考量可用 pine 當作範例:

修補程式 RPM 是否適用於我的系統?

若要進行檢查,首先請查詢安裝的套件版本。以 pine 為例,可使用指令

rpm -q pine
pine-4.44-188

然後檢查修補程式 RPM 是否適用於此版本的 pine:

rpm -qp --basedon pine-4.44-224.i586.patch.rpm 
pine = 4.44-188
pine = 4.44-195
pine = 4.44-207

此修補程式適用於三種不同版本的 Pine。範例中也列出安裝的版本,因此可安裝此修補程式。

修補程式會更換哪些檔案?

受到修補程式影響的檔案可在修補程式 RPM 中輕易地看出。rpm 參數 -P 可讓您選擇特殊的修補程式功能。可使用以下指令顯示檔案清單:

rpm -qpPl pine-4.44-224.i586.patch.rpm
/etc/pine.conf
/etc/pine.conf.fixed
/usr/bin/pine

或者,如果已經安裝修補程式,可使用以下指令:

rpm -qPl pine
/etc/pine.conf
/etc/pine.conf.fixed
/usr/bin/pine
修補程式 RPM 如何安裝於系統中?

修補程式 RPM 可做為一般 RPM 使用。唯一的不同是必須已經安裝適合的 RPM。

系統中已經安裝哪個修補程式,是用於哪個套件版本?

使用指令 rpm -qPa 可顯示系統中已經安裝的所有修補程式清單。如果新系統中僅安裝一個修補程式 (如本範例),則清單顯示如下:

rpm -qPa
pine-4.44-224

如果在日後,您想要知道原始安裝的套件版本,可在 RPM 資料庫中找到此資訊。以 pine 為例,可使用以下指令顯示此資訊:

rpm -q --basedon pine
pine = 4.44-188

可在 rpm 以及 rpmbuild 的 man 頁面中找到包括 RPM 修補程式功能的相關資訊。

4.2.4 Delta RPM 套件

Delta RPM 套件包含舊版與新版 RPM 套件之間的差異。在舊版 RPM 上套用 delta RPM 會產生完整的新版 RPM。但是您不需要取得舊版的 RPM,因為 delta RPM 也可以和已安裝的 RPM 搭配使用。delta RPM 套件的大小比修補程式 RPM 還小,這一特點有利於透過網際網路傳送更新套件。缺點是使用 delta RPM 的更新作業會比一般或修補程式 RPM 消耗更多的 CPU 週期。

prepdeltarpmwritedeltarpm 以及 applydeltarpm 二進位檔屬於 delta RPM 套裝軟體 (deltarpm 套件) 的一部分,可協助您建立和套用 delta RPM 套件。使用下列指令可建立名稱為 new.delta.rpm 的 delta RPM。下列指令假設 old.rpmnew.rpm 都已存在:

prepdeltarpm -s seq -i info old.rpm > old.cpio
prepdeltarpm -f new.rpm > new.cpio
xdelta delta -0 old.cpio new.cpio delta
writedeltarpm new.rpm delta info new.delta.rpm

最後,移除暫存工作檔案 old.cpionew.cpio 以及 delta

如果已經安裝舊套件,使用 applydeltarpm 即可從檔案系統重新建構新 RPM:

applydeltarpm new.delta.rpm new.rpm

若不要存取檔案系統,而要從舊 RPM 產生新 RPM,請使用 -r 選項:

applydeltarpm -r old.rpm new.delta.rpm new.rpm

請參閱 /usr/share/doc/packages/deltarpm/README" 以取得技術細節。

4.2.5 RPM 查詢

使用 -q 選項,rpm 會啟動查詢,可檢查 RPM 歸檔 (藉由新增選項 -p),也可以查詢安裝套件的 RPM 資料庫。有多個切換參數可用於指定所需的資訊類型。請參閱表 4-1

表 4-1 最重要的 RPM 查詢選項

-i

套件資訊

-l

檔案清單

-f FILE

查詢包含 FILE 檔案的套件 (完整的路徑必須以 FILE 指定)

-s

含有狀態資訊的檔案清單 (隱含 -l)

-d

只列出文件檔案 (隱含 -l)

-c

只列出組態檔案 (隱含 -l)

--dump

含有完整詳細資訊的檔案清單 (與 -l-c-d 一起搭配使用)

--provides

列出另一個套件可以使用 --requires 要求的套件功能

--requires-R

套件所需的功能

--scripts

安裝程序檔 (預先安裝、後續安裝、解除安裝)

例如,rpm -q -i wget 指令可顯示如 範例 4-1 中所示的資訊。

範例 4-1 rpm -q -i wget

Name        : wget                         Relocations: (not relocatable)
Version     : 1.9.1                             Vendor: SUSE LINUX AG, Nuernberg, Germany
Release     : 50                            Build Date: Sat 02 Oct 2004 03:49:13 AM CEST
Install date: Mon 11 Oct 2004 10:24:56 AM CEST      Build Host: f53.suse.de
Group       : Productivity/Networking/Web/Utilities   Source RPM: wget-1.9.1-50.src.rpm
Size        : 1637514                          License: GPL
Signature   : DSA/SHA1, Sat 02 Oct 2004 03:59:56 AM CEST, Key ID a84edae89c800aca
Packager    : http://www.suse.de/feedback
URL         : http://wget.sunsite.dk/
Summary     : A tool for mirroring FTP and HTTP servers
Description :
Wget enables you to retrieve WWW documents or FTP files from a server.
This can be done in script files or via the command line.
[...]

只有在您指定完整檔案名稱及完整路徑時,選項 -f 才會有作用。提供盡可能多的檔案名稱。例如,以下指令

rpm -q -f /bin/rpm /usr/bin/wget

會產生:

rpm-4.1.1-191
wget-1.9.1-50

如果只知道檔案名稱的一部分,可使用範例 4-2 中所示的外圍程序程序檔。執行時,可將部份檔案名稱當作參數傳給程序檔。

rpm -q --changelog rpm 指令會依日期排序,顯示特定套件之相關變更資訊的詳細清單。此範例顯示套件 rpm 的相關資訊。

藉由安裝的 RPM 資料庫協助,可執行驗證檢查。以 -V-y--verify 啟動檢查。使用此選項,rpm 可顯示從安裝開始,套件中所有變更過的檔案。rpm 使用八個字元的符號來提供下列變更的提示:

表 4-2 RPM 驗證選項

5

MD5 檢查總數

S

檔案大小

L

符號連結

T

修改時間

D

主要和次要的設備編號

U

擁有者

G

群組

M

模式 (許可權和檔案類型)

如果是組態檔,會印出字母 c。例如,若 /etc/wgetrc (wget) 有變更:

rpm -V wget
S.5....T c /etc/wgetrc

RPM 資料庫的檔案放在 /var/lib/rpm。如果分割區 /usr 的大小為 1 GB,此資料庫將佔用 30 MB 左右的空間,尤其是在完整更新之後。如果資料庫遠大於預期,使用選項 --rebuilddb 來重建資料庫很有用。在執行之前,請備份舊的資料庫。cron 程序檔 cron.daily 會對資料庫做每日備份 (以 gzip 封裝),並將備份儲存在 /var/adm/backup/rpmdb 中。副本數量由 /etc/sysconfig/backup 中的變數 MAX_RPMDB_BACKUPS (預設值︰5) 控制。單一備份的大小大約是 1 GB 的 /usr 備份成 1 MB。

4.2.6 安裝與編譯來源套件

所有來源套件均帶有副檔名 .src.rpm (來源 RPM)。

提示: 來源套件可從安裝媒體複製到硬碟,並用 YaST 解壓縮。但是,在套件管理員中,它們不會被標示為已安裝 ([i])。這是因為來源套件沒有輸入 RPM 資料庫中。只有已安裝的作業系統軟體會列在 RPM 資料庫中。您在安裝來源套件時,僅會將原始程式碼新增到系統中。

/usr/src/packages 中必須可以找到 rpmrpmbuild 的下列目錄 (除非您在如 /etc/rpmrc 的檔案中指定自定設定):

SOURCES

用於原始來源 (.tar.bz2.tar.gz 檔案等) 和配送特定調整 (大部份是 .diff.patch 檔案)

SPECS

用於 .spec 檔案,和中繼 Makefile 相似,可控制 build 程序

BUILD

所有來源在此目錄中解壓縮、修補和編譯

RPMS

儲存完整二進位套件的地方

SRPMS

此處為來源 RPM

當您使用 YaST 安裝來源套件時,所有需要的元件都會安裝在 /usr/src/packages 中︰SOURCES 中的來源和調整以及 SPECS 中的相關 .spec

警告: 請勿試驗系統元件 (glibcrpmsysvinit 等),因為這樣會危害系統的操作性。

以下範例使用 wget.src.rpm 套件。在使用 YaST 安裝套件之後,應該有類似下列清單的檔案:

/usr/src/packages/SOURCES/nops_doc.diff
/usr/src/packages/SOURCES/toplev_destdir.diff
/usr/src/packages/SOURCES/wget-1.9.1+ipvmisc.patch
/usr/src/packages/SOURCES/wget-1.9.1-brokentime.patch
/usr/src/packages/SOURCES/wget-1.9.1-passive_ftp.diff
/usr/src/packages/SOURCES/wget-LFS-20040909.tar.bz2
/usr/src/packages/SOURCES/wget-wrong_charset.patch
/usr/src/packages/SPECS/wget.spec

rpmbuild -b X /usr/src/packages/SPECS/wget.spec 可開始編譯。X 代表建立程序各種階段的萬用字元 (請參閱 --help 的輸出或 RPM 文件以取得詳細資訊)。以下僅為簡略的說明:

-bp

/usr/src/packages/BUILD 中準備來源︰解壓縮和修補。

-bc

執行與 -bp 相同動作,但是會額外編譯。

-bi

執行與 -bp 相同的動作,但是會額外安裝建立的軟體。警告︰如果套件不支援 BuildRoot 功能,您可能會覆寫組態檔。

-bb

執行與 -bi 相同的動作,但是會額外建立二進位套件。如果編譯成功,二進位應該在 /usr/src/packages/RPMS

-ba

執行與 -bb 相同的動作,但是會額外建立來源 RPM。如果編譯成功,二進位應該在 /usr/src/packages/SRPMS

--short-circuit

略過部分步驟。

現在可使用 rpm -i (最好使用 rpm -U) 來安裝所建立的二進位 RPM。使用 rpm 來安裝會讓它出現在 RPM 資料庫中。

4.2.7 以 build 編譯 RPM 套件

包含太多套件的危險之處在於︰構建過程中會在正在執行的系統中新增不需要的檔案。為了避免發生此狀況,可使用 build,它會建立要在其中建立套件的已定義環境。若要建立此 chroot 環境,必須提供 build 程序檔與完整的套件樹狀結構。此樹狀結構可在硬碟上、透過 NFS 或從 DVD 取得。用 build --rpms directory 設定位置。和 rpm 不同,build 指令會在來源目錄中尋找 SPEC 檔。若要以裝載在系統中 /media/dvd 之下的 DVD 建立 wget (如上面的範例),請以 root 的身分執行下列指令:

cd /usr/src/packages/SOURCES/
mv ../SPECS/wget.spec .
build --rpms /media/dvd/suse/ wget.spec

之後,系統便會在 /var/tmp/build-root 中建立一個最小的環境。套件將於此環境中建立。完成時,結果套件位於 /var/tmp/build-root/usr/src/packages/RPMS 中。

build 程序檔可提供數個額外選項。例如,讓程序檔偏好您自己的 RPM、省略建置環境的啟始化,或將 rpm 指令限制在上述階段之一。可使用 build --help 以及參閱 build man 頁面來存取其他資訊。

4.2.8 RPM 歸檔和 RPM 資料庫工具

Midnight Commander (mc) 可顯示 RPM 歸檔的內容,並複製部分內容。它將歸檔以虛擬檔案系統呈現,提供 Midnight Commander 的所有常見功能表選項。使用 F3 可顯示 HEADER。使用游標和 Enter 可檢視歸檔結構。使用 F5 可複製歸檔元件。

KDE 提供 kpackage 工具做為 rpm 的前端。完整功能的套件管理員是以 YaST 模組的方式提供 (請參閱 第 9 章安裝或移除軟體)。