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

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

本章介紹了兩個用於管理軟體的指令行工具︰Zypper 與 RPM。有關在此內容中所使用辭彙的定義 (例如,儲存庫修補程序更新),請參閱第 13.1 節 「術語定義」

6.1 使用 Zypper

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

6.1.1 一般使用情形

Zypper 的一般語法為︰

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

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

Zypper 指令

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

tux > sudo zypper patch
全域選項

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

tux > sudo zypper --non-interactive patch

在上述範例中,選項 --non-interactive 表示在不要求輸入任何內容的情況下執行指令 (自動套用預設回答)。

特定於指令的選項

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

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

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

引數

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

tux > sudo zypper install mplayer

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

tux > zypper search -t pattern

您可以將上述所有指令組合使用。例如,以下指令將以詳細模式安裝 aspell-deaspell-fr 套件 (來自 factory 儲存庫)︰

tux > sudo zypper -v install --from factory aspell-de aspell-fr

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

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

tux > sudo zypper remove --dry-run MozillaFirefox

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

tux > sudo zypper --userdata STRING patch

6.1.2 使用 Zypper 安裝和移除軟體

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

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

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

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

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

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

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

依含萬用字元的套件名稱

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

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

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

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

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

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

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

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

    tux > sudo zypper install 'firefox.x86_64'
  • 版本必須附加在字串的末尾,並且前面必須使用運算子︰< (小於)、<= (小於等於)、= (等於)、>= (大於等於)、> (大於)。

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

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

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

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

6.1.2.2 同時安裝並移除套件

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

tux > sudo zypper install emacs -vim

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

tux > sudo zypper remove emacs +vim

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

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

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

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

tux > sudo zypper rm PACKAGE_NAME --clean-deps

6.1.2.4 在程序檔中使用 Zypper

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

tux > sudo zypper --non-interactive install PACKAGE_NAME

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

6.1.2.5 安裝或下載來源套件

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

tux > zypper source-install PACKAGE_NAME

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

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

tux > sudo zypper source-install -D PACKAGE_NAME

若想單獨安裝建構相依套件,請使用 -d

tux > sudo zypper source-install -d PACKAGE_NAME

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

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

tux > zypper search -t srcpackage

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

tux > zypper source-download

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

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

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

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

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

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

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

6.1.2.7 公用程式

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

tux > zypper verify

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

tux > sudo zypper install-new-recommends

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

6.1.3 使用 Zypper 更新軟體

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

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

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

tux > sudo zypper patch

系統會檢查您電腦上設定的,來自儲存庫的所有修補程式是否與您的安裝相關。如果相關 (未分類為選擇性功能),則立即安裝這些修補程式。請注意,正式的更新儲存庫僅在註冊 SUSE Linux Enterprise Server 安裝之後才可用。

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

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

tux > sudo zypper patch --with update

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

tux > sudo zypper patch --with-optional

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

tux > sudo zypper patch --bugzilla=NUMBER

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

tux > sudo zypper patch --cve=NUMBER

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

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

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

tux > sudo zypper patch --updatestack-only

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

6.1.3.2 列出修補程式

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

所需修補程式的數量

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

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

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

所需修補程式的清單

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

tux > zypper list-patches
Loading repository data...
Reading installed packages...

Repository     | Name        | Version | Category | Status  | Summary
---------------+-------------+---------+----------+---------+---------
SLES12-Updates | SUSE-2014-8 | 1       | security | needed  | openssl: Update for OpenSSL
所有修補程式的清單

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

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

依 Bugzilla 問題

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

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

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

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

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

tux > zypper list-patches --bugzilla=CVE-2016-2315,CVE-2016-2324

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

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

6.1.3.3 安裝新的套件版本

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

tux > sudo zypper update

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

tux > sudo zypper update PACKAGE_NAME
sudo zypper install PACKAGE_NAME

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

tux > zypper list-updates

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

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

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

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

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

tux > sudo zypper list-updates --all

若要找出新套件無法安裝的原因,請依上文所述使用 zypper installzypper update 指令。

6.1.3.4 識別孤立的套件

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

tux > sudo zypper packages --orphaned

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

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

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

tux > 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
Login︰執行程序之使用者的登入名稱
Command︰用於執行程序的指令
Service︰服務名稱 (僅當指令與系統服務關聯時才顯示)
Files︰已刪除的檔案清單

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

zypper ps-s

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

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

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

6.1.5 使用 Zypper 管理儲存庫

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

tux > zypper repos

結果類似於以下輸出︰

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

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

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

tux > zypper repos -d

6.1.5.1 新增儲存庫

若要新增儲存庫,請執行

tux > sudo zypper addrepo URI ALIAS

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

6.1.5.2 重新整理儲存庫

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

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

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

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

tux > sudo zypper --plus-content refresh

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

6.1.5.3 移除儲存庫

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

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

6.1.5.4 修改儲存庫

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

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

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

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

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

tux > sudo zypper renamerepo 'Mozilla Firefox' firefox

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

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

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

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

6.1.6.1 zypper search 用法

zypper search 指令可以對套件名稱或 (視情況) 對套件摘要及描述進行搜尋。以 / 括住的字串會解譯為正規表示式。依預設,搜尋不區分大小寫。

執行簡單搜尋以尋找包含 fire 的套件名稱
tux > zypper search "fire"
執行簡單搜尋以尋找確切的套件 MozillaFirefox
tux > zypper search --match-exact "MozillaFirefox"
同時在套件描述和摘要中搜尋
tux > zypper search -d fire
僅顯示尚未安裝的套件
tux > zypper search -u fire
顯示包含字串 fir 且該字串後面不是 e 的套件
tux > zypper se "/fir[^e]/"

6.1.6.2 zypper what-provides 用法

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

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

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

6.1.6.3 zypper info 用法

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

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

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

tux > zypper info --requires MozillaFirefox

6.1.7 設定 Zypper

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

6.1.8 疑難排解

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

tux > sudo zypper refresh

如果不起作用,請嘗試

tux > sudo zypper refresh -fdb

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

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

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

6.1.10 更多資訊

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

6.2 RPM — 套件管理員

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

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

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

提示
提示:軟體開發套件

對於多個套件,軟體開發所需的元件 (程式庫、標題、包含檔案等) 已置於獨立的套件中。只有在您想要自行編譯軟體 (例如,最新的 GNOME 套件) 時,才需要這些開發套件。根據副檔名 -devel 即可識別出這些套件,例如 alsa-develgimp-devel 套件。

6.2.1 確認套件驗證性

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

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

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

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

6.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 資料庫。

6.2.3 Delta 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 都已存在︰

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

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

tux > sudo applydeltarpm new.delta.rpm new.rpm

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

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

如需技術詳細資訊,請參閱 /usr/share/doc/packages/deltarpm/README

6.2.4 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
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 12

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

tux > rpm -q -f /bin/rpm /usr/bin/wget
rpm-4.11.2-15.1.x86_64
wget-1.14-17.1.x86_64

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

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

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

表 6.2︰ RPM 驗證選項

5

MD5 檢查總數

S

檔案大小

L

符號連結

T

修改時間

D

主要和次要的裝置編號

U

擁有者

G

群組

M

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

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

tux > 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.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 程序

BUILD

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

RPMS

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

SRPMS

此處為來源 RPM

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

警告
警告:系統完整性

請不要以系統元件 (glibcrpm 等) 做試驗,因為這樣會危害系統的穩定性。

以下範例使用 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 -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 資料庫中。

請記住,從 SUSE Linux Enterprise Server 12 開始,已棄用規格檔案中的 BuildRoot 指令。如果您仍然需要此功能,請使用 --buildroot 選項做為因應措施。如需更詳細的背景,請參閱 https://www.suse.com/support/kb/doc?id=7017104 上的支援資料庫。

6.2.6 以 build 編譯 RPM 套件

許多套件中都包含不想要的檔案,它們會在 build 程序中增到執行系統中,因為導致危險產生。若要避免此狀況,可以使用 build,它會建立要在其中建置套件的定義環境。若要建立此 chroot 環境,必須提供 build 程序檔與完整的套件樹狀結構。此樹狀結構可在硬碟上、透過 NFS 或從 DVD 取得。使用 build --rpms DIRECTORY 設定位置。與 rpm 不同,build 指令在來源目錄中尋找 .spec 檔。若要以掛接在系統的 /media/dvd 之下的 DVD 建立 wget (如上面的範例),請以 root 身分執行下列指令︰

root # cd /usr/src/packages/SOURCES/
root # mv ../SPECS/wget.spec .
root # 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.7 RPM 歸檔和 RPM 資料庫工具

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

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