3.3. RPM──套件管理員

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

基本上,rpm 有五種模式:安裝、解除安裝或更新軟體套件;重建 RPM 資料庫;查詢 RPM 基礎或個別 RPM 歸檔;套件的完整性檢查;以及簽名套件。可使用 rpmbuild 從原始來源建立可安裝套件。

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

[Tip]軟體開發套件

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

3.3.1. 確認套件驗證性

SUSE Linux 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 Linux,或是來自其他可信任的設備。從網際網路更新套件時,特別建議使用。SUSE Linux 公用套件簽名金鑰通常位於 /root/.gnupg/ 中。在 /usr/lib/rpm/gnupg/ 目錄中也額外放置了金鑰,以便讓一般使用者確認 RPM 套件的簽名。

3.3.2. 管理套件:安裝、更新與解除安裝

RPM 歸檔的安裝通常很簡單:rpm -i 套件.rpm。使用此指令可安裝套件,但是必須滿足其依存度,而且不可與其他套件衝突。錯誤訊息是 rpm 要求必須安裝的套件要符合依存度要求。RPM 資料庫會在背景確定未產生衝突,亦即特定檔案僅可屬於一個套件。藉由選擇不同選項,您可以強迫 rpm 忽略這些預設,但是僅供進階使用者使用。否則,會有危害系統完整性的風險,而且可能會危害更新系統的能力。

選項 -U--upgrade-F--freshen 可用來更新套件,例如,rpm -F 套件.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 套件。如果沒有無法解析的依存度,rpm 僅會刪除套件。理論上無法刪除 Tcl/Tk,只要其他應用程式還需要它。即使是此狀況,RPM 可從資料庫呼叫以得到協助。如果此種刪除是 (不論任何原因或在不尋常的狀況下) 不可行的,則即使存在額外的依存度,使用 --rebuilddb 選項來重建 RPM 資料庫仍然可能有幫助。

3.3.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 修補程式功能的相關資訊。

3.3.4. Delta RPM 套件

Delta RPM 套件包含舊版與新版 RPM 套件之間的差異。在舊 RPM 上套用 delta RPM 會產生完整的新 RPM。但是您不需要一份舊的 RPM,因為 delta RPM 也可以和已安裝的 RPM 搭配使用。delta RPM 套件的大小比修補程式 RPM 還小,這對於在網際網路上傳送更新套件而言,是一項優點。缺點是使用 delta RPM 的更新作業會比一般或修補程式 RPM 消耗更多的 CPU 週期。若要在 YOU 工作階段期間讓 YaST 使用 delta RPM 套件程式,請在 /etc/sysconfig/onlineupdate 中將 YOU_USE_DELTAS 設為 yes。在此情況下,要準備好您的安裝媒體備用。如果 YOU_USE_DELTAS 空白或設為 filesystem,YOU 會嘗試下載套用到已安裝檔案的 delta 套件。在此情況下,您不需要安裝媒體,但下載時間可能會比較長。如果設為 no,YOU 只會使用修補程式 RPM 和一般 RPM。

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
rm old.cpio new.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" 以取得技術細節。

3.3.5. RPM 查詢

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

表格 3.6. 最重要的 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 指令可顯示如 範例 3.2, "rpm -q -i wget" 中所示的資訊。

範例 3.2. 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

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

範例 3.3. 搜尋套件的程序檔

#! /bin/sh
for i in $(rpm -q -a -l | grep  $1); do
    echo "\"$i\" is in package:"
    rpm -q -f $i
    echo ""
done

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

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

表格 3.7. 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 中。備份的數目是由 MAX_RPMDB_BACKUPS 變數 (預設:5) 所控制,此變數位於 /etc/sysconfig/backup。單一備份的大小大約是 1 GB 的 /usr 備份成 1 MB。

3.3.6. 安裝與編譯來源套件

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

[Tip]提示

來源套件可從安裝媒體複製到硬碟,並用 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 中,而相關的 .spec 檔案在 SPECS 中。

[Warning]警告

請勿試驗系統元件 (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 資料庫中。

3.3.7. 以 build 編譯 RPM 套件

許多套件均有一個危機,就是在 build 程序中,會有不想要的檔案新增到執行系統中。若要避免發生此狀況,可使用 build,它會建立定義的環境,並在其中建立套件。若要建立此 chroot 環境,必須提供 build 程序檔的完整套件樹狀結構。此樹狀結構可在硬碟上、透過 NFS 或從 DVD 取得。用 build --rpms 目錄 設定位置。和 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 頁面來存取其他資訊。

3.3.8. RPM 歸檔和 RPM 資料庫工具

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

KDE 提供 kpackage 工具做為 rpm 的前端。完整功能的套件管理員是以 YaST 模組的方式提供 (請參閱 節 2.3.1, "安裝和移除軟體" (↑啟動))。