跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文件 / 管理指南 / 一般任務 / 使用指令列工具管理軟體
適用範圍 SUSE Linux Enterprise Server 15 SP5

9 使用指令列工具管理軟體

本章介紹了兩個用於管理軟體的指令列工具:Zypper 與 RPM。如需此環境中所用術語的定義 (例如,repositorypatchupdate),請參閱第 8.1 節 「詞彙定義」

9.1 使用 Zypper

Zypper 是用於安裝、更新和移除套件的指令列套件管理員。它還可管理儲存庫。這部分內容對於執行遠端軟體管理任務或透過外圍程序程序檔管理軟體非常有用。

9.1.1 一般使用情形

Zypper 的一般語法為:

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

括號中的部分為非必需。如需一般選項和所有指令的清單,請參閱 zypper help。若要取得特定指令的說明,請輸入 zypper help COMMAND

Zypper 指令

執行 Zypper 最簡單的方法就是輸入其名稱,後面跟著指令。例如,若要將所有需要的修補程式套用至系統,請使用:

> sudo zypper patch
全域選項

此外,您還可以選擇使用一或多個全域選項,只需在指令前面輸入它們即可:

> sudo zypper --non-interactive patch

在上面的範例中,選項 --non-interactive 表示在不詢問任何問題的情況下執行指令 (自動套用預設回應)。

特定於指令的選項

若要使用特定於特殊指令的選項,請緊接在指令後面輸入這些選項:

> sudo zypper patch --auto-agree-with-licenses

在上面的範例中,--auto-agree-with-licenses 用於將所有需要的修補程式套用於系統,不要求您確認任何授權條款,而是自動接受授權條款。

引數

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

> sudo zypper install mplayer

某些選項還需要單個引數。以下指令會列出所有已知模式:

> zypper search -t pattern

您可以將上述所有指令組合使用。例如,下面的指令將在詳細模式下安裝 factory 儲存庫中的 mcvim 套件:

> sudo zypper -v install --from factory mc vim

--from 選項可在從指定儲存庫請求套件時,使所有儲存庫都處於啟用狀態 (以滿足任何相依性問題)。--repo--from 的別名,您可以使用兩者中的任何一個。

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

> sudo zypper remove --dry-run MozillaFirefox

Zypper 支援 --userdata STRING 全域選項。您可以使用此選項指定一個將會寫入 Zypper 的記錄檔案和外掛程式 (例如 Btrfs 外掛程式) 的字串。它可以用來標示和識別記錄檔案中的異動。

> sudo zypper --userdata STRING patch

9.1.2 使用 Zypper 子指令

Zypper 子指令是儲存在 zypper_execdir 組態選項所指定的目錄中的可執行檔。預設目錄為 /usr/lib/zypper/commands。如果在該位置找不到某個子指令,Zypper 會自動在其餘 $PATH 位置搜尋該子指令。這樣,您便可以建立自己的本地延伸,並將其儲存在使用者空間中。

不支援在 Zypper 外圍程序中執行子指令以及使用全域 Zypper 選項。

列出可用的子指令:

> zypper help subcommand
[...]
Available zypper subcommands in '/usr/lib/zypper/commands'

  appstream-cache
  lifecycle
  migration
  search-packages

Zypper subcommands available from elsewhere on your $PATH

  log                   Zypper logfile reader
                            (/usr/sbin/zypper-log)

查看子指令的說明螢幕:

> zypper help appstream-cache

9.1.3 使用 Zypper 安裝和移除軟體

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

> sudo zypper install PACKAGE_NAME
> sudo zypper remove PACKAGE_NAME
警告
警告:不要移除必要的系統套件

不要移除必需的系統套件,例如 glibczypperkernel。如果移除這些套件,系統可能會變得不穩定,甚至完全停止運作。

9.1.3.1 選取要安裝或移除的套件

使用 zypper installzypper remove 指令時,可以採用多種方法來找到套件。

依確切的套件名稱
> sudo zypper install MozillaFirefox
依確切的套件名稱和版本號碼
> sudo zypper install MozillaFirefox-52.2
依儲存庫別名和套件名稱
> sudo zypper install mozilla:MozillaFirefox

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

依含萬用字元的套件名稱

您可以選取名稱以特定字串開頭或結尾的所有套件。使用萬用字元時請務必小心,特別是在移除套件時。以下指令將安裝名稱以Moz開頭的所有套件:

> sudo zypper install 'Moz*'
提示
提示:移除所有 -debuginfo 套件

在給問題除錯時,您有時需要暫時安裝大量的 -debuginfo 套件,以獲取有關執行中程序的詳細資訊。在完成除錯工作階段後,如果您要清理環境,請執行以下指令:

> sudo zypper remove '*-debuginfo'
依功能

例如,若要安裝不知道名稱的套件,這些功能就很有用。下面的指令將安裝 MozillaFirefox 套件:

> sudo zypper install firefox
依功能、硬體架構或版本

可以結合功能指定硬體架構和版本:

  • 所需硬體架構的名稱需附加在功能的後面,兩者以句點分隔。例如,若要指定 AMD/Intel 64 架構 (在 Zypper 中命名為 x86_64_64),請使用:

    > sudo zypper install 'firefox.x86_64'
  • 版本必須附加到字串的結尾,並且前面必須有一個運算子:< (小於)、<= (小於等於)、= (等於)、>= (大於等於) 或 > (大於)。

    > sudo zypper install 'firefox>=74.2'
  • 也可以同時指定硬體架構與版本:

    > sudo zypper install 'firefox.x86_64>=74.2'
依 RPM 檔案的路徑

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

> sudo zypper install /tmp/install/MozillaFirefox.rpm
> sudo zypper install http://download.example.com/MozillaFirefox.rpm

9.1.3.2 同時安裝並移除套件

若要同時安裝和移除套件,請使用 +/- 修飾元。若要安裝 emacs 並同時移除 vim,請使用:

> sudo zypper install emacs -vim

若要移除 emacs 並同時安裝 vim,請使用:

> sudo zypper remove emacs +vim

為了避免系統將以 - 開頭的套件名稱解釋為指令選項,請一律將此類名稱用做第二個引數。如果做不到這一點,請在名稱前面加上 --

> sudo zypper install -emacs +vim       # Wrong
> sudo zypper install vim -emacs        # Correct
> sudo zypper install -- -emacs +vim    # Correct
> sudo zypper remove emacs +vim         # Correct

9.1.3.3 清理已移除套件的相依性

如果想讓系統在移除指定套件後,自動移除不再需要的所有套件,請使用 --clean-deps 選項:

> sudo zypper rm --clean-deps PACKAGE_NAME

9.1.3.4 在程序檔中使用 Zypper

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

> sudo zypper --non-interactive install PACKAGE_NAME

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

9.1.3.5 安裝或下載來源套件

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

> zypper source-install PACKAGE_NAME

root 身分執行時,來源套件的預設安裝位置為 /usr/src/packages/;以使用者身分執行時,預設安裝位置為 ~/rpmbuild。可以在本地 rpm 組態中變更這些值。

使用此指令還會安裝指定套件的建構相依性。如果不想執行此操作,請新增參數 -D

> sudo zypper source-install -D PACKAGE_NAME

如果只想安裝版次相依項,請使用 -d

> sudo zypper source-install -d PACKAGE_NAME

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

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

> zypper search -t srcpackage

您還可以將所有已安裝套件的來源套件下載到本地目錄。若要下載來源套件,請使用:

> zypper source-download

預設的下載目錄為 /var/cache/zypper/source-download。您可以使用 --directory 選項變更下載目錄。若只想顯示缺失或多餘的套件,而不下載或刪除任何內容,請使用 --status 選項。若要刪除多餘的來源套件,請使用 --delete 選項。若要禁止刪除,請使用 --no-delete 選項。

9.1.3.6 從已停用的儲存庫安裝套件

通常,您只能安裝或重新整理來自啟用的儲存庫的套件。--plus-content TAG 選項可協助您指定要重新整理的、要在目前 Zypper 工作階段期間暫時啟用的,以及要在工作階段完成後停用的儲存庫。

例如,若要啟用可以提供其他 -debuginfo-debugsource 套件的儲存庫,請使用 --plus-content debug。可以多次指定此選項。

若要暫時啟用此類「除錯」儲存庫,以安裝特定的 -debuginfo 套件,請按如下所示使用該選項:

> sudo zypper --plus-content debug \
   install "debuginfo(build-id)=eb844a5c20c70a59fc693cd1061f851fb7d046f4"

對於缺少的 debuginfo 套件,gdb 會報告 build-id 字串。

注意
注意:已停用安裝媒體

仍會設定 SUSE Linux Enterprise Server 安裝媒體中的儲存庫,但成功安裝後會停用這些儲存庫。您可以使用 --plus-content 選項,從安裝媒體而非線上儲存庫安裝套件。在呼叫 zypper 之前,請確保該媒體可用,例如,將 DVD 插入電腦的磁碟機中。

9.1.3.7 公用程式

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

> zypper verify

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

> sudo zypper install-new-recommends

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

9.1.4 使用 Zypper 更新軟體

Zypper 有三種方法更新軟體:安裝修補程式、安裝新版本的套件或更新整個套裝作業系統。最後一種方法可透過 zypper dist-upgrade 來實現。中介紹了如何升級 SUSE Linux Enterprise Server第 2 章 「升級路徑和方法

9.1.4.1 安裝全部所需的修補程式

若要安裝已安裝套件的新版本,最可靠的方式是修補 SUSE Linux Enterprise。這種方式可保證安裝版本正確的所有必需套件,並確保忽略被視為衝突的套件版本。

若要安裝所有正式發佈且適用於您系統的修補程式,請執行:

> sudo zypper patch

系統會檢查您電腦上設定的,來自儲存庫的所有修補程式是否與您的安裝相關。如果相關 (未分為 optionalfeature 類別),則會立即安裝這些修補程式。如果 zypper patch 成功,便可確保不會安裝有弱點版本的套件,除非您確認該例外。請注意,正式的更新儲存庫僅在註冊 SUSE Linux Enterprise Server 安裝之後才可用。

如果要安裝的修補程式所包含的變更需要將系統重新開機才能生效,您事先會收到警告。

單純使用 zypper patch 指令不會套用來自協力廠商儲存庫的套件。若要同時更新協力廠商儲存庫,請使用 with-update 指令選項,如下所示:

> sudo zypper patch --with-update

若要額外安裝選擇性修補程式,請使用:

> sudo zypper patch --with-optional

若要安裝與特定 Bugzilla 問題相關的所有修補程式,請使用:

> sudo zypper patch --bugzilla=NUMBER

若要安裝與特定 CVE 資料庫項目相關的所有修補程式,請使用:

> sudo zypper patch --cve=NUMBER

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

> sudo zypper patch --cve=CVE-2010-2713

若您只想安裝影響 Zypper 和套件管理本身的修補程式,請使用:

> sudo zypper patch --updatestack-only

請記住,如果您使用 updatestack-only 指令選項,將會丟棄原本還會更新其他儲存庫的其他指令選項。

9.1.4.2 列出修補程式

為了讓您確定修補程式是否可用,Zypper 允許您檢視以下資訊:

所需修補程式的數量

若要列出所需修補程式的數量 (適用於您系統但尚未安裝的修補程式),請使用 patch-check

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

可以將此指令與 --updatestack-only 選項結合使用,以便僅列出影響 Zypper 和套件管理自身的修補程式。

所需修補程式的清單

若要列出全部所需的修補程式 (適用於您系統但尚未安裝的修補程式),請使用 zypper list-patches

所有修補程式的清單

若要列出可用於 SUSE Linux Enterprise Server 的所有修補程式,而不論它們是否已安裝或是否適用於您的安裝,請使用 zypper patches

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

依 Bugzilla 問題

若要列出與 Bugzilla 問題相關的全部所需修補程式,請使用 --bugzilla 選項。

若要列出針對特定錯誤的修補程式,您也可以指定錯誤編號:--bugzilla=NUMBER。若要搜尋與多個 Bugzilla 問題相關的修補程式,請在錯誤號碼之間插入逗號,例如:

> zypper list-patches --bugzilla=972197,956917
依 CVE 號碼

若要列出與 CVE (通用弱點與揭露) 資料庫中某一項相關的全部所需修補程式,請使用 --cve 選項。

若要列出針對特定 CVE 資料庫項目的修補程式,您也可以指定 CVE 編號:--cve=NUMBER。若要搜尋與多個 CVE 資料庫項目相關的修補程式,請在 CVE 號碼之間插入逗號,例如:

> zypper list-patches --cve=CVE-2016-2315,CVE-2016-2324
列出已收回的修補程式

在 SUSE Linux Enterprise 15 程式碼資料流中,一些修補程式可自動收回。維護更新會經過仔細測試,因為更新有可能包含新的錯誤。如果發現某個修補程式包含錯誤,將會發佈一個新的更新 (版本號碼更高) 以回復有錯誤的更新,並會阻止再次安裝有錯誤的更新。您可以使用 zypper 列出已收回的修補程式:

> zypper lp --all |grep retracted
SLE-Module-Basesystem15-SP3-Updates | SUSE-SLE-Module-Basesystem-15-SP3-2021-1965 
 | recommended | important | ---    | retracted  | Recommended update for multipath-tools 
SLE-Module-Basesystem15-SP3-Updates | SUSE-SLE-Module-Basesystem-15-SP3-2021-2689 
 | security    | important | ---    | retracted  | Security update for cpio
SLE-Module-Basesystem15-SP3-Updates | SUSE-SLE-Module-Basesystem-15-SP3-2021-3655 
 | security    | important | reboot | retracted  | Security update for the Linux Kernel

查看有關已收回 (或任何) 修補程式的完整資訊:

> zypper patch-info SUSE-SLE-Product-SLES-15-2021-2689
Loading repository data...
Reading installed packages...

Information for patch SUSE-SLE-Product-SLES-15-2021-2689:
---------------------------------------------------------
Repository  : SLE-Product-SLES15-LTSS-Updates
Name        : SUSE-SLE-Product-SLES-15-2021-2689
Version     : 1
Arch        : noarch
Vendor      : maint-coord@suse.de
Status      : retracted
Category    : security
Severity    : important
Created On  : Mon 16 Aug 2021 03:44:00 AM PDT
Interactive : ---
Summary     : Security update for cpio
Description : 
    This update for cpio fixes the following issues:

    It was possible to trigger Remote code execution due to a integer overflow 
    (CVE-2021-38185, bsc#1189206)

    UPDATE:
    This update was buggy and could lead to hangs, so it has been retracted. 
    There will be a follow up update.
    [...]
具有衝突套件的修補程式
Information for patch openSUSE-SLE-15.3-2022-333:
-------------------------------------------------
Repository  : Update repository with updates from SUSE Linux Enterprise 15
Name        : openSUSE-SLE-15.3-2022-333
Version     : 1
Arch        : noarch
Vendor      : maint-coord@suse.de
Status      : needed
Category    : security
Severity    : important
Created On  : Fri Feb  4 09:30:32 2022
Interactive : reboot
Summary     : Security update for xen
Description :
    This update for xen fixes the following issues:

    - CVE-2022-23033: Fixed guest_physmap_remove_page not removing the p2m mappings. (XSA-393) (bsc#1194576)
    - CVE-2022-23034: Fixed possible DoS by a PV guest Xen while unmapping a grant. (XSA-394) (bsc#1194581)
    - CVE-2022-23035: Fixed insufficient cleanup of passed-through device IRQs. (XSA-395) (bsc#1194588)
Provides    : patch:openSUSE-SLE-15.3-2022-333 = 1
Conflicts   : [22]
    xen.src < 4.14.3_06-150300.3.18.2
    xen.noarch < 4.14.3_06-150300.3.18.2
    xen.x86_64 < 4.14.3_06-150300.3.18.2
    xen-devel.x86_64 < 4.14.3_06-150300.3.18.2
    xen-devel.noarch < 4.14.3_06-150300.3.18.2
[...]

上面的修補程式與 22 個套件的受影響或有弱點版本衝突。如果安裝了這些受影響或有弱點套件中的任何一個,將會觸發衝突,並且修補程式會劃分為需要類別。zypper patch 會嘗試安裝所有可用的修補程式。如果遇到問題,它會報告這些問題,以告知您並非所有更新都已安裝。可以透過更新受影響或有弱點套件或者移除這些套件來解決衝突。由於 SUSE 更新儲存庫也提供固定的套件,因此更新是解決衝突的標準方法。例如,如果由於相依關係問題或套件鎖定而無法更新套件,則會在使用者核准後將其刪除。

若要列出所有修補程式,而不考慮是否需要安裝它們,另外還需使用 --all 選項。例如,若要列出指定有 CVE 號碼的所有修補程式,請使用:

> zypper list-patches --all --cve
Issue | No.           | Patch             | Category    | Severity  | Status
------+---------------+-------------------+-------------+-----------+----------
cve   | CVE-2019-0287 | SUSE-SLE-Module.. | recommended | moderate  | needed
cve   | CVE-2019-3566 | SUSE-SLE-SERVER.. | recommended | moderate  | not needed
[...]

9.1.4.3 安裝新的套件版本

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

> sudo zypper update
重要
重要

zypper update 會忽略有問題的套件。例如,如果某個套件被鎖定,即使該套件有更高的版本可用,zypper update 也會忽略該套件。相反,如果套件被視為有弱點,zypper patch 會報告衝突。

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

> sudo zypper update PACKAGE_NAME
> sudo zypper install PACKAGE_NAME

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

> zypper list-updates

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

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

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

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

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

> sudo zypper list-updates --all

若要確定無法安裝新套件的原因,請使用上面所述的 zypper installzypper update 指令。

9.1.4.4 識別孤立的套件

每當您從 Zypper 中移除某個儲存庫或者升級系統時,某些套件可能會進入孤立狀態。這些孤立的套件不再屬於任何使用中的儲存庫。以下指令可以列出這些套件:

> sudo zypper packages --orphaned

有了這份清單,您可以確定是否仍然需要某個套件,或者是否可以安全移除某個套件。

9.1.5 識別使用已刪除檔案的程序和服務

在修補、更新或移除套件時,系統上可能有一些執行中程序仍在使用已被更新或移除操作刪除的檔案。執行 zypper ps 可以列出使用已刪除檔案的程序。如果此類程序屬於某個已知的服務,則會列出服務名稱,方便您重新啟動該服務。依預設,zypper ps 會顯示一個表格:

> zypper ps
PID   | PPID | UID | User  | Command      | Service      | Files
------+------+-----+-------+--------------+--------------+-------------------
814   | 1    | 481 | avahi | avahi-daemon | avahi-daemon | /lib64/ld-2.19.s->
      |      |     |       |              |              | /lib64/libdl-2.1->
      |      |     |       |              |              | /lib64/libpthrea->
      |      |     |       |              |              | /lib64/libc-2.19->
[...]
PID:程序 ID
PPID:父程序 ID
UID:執行程序的使用者的 ID
登入:執行程序的使用者的登入名稱
指令:用於執行程序的指令
服務:服務名稱 (僅當指令與系統服務關聯時)
檔案:已刪除檔案的清單

可依如下所示控制 zypper ps 的輸出格式:

zypper ps-s

建立一份簡短表格,其中不會顯示已刪除的檔案。

> zypper ps -s
PID   | PPID | UID  | User    | Command      | Service
------+------+------+---------+--------------+--------------
814   | 1    | 481  | avahi   | avahi-daemon | avahi-daemon
817   | 1    | 0    | root    | irqbalance   | irqbalance
1567  | 1    | 0    | root    | sshd         | sshd
1761  | 1    | 0    | root    | master       | postfix
1764  | 1761 | 51   | postfix | pickup       | postfix
1765  | 1761 | 51   | postfix | qmgr         | postfix
2031  | 2027 | 1000 | tux     | bash         |
zypper ps-ss

僅顯示與系統服務關聯的程序。

PID   | PPID | UID  | User    | Command      | Service
------+------+------+---------+--------------+--------------
814   | 1    | 481  | avahi   | avahi-daemon | avahi-daemon
817   | 1    | 0    | root    | irqbalance   | irqbalance
1567  | 1    | 0    | root    | sshd         | sshd
1761  | 1    | 0    | root    | master       | postfix
1764  | 1761 | 51   | postfix | pickup       | postfix
1765  | 1761 | 51   | postfix | qmgr         | postfix
zypper ps-sss

僅顯示使用已刪除檔案的系統服務。

avahi-daemon
irqbalance
postfix
sshd
zypper ps--print "systemctl status %s"

顯示用於取回可能需要重新啟動的服務之狀態的指令。

systemctl status avahi-daemon
systemctl status irqbalance
systemctl status postfix
systemctl status sshd

如需服務處理的詳細資訊,請參閱第 19 章 「systemd 精靈

9.1.6 使用 Zypper 管理儲存庫

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

> zypper repos

結果類似於以下輸出:

範例 9.1︰ Zypper — 已知儲存庫的清單
> zypper repos
# | Alias        | Name          | Enabled | Refresh
--+--------------+---------------+---------+--------
1 | SLEHA-15-GEO | SLEHA-15-GEO  | Yes     | No
2 | SLEHA-15     | SLEHA-15      | Yes     | No
3 | SLES15       | SLES15        | Yes     | No

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

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

> zypper repos -d

9.1.6.1 新增儲存庫

若要新增儲存庫,請執行

> sudo zypper addrepo URI ALIAS

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

9.1.6.2 重新整理儲存庫

zypper 可讓您從設定的儲存庫中擷取套件中的變更。若要擷取變更,請執行:

> sudo zypper refresh
注意
注意:zypper 的預設行為

有些指令預設會自動執行 refresh,因此您不需要明確執行該指令。

refresh 指令與 --plus-content 選項配合使用時,還可檢視已停用儲存庫中的變更:

> sudo zypper --plus-content refresh

該選項雖然會擷取儲存庫中的變更,但會使已停用儲存庫的狀態保持不變,即仍為停用。

9.1.6.3 移除儲存庫

若要從清單中移除某個儲存庫,請將指令 zypper removerepo 與要刪除的儲存庫的別名或編號結合使用。例如,若要從範例 9.1 「Zypper — 已知儲存庫的清單」中移除儲存庫 SLEHA-12-GEO,請使用下列其中一個指令:

> sudo zypper removerepo 1
> sudo zypper removerepo "SLEHA-12-GEO"

9.1.6.4 修改儲存庫

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

> sudo zypper modifyrepo -er -p 20 'updates'

修改儲存庫並不局限於單個儲存庫,您也可以對群組執行該操作:

-a:所有儲存庫
-l:本地儲存庫
-t:遠端儲存庫
-m TYPE:特定類型的儲存庫 (其中 TYPE 可以是以下之一:httphttpsftpcddvddirfilecifssmbnfshdiso)

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

> sudo zypper renamerepo 'Mozilla Firefox' firefox

9.1.7 使用 Zypper 查詢儲存庫和套件

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

> zypper products
> zypper patterns
> zypper packages
> zypper patches

若要在所有儲存庫中查詢某些套件,請使用 search。若要獲得有關特定套件的資訊,請使用 info 指令。

9.1.7.2 在所有 SLE 模組中搜尋套件

若要搜尋目前已啟用的 SLE 模組內部和外部的套件,請使用 search-packages 子指令。此指令會聯絡 SUSE Customer Center,並在所有模組中搜尋相符的套件,例如:

> zypper search-packages package1 package2

zypper search-packages 提供以下選項:

  • 搜尋與您的搜尋字串完全相符的套件:-x--match-exact

  • 依模組對結果進行分組 (預設:依套件分組):-g, --group-by-module

  • 顯示有關套件的更多詳細資訊:-d--details

  • 以 XML 格式輸出搜尋結果:--xmlout

9.1.7.3 搜尋特定功能

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

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

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

9.1.7.4 顯示套件資訊

若要查詢單個套件,請在 info 指令中使用準確的套件名稱做為引數。這會顯示有關某個套件的詳細資訊。如果套件名稱與儲存庫中的所有套件名稱都不相符,該指令會輸出非套件相符項目的詳細資訊。如果您要求特定類型 (透過使用 -t 選項),但該類型不存在,該指令會輸出其他可用的相符項,但不提供詳細資訊。

如果您指定來源套件,該指令會顯示基於該來源套件建立的二進位套件。如果指定二進位套件,該指令會輸出用來建立該二進位套件的來源套件。

如果還想顯示該套件所需/推薦的套件,請使用選項 --requires--recommends

> zypper info --requires MozillaFirefox

9.1.8 顯示生命週期資訊

SUSE 產品的支援週期一般為 10 年。通常,您可以使用 SUSE 的延伸支援產品將標準生命週期延長三年。根據您的產品,在 https://www.suse.com/lifecycle 中找到具體的支援生命週期。

若要檢查您的產品和所支援套件的生命週期,請依下面的方式使用 zypper lifecycle 指令:

# zypper lifecycle
    Product end of support
Codestream: SUSE Linux Enterprise Server 15             2028-07-31
    Product: SUSE Linux Enterprise Server 15 SP3        n/a*

Module end of support
Basesystem Module                                       n/a*
Desktop Applications Module                             n/a*
Server Applications Module                              n/a*

Package end of support if different from product:
autofs                                   Now, installed 5.1.3-7.3.1, update available 5.1.3-7.6.1

9.1.9 設定 Zypper

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

9.1.10 疑難排解

如果您在存取所設定儲存庫中的套件時遇到問題 (例如,儘管您知道某個套件在某個儲存庫中,但 Zypper 找不到該套件),重新整理儲存庫或許可以解決問題:

> sudo zypper refresh

如果不起作用,請嘗試

> sudo zypper refresh -fdb

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

9.1.11 Btrfs 檔案系統上的 Zypper 復原功能

如果根分割區上使用的是 Btrfs 檔案系統,且系統中安裝了 snapper,當 Zypper 提交對檔案系統所做的變更以建立相應的檔案系統快照時,會自動呼叫 snapper。這些快照可用於回復 Zypper 進行的任何變更。如需詳細資訊,請參閱第 10 章 「使用 Snapper 進行系統復原和快照管理

9.1.12 更多資訊

如需從指令列管理軟體的詳細資訊,請輸入 zypper helpzypper help  COMMAND,或者參閱 zypper(8) 手冊頁。如需詳盡的指令參考、最重要指令的 cheat sheets,以及有關如何在程序檔和應用程式中使用 Zypper 的資訊,請參閱 https://en.opensuse.org/SDB:Zypper_usage。最新 SUSE Linux Enterprise Server 版本的軟體變更清單可在 https://en.opensuse.org/openSUSE:Zypper_versions 中找到。

9.2 RPM - 套件管理員

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

rpm 有五種模式:安裝、解除安裝 (或更新) 軟體套件、重建 RPM 資料庫、查詢 RPM 庫或個別的 RPM 歸檔、對套件執行完整性檢查,以及簽署套件。rpmbuild 可用於建立初始來源的可安裝套件。

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

提示
提示:軟體開發套件

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

9.2.1 驗證套件真實性

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

修復作業系統中的問題時,您可能需要將問題暫時修復 (PTF) 安裝到線上系統中。SUSE 提供的套件已使用特殊 PTF 金鑰簽署。但是,與 SUSE Linux Enterprise 11 相比,在 SUSE Linux Enterprise 12 系統上,預設不會輸入此金鑰。若要手動輸入該金鑰,請使用以下指令:

> sudo rpm --import \
/usr/share/doc/packages/suse-build-key/suse_ptf_key.asc

輸入該金鑰後,您可以在系統上安裝 PTF 套件。

9.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。此指令只在不存在未解決的相依性問題時才會刪除套件。只要其他應用程式還需要它,理論上無法刪除 Tcl/Tk。即使是這種情況下,RPM 還是可從資料庫呼叫以得到協助。如果由於某種原因無法進行這樣的刪除操作 (即使存在其他相依性問題),或許可以使用選項 --rebuilddb 來重建 RPM 資料庫。

9.2.3 增量 RPM 套件

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

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

> sudo makedeltarpm old.rpm new.rpm new.delta.rpm

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

> sudo applydeltarpm new.delta.rpm new.rpm

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

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

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

9.2.4 RPM 查詢

-q 選項的 rpm 會啟動查詢,如此使用者便可檢查 RPM 歸檔 (透過新增選項 -p),並查詢已安裝套件的 RPM 資料庫。有多個切換參數可用於指定所需的資訊類型。請參閱表格 9.1 「基本 RPM 查詢選項」

表 9.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 可顯示範例 9.2 「rpm -q -i wget 中所示的資訊。

範例 9.2︰ rpm -q -i wget
Name        : wget
Version     : 1.14
Release     : 17.1
Architecture: x86_64
Install Date: Mon 30 Jan 2017 14:01:29 CET
Group       : Productivity/Networking/Web/Utilities
Size        : 2046483
License     : GPL-3.0+
Signature   : RSA/SHA256, Thu 08 Dec 2016 07:48:44 CET, Key ID 70af9e8139db7c82
Source RPM  : wget-1.14-17.1.src.rpm
Build Date  : Thu 08 Dec 2016 07:48:34 CET
Build Host  : sheep09
Relocations : (not relocatable)
Packager    : https://www.suse.com/
Vendor      : SUSE LLC <https://www.suse.com/>
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.
Distribution: SUSE Linux Enterprise 15

只有當您指定帶有完整路徑的完整檔案名稱時,選項 -f 才起作用。盡可能提供很多檔案名稱。例如:

> rpm -q -f /bin/rpm /usr/bin/wget
rpm-4.14.1-lp151.13.10.x86_64
wget-1.19.5-lp151.4.1.x86_64

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

rpm -q --changelog PACKAGE 指令會依日期順序顯示有關特定套件的詳細變更資訊清單。

藉由安裝的 RPM 資料庫,可執行驗證檢查。使用 -V--verify 可啟動這些檢查。將 rpm 與此選項配合使用,將顯示套件中自安裝後已變更的所有檔案。rpm 使用八位字元符號來提供有關以下變更的提示:

表 9.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。

9.2.5 安裝和編譯來源套件

所有來源套件的副檔名都是 .src.rpm (來源 RPM)。

注意
注意:安裝的來源套件

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

/usr/src/packages 中,必須存在用於 rpmrpmbuild 的以下目錄 (除非在 /etc/rpmrc 這樣的檔案中指定了自訂設定):

SOURCES

存放原始來源 (.tar.bz2.tar.gz 檔案等),以及特定於套裝作業系統的調整 (多為 .diff.patch 檔案)

SPECS

存放 .spec 檔案,類似於中繼 Makefile,可控制建構程序

BUILD

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

RPMS

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

SRPMS

此處為來源 RPM

使用 YaST 安裝來源套件時,所有必需的元件都安裝在 /usr/src/packages 中:來源和調整項存放於 SOURCES 中,相關的 .spec 檔案存放於 SPECS 中。

警告
警告:系統完整性

不要對系統元件 (glibcrpm 等) 進行試驗,因為這樣會影響系統的穩定性。

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

/usr/src/packages/SOURCES/wget-1.19.5.tar.bz2
/usr/src/packages/SOURCES/wgetrc.patch
/usr/src/packages/SPECS/wget.spec

rpmbuild -bX /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 資料庫中。

請記住,規格檔案中的 BuildRoot 指令已棄用。如果您仍然需要此功能,請使用 --buildroot 選項做為替代方案。

9.2.6 使用 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 手冊頁。

9.2.7 用於 RPM 歸檔和 RPM 資料庫的工具

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

具有完整功能的套件管理員是以 YaST 模組的方式提供。如需詳細資料,請參閱第 8 章 「安裝或移除軟體