共用方式為


針對適用於Linux的yum和 dnf套件管理工具中的常見問題進行疑難解答

適用於:✔️ Linux VM

本文討論並解決您在使用 yumdnf 套件管理工具在 Azure 虛擬機 (VM) Microsoft上安裝或更新應用程式時可能會遇到的常見問題。

警告

本文參考 CentOS,這是已達到其終止生命週期(EOL)的 Linux 發行版。 請據以考慮您的使用和規劃。 如需詳細資訊,請參閱 CentOS 生命週期結束指導

概觀

yum 命令行套件管理工具用於採用 RPM 封裝管理員 的 Linux 發行版中。 此工具名稱是“Yellowdog Updater Modified” 的縮寫,最初是針對 Yellow Dog Linux 所開發。 此工具 yum 已廣泛使用,特別是在 RED Hat Enterprise Linux(RHEL)、CentOS、Oracle Linux、Mariner 和 Fedora 等 RPM 型散發套件中。

dnf 命令行套件管理工具或 「Dandified Yum」 是 RPM 型 Linux 發行版的現代化和增強套件管理員工具。

案例 1:存放庫存取問題

您遇到適用於憑證或網路連線的錯誤。

執行驗證指令碼

Azure 會在 GitHub 上提供 Red Hat Update Infrastructure (RHUI) 存放庫檢查腳本。 此 Python 文稿包含下列功能:

  • 驗證 RHUI 用戶端憑證。
  • 驗證 RHUI rpm 一致性。
  • 檢查擴充更新支援 (EUS) 與非 EUS 存放庫設定與其需求的一致性。
  • 驗證 RHUI 存放庫的連線。
  • 如果未偵測到任何錯誤,報告成功的存放庫連線能力。
  • 驗證與 RHUI 存放庫的 SSL 連線。
  • 著重於 RHUI 存放庫。
  • 使用定義的條件來驗證找到的錯誤,並提供修正建議。

支援的 Red Hat 映像

此版本的檢查腳本目前僅支援從 Azure Marketplace 映射部署的下列 Red Hat VM:

  • RHEL 7.x PAYG VM
  • RHEL 8.x PAYG VM
  • RHEL 9.x PAYG VM
  • RHEL 10.x PAYG VMs

如何執行 RHUI 檢查腳本

若要執行檢查文稿,請在 Red Hat VM 上輸入下列殼層命令:

  1. 如果 VM 具有因特網存取權,請使用下列命令直接從 VM 執行文稿:

    curl -sL https://raw.githubusercontent.com/Azure/azure-support-scripts/refs/heads/master/Linux_scripts/rhui-check/rhui-check.py | sudo python2 -
    
  2. 如果 VM 沒有直接因特網存取權,請從下列 URL 下載腳本: RHUI 檢查腳本、將腳本傳送至 VM,然後執行下列命令:

    sudo python2 ./rhui-check.py 
    
  3. 腳本會產生報告,其中包含找到的任何問題。 執行文本輸出之後也會儲存在 /var/log/rhuicheck.log 中。

解決方案 1

如需 RHEL 系統,請參閱 針對 Azure 中的 Red Hat RHUI 憑證問題進行疑難解答,或 針對 Azure 中的 Red Hat RHUI 連線問題進行疑難解答。

針對其他 Linux 散發套件,請確定允許透過埠 443 與對應存放庫的通訊。 此外,如果需要有效的憑證,請確定操作系統使用有效的憑證。

案例 2:相依性問題

當您在更新期間遇到相依性衝突時,可能會遇到數個錯誤中的任何一個。 下列小節會顯示一般相依性錯誤的輸出徵兆。

徵兆 2a

Error: 
 Problem: package leapp-0.16.0-2.el8.noarch requires python3-leapp = 0.16.0-2.el8, but none of the providers can be installed
  - package python2-leapp-0.16.0-1.el7_9.noarch conflicts with python3-leapp provided by python3-leapp-0.16.0-2.el8.noarch
  - package python3-leapp-0.16.0-2.el8.noarch conflicts with python2-leapp provided by python2-leapp-0.16.0-1.el7_9.noarch
  - cannot install the best update candidate for package leapp-0.16.0-1.el7_9.noarch
  - problem with installed package python2-leapp-0.16.0-1.el7_9.noarch
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

徵兆 2b

Error: 
 Problem 1: package systemd-udev-239-78.el8.x86_64 requires systemd(x86-64) = 239-78.el8, but none of the providers can be installed
  - cannot install the best update candidate for package systemd-udev-239-74.el8_8.5.x86_64
  - package systemd-239-78.el8.x86_64 is filtered out by exclude filtering
 Problem 2: package systemd-container-239-78.el8.x86_64 requires systemd(x86-64) = 239-78.el8, but none of the providers can be installed
  - cannot install the best update candidate for package systemd-container-239-74.el8_8.5.x86_64
  - package systemd-239-78.el8.x86_64 is filtered out by exclude filtering
 Problem 3: package systemd-pam-239-78.el8.x86_64 requires systemd = 239-78.el8, but none of the providers can be installed
  - cannot install the best update candidate for package systemd-pam-239-74.el8_8.5.x86_64
  - package systemd-239-78.el8.i686 is filtered out by exclude filtering
  - package systemd-239-78.el8.x86_64 is filtered out by exclude filtering
 Problem 4: systemd-libs-239-74.el8_8.5.i686 has inferior architecture
  - package systemd-239-74.el8_8.5.x86_64 requires systemd-libs = 239-74.el8_8.5, but none of the providers can be installed
  - cannot install both systemd-libs-239-78.el8.x86_64 and systemd-libs-239-74.el8_8.5.x86_64
  - cannot install the best update candidate for package systemd-libs-239-74.el8_8.5.x86_64
  - problem with installed package systemd-239-74.el8_8.5.x86_64
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

解決方案 2

當您遇到相依性問題時,請從識別遺失或不相容之套件和版本的特定組合開始。 yum錯誤訊息通常表示需要哪些套件版本組合,但無法使用。

徵兆 2a 的解決方案:刪除較舊的套件

針對徵兆 2a, yum 會拒絕交易並傳回錯誤訊息。 此錯誤是由舊版和最新版本套件 python2-leapp 之間的 nn 不相容所造成。

若要修正此錯誤,您必須執行下列命令,移除導致衝突的舊版套件(在此案例中為 yum remove):

sudo yum remove python2-leapp-0.16.0-1.el7_9.noarch

然後,您可以繼續更新或安裝必要的套件。

徵兆 2b 的解決方案:從組態檔中移除套件排除專案

針對徵兆 2b, yum 會拒絕交易並傳回錯誤訊息。 排除篩選會導致錯誤。

若要修正此錯誤,讓您可以繼續更新或安裝必要的套件,請確定systemd套件未排除在 /etc/yum.conf/etc/dnf.conf 組態檔中。 若要檢查套件排除是否 systemd 發生,請執行下列組合之類的 cat/grep 命令:

sudo cat /etc/yum.conf | grep -i exclude

如果排除封裝 systemd ,則會出現下列輸出:

exclude=systemd

若要結束此套件排除,請使用文本編輯器(例如vivimnano)移除或批注化 /etc/yum.conf/etc/dnf.conf 檔案中 “exclude” 行的專案。

案例 3:Python 版本錯誤

yumdnfrpm 工具是以 Python 撰寫,並相依於 Python 解釋器正確運作。 具體而言,他們依賴 Python 解釋器提供的特定功能和連結庫來執行其程式代碼,並與系統互動。 變更安裝在系統上的預設 Python 版本可能會導致內部問題 yum ,或 dnf 因為相依於特定 Python 版本和組態。

例如,如果您沒有安裝正確的 Python 版本,可能會遇到下列其中一個錯誤:

  • “無效的語法”

    yum list all
      File "/usr/bin/yum", line 30
        except KeyboardInterrupt, e:
                                ^
    SyntaxError: invalid syntax
    
  • “沒有名為 yum 的模組”

    yum repolist
    There was a problem importing one of the Python modules
    required to run yum. The error leading to this problem was:
    
       No module named yum
    
  • 「不正確的解釋器:沒有這類檔案或目錄」

    bash: /usr/bin/yum: /usr/bin/pythonX.X: bad interpreter: No such file or directory
    

解決方案 3

藉由諮詢 Linux 發行版的官方檔,您可以放心地驗證預設的 Python 版本,並將其與系統上所安裝的版本進行比較。 此程式有助於確保軟體相依性和系統組態之間的一致性和相容性。

識別 Linux 發行版的預設 Python 版本之後,您可以執行下列其中一個命令來判斷目前安裝的版本:

sudo ls -al `which python`
sudo ls -lrth /usr/bin/python*
sudo rpm -V python

如果您確認不支援的 Python 版本正在使用中,您有數個選項可以修正此問題。

執行下列命令,將符號鏈接移除至不支援的 Python 版本,並建立 Python 支援的符號連結:

sudo cd /usr/bin
sudo unlink python
sudo ln -s python2.7 python  # Modify if necessary.

解決方案3b:使用 RPM 重新安裝 Python

執行下列 rpm 命令來重新安裝 Python 套件:

sudo rpm -ivh python-<release>.<arch>.rpm --replacepkgs --replacefiles

解決方案3c:從救援 VM 重新安裝 Python

從救援 VM 重新安裝 Python 套件。 如需指示,請參閱 遺漏重要的系統核心連結庫和套件

案例 4:重複套件

如果在更新時 yum 發生中斷, yum 可能會保留舊套件版本以及其正在安裝的新套件。 重複的套件可能會導致系統作業在後續使用工具期間造成混淆,最後會導致「受保護的多重連結庫」錯誤或誤導相依性問題。

下列案例很常見:

  • yum update透過安全殼層執行 ,並在更新程式期間發生連線中斷

  • SIGINT將 和 kill -2 訊號傳送至yum進程,或選取 Ctrl+C 以在正在執行時終止yum進程

  • 在更新程式中途重新啟動系統

解決方案 4

有兩個可能的解決方案:請嘗試完成交易,或手動移除重複的套件。 完成這些方法的步驟會因 Linux 安裝的發行版和版本而有所不同。

解決方案 4a:嘗試完成交易

  1. 執行下列 yum-complete-transaction 命令,嘗試完成交易:

    sudo yum-complete-transaction
    

    如果作業成功而不留下任何重複專案,請移至步驟 2。

  2. 如果存在重複專案,請在 命令中--cleanup-only指定 yum-complete-transaction 參數來解析此交易:

    sudo yum-complete-transaction --cleanup-only
    

解決方案4b:手動移除重複專案

  1. 執行下列命令以手動方式移除重複的套件。 此命令 yum check 可能需要很多時間,但取得其輸出對於繼續這些步驟至關重要:

    sudo tar -cjf /tmp/rpm_dbbkp.tar.bz2 /var/lib/{rpm,yum}
    sudo yum check &> /tmp/yumcheck
    grep "duplicate" /tmp/yumcheck | awk '{ print $NF }' | egrep -v "\:" > /tmp/duplicaterpms
    grep "duplicate" /tmp/yumcheck | awk '{ print $NF }' | egrep ":" | awk -F':' '{ print $NF }' >> /tmp/duplicaterpms
    for i in $(cat /tmp/duplicaterpms); do sudo rpm -e --justdb --nodeps $i; done
    sudo yum update
    
  2. 移除重複項目之後,如果失敗的交易中包含新的核心,請重新安裝核心,以確定已安裝正確的大整合開機載入器 (GRUB) 專案、初始 RAM 磁碟 (initrd) 和初始 RAM 檔案系統 (initramfs) 。

    sudo yum remove kernel-<newversion>-<release>.<arch>
    sudo yum install kernel-<newversion>-<release>.<arch>
    

案例 5:Yum 無法運作,並顯示「404 找不到」錯誤

輸出中的 yum 「404 找不到」錯誤訊息表示 yum 在伺服器上找不到套件或資源。 如果 yum 嘗試從存放庫下載或存取套件,但與它相關聯的套件檔案或元數據遺失或無法使用,通常就會發生此問題。 此案例有各種原因,包括下列各項:

  • 套件或資源已從存放庫移除。

  • 存放庫 URL 或設定不正確。

  • 網路問題可防止 yum 存取存放庫伺服器。

  • 有暫時的伺服器停機或維護。

此錯誤的範例顯示在各種 Linux 發行版的範例輸出中。

Red Hat Enterprise Linux 9 for x86_64 - Supplem  46  B/s |  14  B     00:00    
Errors during downloading metadata for repository 'rhel-9-for-x86_64-supplementary-rhui-rpms':
  - Status code: 404 for https://rhui4-1.microsoft.com/pulp/repos/content/dist/rhel9/rhui/9.1/x86_64/supplementary/os/repodata/repomd.xml (IP: 52.142.4.99)
Error: Failed to download metadata for repo 'rhel-9-for-x86_64-

解決方案5

下列可能的解決方案適用於各種 Linux 發行版。

當您在延伸更新支援 (EUS) 生命週期存放庫和非 EUS 存放庫之間切換,或從非 EUS 切換至 EUS 時,請確定您遵循正確的程式。 如需詳細資訊,請參閱 映射更新行為

如果錯誤通常是因為 /etc/yum/vars/releasever 和 /etc/dnf/vars/releasever 使用不正確的值,或因為值應該不存在(針對非 EUS 存放庫),請遵循下列步驟:

  1. 檢查您的系統是否使用 EUS 或非 EUS 存放庫。 若要這樣做,請執行下列 rpm/grep 命令組合:

    sudo rpm -qa | grep -i rhui
    

    命令產生的檔名格式取決於存放庫類型,如下表所示。

    存放庫類型 檔案名稱格式
    EUS rhui-azure-rhelX-eus-new-version-release.noarch<><>
    非 EUS rhui-azure-rhelX-new-version-release.noarch<><>
  2. 執行下列 cat 命令來判斷發行版本的目前值。

    RHEL 版本 指令
    RHEL 7 sudo cat /etc/yum/vars/releasever
    RHEL 8 和 9 sudo cat /etc/dnf/vars/releasever
  3. 變更並使用版本的正確值:

    • 如果您的系統使用 EUS 存放庫,請確定已套用適當的版本鎖定。 在下列範例中,會新增 RHEL 9.2 的版本鎖定,因為 RHUI EUS 會使用存放庫:

      sudo sh -c 'echo 9.2 > /etc/dnf/vars/releasever'
      

      注意

      RHEL7 EUS 的支援於 2021 年 8 月 30 日結束。 建議您不再在 RHEL7 中使用 EUS 存放庫。

      RHEL 8.提供適用於 EUS 的 x 版本。 這些版本包括 RHEL 8.8、8.6、8.4、8.2 和 8.1。

      RHEL 9.提供適用於 EUS 的 x 版本。 目前,這些版本包括 RHEL 9.2 和 9.0。

      如需版本可用性的詳細資訊,請參閱 Red Hat Enterprise Linux 生命週期

    • 如果您的系統使用非 EUS 存放庫,請執行下列命令,確定您移除 /etc/yum/vars/releasever 或 /etc/dnf/vars/releasever 檔案的版本鎖定

      RHEL 版本 指令
      RHEL 7 sudo echo "" > /etc/yum/vars/releasever
      RHEL 8 和 9 sudo echo "" > /etc/dnf/vars/releasever

案例 6:RPM 資料庫問題

如果您執行 rpmup2dateyumdnftdnf 命令,就會顯示下列錯誤:

error: rpmdb: BDB0113 Thread/process 24669/140693557245760 failed: BDB1507 Thread died in Berkeley DB library
error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db5 - (-30973)
error: cannot open Packages database in /var/lib/rpm
CRITICAL:yum.main:

這些錯誤可能會因為下列任何原因而發生:

  • 中斷的 RPM 資料庫
  • 使用資料庫的另一個應用程式
  • /var/lib/rpm 目錄中的空間不足

解決方案 6

請遵循下列步驟重建 RPM 資料庫:

重要

執行這些步驟之前,請確定有足夠的可用磁碟空間。

  1. 執行 命令來tar 目錄的備份:

    sudo tar zcvf /var/lib/rpm-backup.tar.gz /var/lib/rpm
    
  2. 若要避免過時鎖定,請移除 __db* 檔案,並確認 Packages 檔案的完整性

    sudo cd /var/lib/rpm
    sudo rm -f __db.*
    sudo /usr/lib/rpm/rpmdb_verify Packages
    
  3. 執行 rpm 命令來重建 RPM 資料庫:

    sudo rpm -vv --rebuilddb
    

案例 7:Yum 命令失敗並傳回 '[Errno 14] HTTPS 錯誤 403 --禁止'

如果您在 Red Hat 7 上執行命令, yum 則會出現下列錯誤。聯機到 RHUI 的 x VM。

https://rhui4-1.microsoft.com/pulp/repos/content/dist/rhel/rhui/server/7/7Server/x86_64/rh-common/os/repodata/repomd.xml: [Errno 14] HTTPS Error 403 - Forbidden

解決方案 7

  1. 檢查 VM 上是否已安裝第三方 curl 套件:

    sudo rpm -qa | grep -i curl
    
    rpm -q --queryformat '%{VENDOR}\n' curl libcurl
    
    curl-7.73.0-2.0.cf.rhel7.x86_64 
    libcurl-7.73.0-2.0.cf.rhel7.x86_64
    libcurl-devel-7.73.0-2.0.cf.rhel7.x86_64 
    
    city-fan.org repo http://www.city-fan.org/ftp/contrib/
    

    如果已安裝任何第三方套件,請移至步驟 2。

    重要

    來自第三方來源的 curl 套件會連同自己的二進制檔和 Red Hat 無法辨識的憑證一起提供。 這種不相容會導致 yum 遇到問題。

  2. 使用下列其中一種方法來載入 RHEL 7.9 所提供的最新版本curllibcurl、 和 libcurl-devel 套件:

    • 登入 Red Hat 下載以手動方式下載套件,然後將 rpms 檔案上傳至受影響的 VM。

    • 登入運作中的 RHEL 7.9 VM (PAYGO),使用 yumdownloader 命令下載所需的套件,然後將 rpms 檔案複製到受影響的 VM:

      sudo yumdownloader curl.x86_64 libcurl.x86_64 libcurl-devel.x86_64
      
  3. 使用步驟 2 中的 rpms 檔案降級 curl 套件:

    sudo cd /path/location/of/rpms/downloaded
    sudo yum downgrade curl-X.XX.0-XX.el7_9.X.x86_64.rpm libcurl-X.XX.X-XX.el7_9.X.x86_64.rpm libcurl-devel-X.XX.X-XX.el7_9.X.x86_64.rpm --disablerepo=*
    

協力廠商資訊免責聲明

本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。

協力廠商連絡資訊免責聲明

Microsoft 提供協力廠商連絡資訊,以協助您尋找有關此主題的其他資訊。 此連絡資訊可能會變更而不另行通知。 Microsoft 不保證協力廠商連絡資訊的準確性。

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。