章 6. 使用指令行工具管理軟體

目錄

6.1. 使用 Zypper
6.2. RPM — 套件管理員

摘要

本章介紹了兩個用於管理軟體的指令行工具︰Zypper 與 RPM。有關在此內容中所使用辭彙的定義 (例如,儲存庫修補程序更新),請參閱第 6.1 節「Definition of Terms」 (第 6 章「Installing or Removing Software」, ↑部署指南)。

6.1. 使用 Zypper

Zypper 是用於安裝、更新和移除套件以及管理儲存庫的指令行套件管理員。Zypper 的語法與 rug 的語法類似。不同的是,Zypper 不需要視情境執行 zmd 精靈。如需有關 rug 相容性的詳細資訊,請參閱 man zypper 中的「與 RUG 的相容性」部分。這部分內容對於執行遠端軟體管理任務或透過外圍程序程序檔管理軟體非常有用。

6.1.1. 一般使用情形

Zypper 的一般語法為︰

zypper [global-options]command[command-options][arguments] ...

括號中的部分為非必需。執行 Zypper 最簡單的方法就是輸入其名稱,後面跟著指令。例如,若要將所有需要的修補程式套用至系統類型︰

zypper patch

此外,您還可以在指令之前輸入全域選項來從一或多個全域選項中進行選擇。例如,--non-interactive 表示直接執行指令,不詢問任何問題 (自動套用預設回答)︰

zypper --non-interactive patch

若要使用特定於特殊指令的選項,請在指令之後輸入這些選項。例如,--auto-agree-with-licenses 表示將所有需要的修補程式套用至系統,而不要求確認任何授權 (系統會自動接受所有授權)。

zypper patch --auto-agree-with-licenses

某些指令需要一或多個引數︰例如,使用安裝指令時,您需要指定要安裝的套件︰

zypper install mplayer

某些選項也需要引數。以下指令會列出所有已知模式︰

zypper search -t pattern

您可以將上述所有指令組合使用。例如,以下指令將從 factory 儲存庫安裝 mplayeramarok 套件,並顯示詳細資訊︰

zypper -v install --from factory mplayer amarok

--from 選項可確保所有儲存庫均處於啟用狀態 (以解決相依性問題),並且始終從指定的儲存庫要求套件。

大部分 Zypper 指令都有一個 dry-run 選項,對指定的指令進行模擬。它可以用於測試。

zypper remove --dry-run MozillaFirefox

6.1.2. 使用 Zypper 安裝和移除軟體

若要安裝或移除套件,請使用以下指令:

zypper install package_name
zypper remove package_name

Zypper 可以使用多種方式來指定安裝和移除指令中所使用的套件︰

用確切的套件名稱 (與版本號碼)
zypper install MozillaFirefox

zypper install MozillaFirefox-3.5.3
用儲存庫別名和套件名稱
zypper install mozilla:MozillaFirefox

mozilla 是要安裝套件所在之儲存庫的別名。

用含萬用字元的套件名稱

以下指令將安裝名稱以 Moz 開頭的所有套件。使用萬用字元時請務必小心,特別是在移除套件時。

zypper install 'Moz*'
用功能

例如,您要安裝 Perl 模組,但不知道套件的名稱,用功能指定便會幫上忙 ︰

zypper install 'perl(Time::ParseDate)'
用功能和/結構和/或版本

除功能外,還可以同時指定結構 (如 i586x86_64) 和/或版本。版本的前面必須使用運算子︰< (小於)、<= (小於等於)、= (等於)、>= (大於等於)、> (大於)。

zypper install 'firefox.x86_64'
zypper install 'firefox>=3.5.3'
zypper install 'firefox.x86_64>=3.5.3'
用 RPM 檔案的路徑

您也可以指定套件的本地或遠端路徑︰

zypper install /tmp/install/MozillaFirefox.rpm
zypper install http://download.opensuse.org/repositories/mozilla/SUSE_Factory/x86_64/MozillaFirefox-3.5.3-1.3.x86_64.rpm

若要同時安裝並移除套件,請使用 +/- 輔助按鍵。若要安裝 emacs 並移除 vim,請使用︰

zypper install emacs -vim

若要移除 emacs 並安裝 vim,請使用︰

zypper remove emacs +vim

為了防止將名稱以 - 開頭的套件解譯為指令選項,請一律將此類名稱用做第二個引數。如果行不通,則在前面加上 --

zypper install -emacs +vim       # Wrong
zypper install vim -emacs        # Correct
zypper install -- -emacs +vim    # same as above
zypper remove emacs +vim         # same as above

如果想讓系統在移除某套件後自動移除由於此操作而導致不再需要的所有套件,請使用 --clean-deps 選項︰

rm package_name --clean-deps

依預設,Zypper 會在安裝或移除所選套件前或出現問題時要求您確認。使用 --non-interactive 選項可覆寫此行為。此選項必須放在實際指令 (installremovepatch) 的前面,如下所示︰

zypper --non-interactive install package_name

此選項允許在程序檔與 cron 工作中使用 Zypper。

[Warning]不要移除必要的系統套件

不要移除 glibczypperkernel 或類似套件。這些套件都是系統的必要套件,若是移除,可能會導致系統不穩定甚至停止工作。

6.1.2.1. 安裝來源套件

若要安裝某套件對應的來源套件,請使用︰

zypper source-install package_name

使用此指令還會安裝指定套件的建構相依套件。如果不想如此,請新增參數 -D。若想單獨安裝建構相依套件,請使用 -d

zypper source-install -D package_name # source package only
zypper source-install -d package_name # build dependencies only

當然,您必須在儲存庫清單中啟用含來源套件的儲存庫 (預設會新增,但不會啟用),此指令才有效。如需有關儲存庫管理的詳細資料,請參閱第 6.1.5 節「使用 Zypper 管理儲存庫」

儲存庫中所有可用來源套件的清單可透過以下指令獲得︰

zypper search -t srcpackage

6.1.2.2. 公用程式

若要驗證是否仍滿足所有相依條件並執行未滿足的相依條件,請使用︰

zypper verify

除了必須滿足的相依條件之外,一些套件還會「推薦」其他套件。這些推薦的套件只有在確實可用並可安裝時才會進行安裝。如果所推薦的套件在推薦方套件安裝之後 (透過新增其他套件或硬體) 才可用,請使用以下指令︰

zypper install-new-recommends

此指令在接入網路攝影機或 WLAN 設備後非常有用。它將安裝設備的驅動程式及相關軟體 (如果有)。驅動程式及相關軟體只有在符合了某些硬體相依性條件後才可安裝。

6.1.3. 使用 Zypper 更新軟體

Zypper 有三種方法更新軟體︰安裝修補程式、安裝新版本的套件或更新整個套裝作業系統。最後一種方法透過 zypper dist-upgrade 指令來實現,可參閱第 6.1.4 節「使用 zypper 進行套裝作業系統升級」

6.1.3.1. 安裝修補程式

若要安裝所有正式發佈的適用於您系統的修補程式,只需執行︰

zypper patch

在此情況下,系統會檢查儲存庫中所有可用修補程式的關聯性,並視需要進行安裝。為 SUSE Linux Enterprise Desktop 安裝進行註冊後,包含此類修補程式的正式更新儲存庫將新增至您的系統。需要套用這些修補程式時,只需輸入上述指令即可。

Zypper 有三種指令可以查詢修補程式的可用性︰

zypper patch-check

列出所需修補程式 (已套用至系統但尚未安裝的修補程式) 的數量。

~ # zypper patch-check
Loading repository data...
Reading installed packages...
5 patches needed (1 security patch)
zypper list-patches

列出所需的所有修補程式 (已套用至系統但尚未安裝的修補程式)。


~ # zypper list-patches
Loading repository data...
Reading installed packages...
 
Repository                          | Name      | Version | Category | Status
------------------------------------+-----------+---------+----------+-------
Updates for openSUSE 11.3 11.3-1.82 | lxsession | 2776    | security | needed
zypper patches

列出為 SUSE Linux Enterprise Desktop 提供的所有修補程式,不論是否已安裝或適用於您的安裝。

還會列出與特定問題相關的修補程式並加以安裝。若要列出特定的修補程式,請使用 zypper list-patches 指令及以下選項︰

--bugzilla[=數字]

列出 Bugzilla 問題所需的所有修補程式。如果您只想列出針對此特定錯誤的修補程式,還可以指定錯誤編號。

--cve[=編號]

列出各種 CVE (Common Vulnerabilities and Exposures,通用弱點與揭露) 問題所需的所有修補程式,或僅符合特定 CVE 編號的修補程式 (如果指定編號)。

若要安裝針對特定 Bugzilla 或 CVE 問題的修補程式,請使用以下指令︰

zypper patch --bugzilla=number

zypper patch --cve=number

例外,若要安裝 CVE 編號為 CVE-2010-2713 的安全性修補程式,請執行︰

zypper patch --cve=CVE-2010-2713

6.1.3.2. 安裝更新

如果儲存庫中只含有新套件,但未提供修補程式,則 zypper patch 不起任何作用。若要使用可用的較新版本更新所有安裝的套件,請使用︰

zypper update

若要更新個別套件,請在更新或安裝指令中指定套件︰

zypper update package_name
zypper install package_name

所有可安裝的新套件的清單可透過以下指令獲得︰

zypper list-updates

請注意,此指令只會列出符合以下準則的套件︰

  • 與已安裝套件具有相同的廠商,

  • 提供套件的儲存庫相較於已安裝套件,擁有更高或相同的優先程度,

  • 可安裝 (符合所有相依性條件)。

所有新可用套件 (無論是否可安裝) 的清單可透過以下指令獲得︰

zypper list-updates --all

若要找出新套件無法安裝的原因,只需如上文所述使用 zypper installzypper update 指令即可。

6.1.3.3. 升級到新的產品版本

若要將安裝的產品輕鬆升級到新版本 (例如,從 SUSE Linux Enterprise Server 11 升級到 SUSE Linux Enterprise Server 11 SP1),請先調整您的儲存庫以符合目前的 SUSE Linux Enterprise Desktop 儲存庫。如需詳細資訊,請參閱第 6.1.5 節「使用 Zypper 管理儲存庫」。然後使用 zypper dist-upgrade 指令並指定所需的儲存庫。此指令可確保所有套件都從目前啟用的儲存庫安裝。如需詳細說明,請參閱 第 6.1.4 節「使用 zypper 進行套裝作業系統升級」

若將要套裝作業系統升級限制為特定儲存庫中的套件,並在滿足相依性條件時考量其他儲存庫,請使用 --from 選項並指定儲存庫 (使用別名、編號或 URI)。

[Note]zypper updatezypper dist-upgrade 的不同之處

選擇 zypper update 會將套件更新至您的產品所適用的較新版本,並保持系統的完整性。zypper update 遵從以下規則︰

不變更廠商
不變更結構
不降級
保留安裝的套件

執行 zypper dist-upgrade 時,目前啟用的儲存庫中的所有套件都會安裝。此規則會強制執行,因此套件可能會變更廠商或結構,甚至降級。不滿足相依條件的所有套件在升級後都會被解除安裝。

6.1.4. 使用 zypper 進行套裝作業系統升級

使用 zypper 指令行公用程式可以升級至新版套裝作業系統。最重要的是,您可以從執行中的系統啟動系統升級程序。

對於要執行遠端升級或在許多具有類似設定的系統上升級的進階使用者來說,此項功能很有吸引力。

6.1.4.1. 在使用 zypper 開始升級之前

為了避免在使用 zypper 進行升級的過程中出現未預期的錯誤,請將導致風險的因素減至最低。

儘可能多地關閉應用程式和不需要的服務,並將所有的一般使用者登出。

在開始升級之前停用協力廠商儲存庫,或降低這些儲存庫的優先程度,以便讓預設系統儲存庫之套件的優先程度優先。完成升級後,再啟用這些儲存庫,並編輯其版本字串,使之與升級後正在執行之系統套裝作業系統的版本號碼相符。

6.1.4.2. 升級程序

[Warning]檢查系統備份

在真正開始執行升級程序前進行檢查,確定您的系統備份最新並可還原。這一點很重要,因為您之後必須執行許多手動步驟。

  1. 執行線上更新,以確定軟體管理堆疊保持最新。如需詳細資訊,請參閱第 1 章「YaST 線上更新

  2. 設定要用做更新來源的儲存庫。請務必正確設定。使用 YaST (請參閱第 6.4 節「Managing Software Repositories and Services」 (第 6 章「Installing or Removing Software」, ↑部署指南)) 或 zypper (請參閱第 6.1 節「使用 Zypper」)。根據您的自定設定,以下步驟中使用的儲存庫名稱會稍有不同。

    考慮準備或更新自己的安裝伺服器。如需背景詳細資訊,請參閱第 11.2.1 節「Setting Up an Installation Server Using YaST」 (第 11 章「Remote Installation」, ↑部署指南)。

    若要檢視您目前的儲存庫,請輸入︰

    zypper lr -u
    
    [Tip]zypper 指令名稱

    zypper 指令可以使用完整形式,也可以使用縮寫形式。例如,您可以將 zypper install 縮寫為 zypper in。以下段落中,使用的是簡短形式。

    1. 使用以下指令將系統儲存庫的版本號碼從 11 提升為 11-SP1,以及新增 11_SP1 儲存庫︰

      server=http://download.example.org
      zypper ar $server/distribution/11-SP1/repo/oss/ SLE-11-SP1
      zypper ar $server/update/11-SP1/ SLE-11-SP1-Update
      

      移除舊的儲存庫︰

      zypper rr SLE-11
      zypper rr SLE-11-Update
    2. 停用協力廠商儲存庫或其他 Open Build Service 儲存庫,因為 zypper dup 只能用於預設的儲存庫 (以要停用的儲存庫名稱取代 repo-alias)︰

      zypper mr -d repo-alias

      或者,也可以降低這些儲存庫的優先程度。

      [Note]處理未解決的相依性

      zypper dup 會移除所有存在相依性未解決的問題的套件,但會保留滿足相依性之已停用儲存庫的套件。

      zypper dup 可確保所有安裝的套件都來自同一個可用的儲存庫。它不會考慮所安裝套件的版本、架構或廠商,因此會模擬執行全新安裝。儲存庫中不再可用的套件會視為孤立套件。如果此類套件無法滿足相依性,即會被解除安裝。若滿足相依性,將不會被解除安裝。

    3. 此作業結束後,使用以下指令檢查儲存庫組態︰

      zypper lr -d
      
  3. 使用 zypper ref 重新整理本地中繼資料和儲存庫內容。

  4. 使用 zypper up zypper 從 11 SP1 儲存庫拉入 zypper 和套件管理堆疊。

  5. 使用 zypper dup 執行實際的套裝作業系統升級。系統會要求您確認 SUSE Linux Enterprise 和某些套件的授權,具體視安裝的套件集而定。

  6. 使用 SuSEconfig 執行基本的系統組態。

  7. 使用 shutdown -r now 將系統重新開機。

6.1.5. 使用 Zypper 管理儲存庫

Zypper 的所有安裝或修補指令均依賴於一系列已知的儲存庫。若要列出系統可識別的所有儲存庫,請使用指令︰

zypper repos

結果類似於以下輸出︰

範例 6.1. Zypper—已知儲存庫的清單



# | Alias                             | Name                              | Enabled | Refresh
--+-----------------------------------+-----------------------------------+---------+--------
1 | SUSE-Linux-Enterprise-Server 11-0 | SUSE-Linux-Enterprise-Server 11-0 | Yes     | No
2 | SLES-11-Updates                   | SLES 11 Online Updates            | Yes     | Yes
3 | broadcomdrv                       | Broadcom Drivers                  | Yes     | No      

在各種指令中指定儲存庫時,可以使用 zypper repos 指令輸出的別名、URI 或儲存庫編號。儲存庫別名是儲存庫名稱的縮寫形式,用於儲存庫處理指令。請注意,修改儲存庫清單後,儲存庫的編號可能會發生變更。但別名永遠不會自行變更。

依預設,不會顯示儲存庫的詳細資料 (如 URI 或優先程度)。若要列出所有詳細資料,可以使用以下指令︰

zypper repos -d

6.1.5.1. 新增儲存庫

若要新增儲存庫,請執行

zypper addrepo URIalias

URI 可以是網際網路儲存庫、網路資源、目錄,也可以是 CD 或 DVD (如需詳細資料,請造訪 http://en.opensuse.org/openSUSE:Libzypp_URIs)。別名是儲存庫的縮寫與唯一識別碼。您可以隨意選擇,前提是它必須是唯一的。如果指定了已使用的別名,Zypper 會發出警告。

6.1.5.2. 移除儲存庫

若要從清單中移除儲存庫,請使用 zypper removerepo 指令,加上要刪除的儲存庫別名或編號。例如,若要移除範例 6.1 「Zypper—已知儲存庫的清單」 中所列的第三個儲存庫,請使用以下指令︰

zypper removerepo 3

6.1.5.3. 修改儲存庫

zypper modifyrepo 可以啟用或停用儲存庫。您也可以使用此指令變更儲存庫的內容 (如重新整理行為、名稱或優先程度)。以下指令將啟用名為 updates 的儲存庫,開啟自動重新整理功能,並將優先程度設為 20︰

zypper modifyrepo -er -p 20 'updates'

修改儲存庫不只是局限於一個儲存庫,您也可以對群組執行該操作︰

-a︰所有儲存庫
-l︰本地儲存庫
-t︰遠端儲存庫
-m 類型︰某種類型的儲存庫 (其中類型可以是以下其中一種︰httphttpsftpcddvddirfilecifssmbnfshdiso)

若要重新命名儲存庫別名,請使用 renamerepo 指令。以下範例會將別名「Mozilla Firefox」變更為「firefox」︰

zypper renamerepo 'Mozilla Firefox' firefox

6.1.6. 使用 Zypper 查詢儲存庫和套件

Zypper 提供多種方法來查詢儲存庫或套件。若要獲得所有可用產品、模式、套件或修補程式的清單,請使用以下指令︰

zypper products
zypper patterns
zypper packages
zypper patches

若要在所有儲存庫中查詢某些套件,請使用 search。它可以對套件名稱、或 (視情況) 對套件摘要及描述進行搜尋。搜尋詞彙中可以使用萬用字元 *?。依預設,搜尋不區分大小寫。

zypper search firefox       # simple search for "firefox"
zypper search "*fire*"      # using wildcards
zypper search -d fire       # also search in package descriptions and summaries
zypper search -u firefox    # only display packages not already installed

若要搜尋提供特殊功能的套件,請使用指令 what-provides。例如,如果您想瞭解哪個套件提供 Perl 模組 SVN::Core,請使用以下指令︰

zypper what-provides 'perl(SVN::Core)'

若要查詢單個套件,請在 info 指令中使用準確的套件名稱做為引數。它會顯示套件的詳細資訊。如果還想顯示套件所需/推薦的項目,請使用選項 --requires--recommends

zypper info --requires MozillaFirefox

what-provides 套件類似於 rpm -q --whatprovides 套件,但是 rpm 只能查詢 RPM 資料庫 (即所有已安裝套件的資料庫)。另外,Zypper 會告知您任何儲存庫功能的提供者,而不是只有已安裝的儲存庫。

6.1.7. 設定 Zypper

Zypper 現隨附一個組態檔案,透過該檔案可永久變更 Zypper 的行為 (整個系統範圍或僅針對特定使用者)。對於系統範圍的變更,請編輯 /etc/zypp/zypper.conf。對於特定使用者的變更,請編輯 ~/.zypper.conf。如果 ~/.zypper.conf 尚不存在,您可以使用 /etc/zypp/zypper.conf 做為範本︰將其複製到 ~/.zypper.conf 並根據喜好進行調整。如需有關可用選項的說明,請參閱檔案中的備註。

6.1.8. 疑難排解

如果您在存取設定之儲存庫中的套件時遇到問題 (例如,zypper 找不到特定套件,儘管您知道它存在於某個儲存庫中),則可使用以下指令重新整理儲存庫︰

zypper refresh

如果不起作用,請嘗試

zypper refresh -fdb

此指令會強制執行全面的重新整理和資料庫重建,包括強制下載原始中繼資料。

6.1.9. btrfs 檔案系統上的 Zypper 復原功能

如果根分割區上使用的是 btrfs 檔案系統,則在為建立適當的檔案系統快照而提交檔案系統變更時,zypper 會自動呼叫 snapper。這些快照可用於回復 zypper 所做的所有變更。如需有關 snapper 的詳細資訊,請參閱 man snapper

此功能在預設檔案系統上無法使用。

6.2. RPM — 套件管理員

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

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

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

[Tip]軟體開發套件

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

6.2.1. 確認套件驗證性

RPM 套件具有 GnuPG 簽章。若要驗證 RPM 套件的簽名,請使用指令 rpm --checksig 套件-1.2.3.rpm 來判斷套件是來自 Novell/SUSE,還是來自另一個可信任機構。特別建議在從網際網路更新套件時使用此指令。

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

一般而言,安裝 RPM 歸檔很簡單︰rpm -i package.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 資料庫。

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

[Note]SUSE Linux Enterprise Desktop 的正式更新

為了儘可能減小更新的下載大小,SUSE Linux Enterprise Desktop 的正式更新以 Delta RPM 套件的形式提供,而不是以修補程式 RPM 的形式提供。如需詳細資料,請參閱第 6.2.4 節「Delta RPM 套件」

6.2.4. Delta RPM 套件

Delta RPM 套件包含舊版與新版 RPM 套件之間的差異。將 delta RPM 套用到舊版 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

6.2.5. RPM 查詢

rpm 指令在使用 -q 選項時會啟動查詢,以便檢查 RPM 歸檔 (藉由新增選項 -p 的方式),並查詢所安裝套件的 RPM 資料庫。有多個切換參數可用於指定所需的資訊類型。請參閱表格 6.1 「最重要的 RPM 查詢選項」

表格 6.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 指令可顯示如 範例 6.2 「rpm -q -i wget」 中所示的資訊。

範例 6.2. rpm -q -i wget

Name        : wget                         Relocations: (not relocatable)
Version     : 1.11.4                            Vendor: openSUSE
Release     : 1.70                          Build Date: Sat 01 Aug 2009 09:49:48 CEST
Install Date: Thu 06 Aug 2009 14:53:24 CEST      Build Host: build18
Group       : Productivity/Networking/Web/Utilities   Source RPM: wget-1.11.4-1.70.src.rpm
Size        : 1525431                          License: GPL v3 or later
Signature   : RSA/8, Sat 01 Aug 2009 09:50:04 CEST, Key ID b88b2fd43dbdc284
Packager    : http://bugs.opensuse.org
URL         : http://www.gnu.org/software/wget/
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.8.0-4.3.x86_64
wget-1.11.4-11.18.x86_64

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

範例 6.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 使用八個字元的符號來提供下列變更的提示:

表格 6.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。

6.2.6. 安裝與編譯來源套件

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

[Note]安裝的來源套件

來源套件可從安裝媒體複製到硬碟,並用 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

[Warning]

請不要對系統元件 (glibcrpmsysvinit 等) 進行試驗,因為這樣會危害系統的穩定性。

以下範例使用 wget.src.rpm 套件。安裝來源套件之後,會獲得類似下列清單中所列的檔案:

/usr/src/packages/SOURCES/wget-1.11.4.tar.bz2
/usr/src/packages/SOURCES/wgetrc.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 資料庫中。

6.2.7. 以 build 編譯 RPM 套件

許多套件中都包含不想要的檔案,它們會在 build 程序中增到執行系統中,因為導致危險產生。若要避免此狀況,可以使用 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 頁面來存取其他資訊。

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

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

具有完整功能的套件管理員是以 YaST 模組的方式提供。如需詳細資料,請參閱第 6 章「Installing or Removing Software」 (↑部署指南)。