適用於:✔️ Linux VM
本文討論並解決您在使用 yum
和 dnf
套件管理工具在 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 上輸入下列殼層命令:
如果 VM 具有因特網存取權,請使用下列命令直接從 VM 執行文稿:
curl -sL https://raw.githubusercontent.com/Azure/azure-support-scripts/refs/heads/master/Linux_scripts/rhui-check/rhui-check.py | sudo python2 -
如果 VM 沒有直接因特網存取權,請從下列 URL 下載腳本: RHUI 檢查腳本、將腳本傳送至 VM,然後執行下列命令:
sudo python2 ./rhui-check.py
腳本會產生報告,其中包含找到的任何問題。 執行文本輸出之後也會儲存在
/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
若要結束此套件排除,請使用文本編輯器(例如vi
、 vim
或 nano
)移除或批注化 /etc/yum.conf 或 /etc/dnf.conf 檔案中 “exclude” 行的專案。
案例 3:Python 版本錯誤
yum
、 dnf
和 rpm
工具是以 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 版本正在使用中,您有數個選項可以修正此問題。
解決方案 3a:修正符號連結
執行下列命令,將符號鏈接移除至不支援的 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:嘗試完成交易
執行下列 yum-complete-transaction 命令,嘗試完成交易:
sudo yum-complete-transaction
如果作業成功而不留下任何重複專案,請移至步驟 2。
如果存在重複專案,請在 命令中
--cleanup-only
指定yum-complete-transaction
參數來解析此交易:sudo yum-complete-transaction --cleanup-only
解決方案4b:手動移除重複專案
執行下列命令以手動方式移除重複的套件。 此命令
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
移除重複項目之後,如果失敗的交易中包含新的核心,請重新安裝核心,以確定已安裝正確的大整合開機載入器 (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 存放庫),請遵循下列步驟:
檢查您的系統是否使用 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<><> 執行下列
cat
命令來判斷發行版本的目前值。RHEL 版本 指令 RHEL 7 sudo cat /etc/yum/vars/releasever
RHEL 8 和 9 sudo cat /etc/dnf/vars/releasever
變更並使用版本的正確值:
如果您的系統使用 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 資料庫問題
如果您執行 rpm
、 up2date
、 yum
、 dnf
或 tdnf
命令,就會顯示下列錯誤:
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 資料庫:
重要
執行這些步驟之前,請確定有足夠的可用磁碟空間。
執行 命令來
tar
目錄的備份:sudo tar zcvf /var/lib/rpm-backup.tar.gz /var/lib/rpm
若要避免過時鎖定,請移除 __db* 檔案,並確認 Packages 檔案的完整性:
sudo cd /var/lib/rpm sudo rm -f __db.* sudo /usr/lib/rpm/rpmdb_verify Packages
執行
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
檢查 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 遇到問題。
使用下列其中一種方法來載入 RHEL 7.9 所提供的最新版本
curl
libcurl
、 和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
使用步驟 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 意見反應社群提交產品意見反應。