启动与虚拟机故障

排查 yum 和 dnf 包管理器中的常见问题 - Virtual Machines

· 52CE 我爱测

适用于:✔️ Linux VM 概要 本文讨论并解决在使用 yum 和 dnf 打包管理工具在 Microsoft azure 虚拟机(VM)上安装或更新应用程序时可能会遇到的常见问题。 注意 本文提及了 CentOS,这是一个已经停止支持的 Linux 发行版。 请相应地考虑使用和规划。 有关详细信息,请参阅 CentOS 生命周期结束指南(/zh-cn/azure/virtual-machines/workloads/centos/centos-end

适用于:✔️ Linux VM

概要

本文讨论并解决在使用 yum 和 dnf 打包管理工具在 Microsoft azure 虚拟机(VM)上安装或更新应用程序时可能会遇到的常见问题。

注意

本文提及了 CentOS,这是一个已经停止支持的 Linux 发行版。 请相应地考虑使用和规划。 有关详细信息,请参阅 CentOS 生命周期结束指南。

概述

yum 命令行包管理工具用于采用 RPM 程序包管理器的 Linux 分发版。 该工具名称是“Yellowdog Updater Modified”的首字母缩略词,最初是为 Yellow Dog Linux 开发的。 该工具 yum 已广泛使用,特别是在基于 RPM 的分发版(如 Red Hat Enterprise Linux (RHEL)、CentOS、Oracle Linux、Mariner 和 Fedora 中。

dnf 命令行包管理工具(或“Dandified Yum”)是一种现代化和增强的包管理器工具,适用于基于 RPM 的 Linux 分发版。

方案 1:存储库访问问题

您遇到与证书或网络连接相关的错误。

运行验证脚本

Azure 在 GitHub 上提供 Red Hat 更新基础结构(RHUI)存储库检查脚本。 此 Python 脚本包含以下功能:

  • 验证 RHUI 客户端证书。
  • 验证 RHUI rpm 一致性。
  • 检查扩展更新支持(EUS)与非 EUS 存储库配置及其要求之间的一致性。
  • 验证与 RHUI 存储库的连接。
  • 如果未检测到任何错误,则报告成功的存储库连接。
  • 验证与 RHUI 存储库的 SSL 连接。
  • 专注于 RHUI 存储库。
  • 使用定义的条件验证找到的错误,并提供修复建议。

支持的 Red Hat 映像

此版本的检查脚本当前仅支持从Azure 市场映像部署的以下 Red Hat VM:

  • RHEL 7.x PAYG 虚拟机
  • RHEL 8.x PAYG 虚拟机
  • RHEL 9.x PAYG 虚拟机
  • RHEL 10.x 按需付费虚拟机

如何运行 RHUI 检查脚本

若要运行检查脚本,请在 Red Hat VM 上输入以下 shell 命令:

Red Hat 7.x

  1. 如果 VM 具有 Internet 访问权限,请使用以下命令直接从 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 没有直接 Internet 访问权限,请从以下 URL 下载脚本: RHUI 检查脚本,将脚本传输到 VM,然后运行以下命令:

    sudo python2 ./rhui-check.py 
    
  3. 该脚本生成一个报告,其中包含找到的任何问题。 运行脚本后,其输出也会被保存到 /var/log/rhuicheck.log。

Red Hat 8.x、9.x 和 10.x

  1. 如果 VM 具有 Internet 访问权限,请使用以下命令直接从 VM 运行脚本:

    curl -sL https://raw.githubusercontent.com/Azure/azure-support-scripts/refs/heads/master/Linux_scripts/rhui-check/rhui-check.py | sudo python3 -
    
  2. 如果 VM 没有直接 Internet 访问权限,请从以下 URL 下载脚本: RHUI 检查脚本,将脚本传输到 VM,然后运行以下命令:

    sudo python3 ./rhui-check.py 
    

    重要

    如果找不到 /usr/libexec/platform-python 命令,请将 python3 替换为 python3。

  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 不兼容引起的。

若要修复此错误,必须删除导致冲突的旧包(在本例中, python2-leapp-0.16.0-1.el7_9.noarch)运行以下命令 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 可能会保留旧包版本以及要安装的新包。 在后续使用该工具期间,重复的包可能会导致系统操作混乱,并最终导致“受保护的多库”错误或误导性依赖项问题。

以下方案很典型:

  • 在更新过程中通过安全外壳 (SSH) 运行 yum update 并遇到连接中断
  • ** 向进程发送和信号,或选择Ctrl+C以在进程主动运行时终止进程。
  • 在更新过程中经历系统重启

解决方法 4

有两种可能的解决方案:尝试完成事务,或手动删除重复的包。 完成这些方法的步骤因 Linux 安装的分发和版本而异。

解决方案 4a:尝试完成交易事务

RHEL/Centos/Oracle Linux 7。x

  1. 通过运行以下 yum-complete-transaction 命令尝试完成事务:

    sudo yum-complete-transaction
    

    如果操作成功而不留下任何重复项,请转到步骤 2。

  2. 如果存在重复项,请通过在yum-complete-transaction命令中指定--cleanup-only参数来解决此事务。

    sudo yum-complete-transaction --cleanup-only
    

RHEL/Centos/Oracle Linux 8。x 和 9。x

  1. 通过运行以下 yum history 命令尝试完成事务:

    sudo yum history redo last
    
  2. 运行以下命令 yum remove ,删除旧版本的重复包。 若要维护系统的完整性,此命令将重新安装最新的包:

    sudo yum remove --duplicates
    

解决方案 4b:手动删除重复项

RHEL/Centos/Oracle Linux 7。x

  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>
    

RHEL/Centos/Oracle Linux 8。x 和 9。x

  1. 运行以下命令备份 /var/lib/dnf 和 /etc/dnf* 目录:

    sudo tar cjf /tmp/rpm_dbbkp.tar.bz2 /var/lib/{rpm,dnf} /etc/{dnf*,os-release} /usr/lib/os-release
    sudo dnf repoquery --duplicates --latest-limit=-1 -q &> /tmp/duplicateolder
    for i in `cat /tmp/duplicateolder`; do sudo rpm -ev --justdb --nodeps $i; done
    sudo yum update
    
  2. 删除重复项后,如果失败的事务中包含新内核,请重新安装内核,以确保正确安装大统一启动加载程序(GRUB)条目、初始 RAM 磁盘(initrd)和初始 RAM 文件系统(initramfs)。

    sudo dnf remove kernel-core-<newversion>-<release>.<arch> kernel-<newversion>-<release>.<arch>
    sudo dnf install kernel-core-<newversion>-<release>.<arch> kernel-<newversion>-<release>.<arch>
    

方案 5:Yum 不起作用,并显示“404 未找到”错误

输出中的 yum “404 找不到”错误消息指示 yum 找不到服务器上的包或资源。 如果 yum 尝试从存储库下载或访问包,但与它关联的包文件或元数据在服务器上缺失或不可用,则通常会发生此问题。 此方案有多种原因,包括:

  • 包或资源已从存储库中删除。
  • 存储库 URL 或配置不正确。
  • 网络问题可防止 yum 访问存储库服务器。
  • 发生临时服务器停机或维护。

此错误的示例显示在各种 Linux 分发版的示例输出中。

RHEL

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-

Oracle Linux

Oracle Linux 8 BaseOS Latest (x86_64)           0.0  B/s |   0  B     00:00    
Errors during downloading metadata for repository 'ol8_baseos_latest':
  - Curl error (6): Couldn't resolve host name for https://yumiad.oracle.com/repo/OracleLinux/OL8/baseos/latest/x86_64/repodata/repomd.xml [Could not resolve host: yumiad.oracle.com]
Error: Failed to download metadata for repo 'ol8_baseos_latest': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried

CentOS

http://olcentgbl.trafficmanager.net/centos/7.9/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
Trying other mirror.
http://olcentgbl.trafficmanager.net/centos/7.9/updates/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
Trying other mirror.
http://olcentgbl.trafficmanager.net/openlogic/7.9/openlogic/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
Trying other mirror.
repolist: 0

解决方案 5

以下可能的解决方案适用于各种 Linux 分发版。

RHEL

请确保在扩展更新支持(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<><>
    非欧盟 rhui-azure-rhelX-new-version-release.noarch<><>
  2. 运行以下命令 cat ,确定发布版本的当前值。

    RHEL 版本 命令
    RHEL 7 sudo cat /etc/yum/vars/releasever
    RHEL 8 和 10 sudo cat /etc/dnf/vars/releasever
  3. 修改并使用发布版本的正确数值:

    • 如果系统使用的是 EUS 存储库,请确保应用适当的版本锁。 在以下示例中,为 RHEL 9.2 添加了版本锁,因为 RHUI EUS 使用了存储库:

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

      注意

      对 RHEL 7 EUS 的支持于 2021 年 8 月 30 日结束。 建议不再在 RHEL 7 中使用 EUS 存储库。

      对 RHEL 8 EUS 的支持于 2025 年 5 月 31 日结束。 RHEL 8.10 是 RHEL 8 的最后一个计划次要版本,仍受支持,但不是 EUS 版本。 建议不再在 RHEL 8 中使用 EUS 存储库,而是切换到非 EUS 存储库。

      RHEL 9.适用于 EUS 的 x 版本可用。 目前,这些版本包括 RHEL 9.6 和 9.4。

      RHEL 10。适用于 EUS 的 x 版本可用。 目前,这些版本仅包括 RHEL 10.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 和 10 sudo echo "" > /etc/dnf/vars/releasever

Oracle Linux

如果您使用的是 Oracle Linux (OL) 的即用即付 (PAYG) 映像,则这些映像已预先配置为访问由 Oracle 托管的 Public yum。

Azure 中的 Oracle Linux 不需要 使用 ociregion 文件,因为 Oracle Linux 已预配置以使用公共 yum 存储库。

请确保 ociregion 文件没有任何内容。 为此,请按照下列步骤进行操作:

  1. 通过运行以下命令 cat 验证当前内容:

    sudo cat /etc/yum/vars/ociregion
    
  2. 清除 ociregion 文件中的内容:

    sudo echo "" > /etc/yum/vars/ociregion
    

CentOS

CentOS 映像由第三方供应商 OpenLogic 提供。 有关详细信息,请参阅 Openlogic-Azure-Images。

请确保 Azure 中的 CentOS VM 上不存在 /etc/yum/vars/releasever 文件。 为此,请按照下列步骤进行操作:

  1. 检查 releasever* 文件是否存在*。 为此,请运行以下命令 cat :

    sudo cat /etc/yum/vars/releasever
    
  2. 移除releasever文件,运行rm命令:

    sudo rm -f /etc/yum/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 数据库:

重要

在执行这些步骤之前,请确保有足够的可用磁盘空间。

  1. 通过运行以下命令创建*/var/lib/rpm*目录的备份:

    sudo tar zcvf /var/lib/rpm-backup.tar.gz /var/lib/rpm
    
  2. 若要避免过时锁定,请删除 __db* 文件并验证包文件的完整性:

    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 --Forbidden”

如果你在 Red Hat 7.x 版本的 VM 上运行 yum 命令,并且该 VM 已连接到 RHUI,将会出现以下错误。

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 提供的最新版本的 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
      
  3. 使用步骤 2 中的 rpm 文件降级 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 不保证第三方联系信息的准确性。

资料来源与适用范围

资料来源
微软官方 Linux 虚拟机排障文档
适用范围
Azure Linux 虚拟机;按正文发行版、内核及代理版本
内容语言
中文;命令、路径和错误标识保留技术原文
本地收录日期
2026-10-26
授权说明
CC BY 4.0

正文与所需资源由本站本地存储。查看来源及更新记录 ↗

请按适用版本和实际日志确认原因;本站没有对每一种系统或设备逐项执行文中的操作。