排查适用于 Linux 的 yum 和 dnf 包管理工具中的常见问题

适用于:✔️ Linux VM

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

注意

本文引用了 CentOS,这是一个 Linux 分发版,已达到其终止生命周期(EOL)。 请相应地考虑使用和规划。 有关详细信息,请参阅 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 VM
  • RHEL 8.x PAYG VM
  • RHEL 9.x PAYG VM
  • RHEL 10.x 按需付费虚拟机

如何运行 RHUI 检查脚本

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

  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 其中。

解决方案 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

若要结束此包排除,请使用文本编辑器(例如,或)删除或注释掉 /etc/yum.confvim的条目。nano

方案 3:Python 版本错误

yumdnfrpm工具是用 Python 编写的,取决于 Python 解释器才能正常运行。 具体而言,它们依赖于 Python 解释器提供的某些功能和库来运行其代码并与系统交互。 更改系统上安装的默认 Python 版本可能会导致特定 yum Python 版本和配置存在问题或 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 可能会保留旧包版本以及要安装的新包。 在后续使用该工具期间,重复的包可能会导致系统操作混乱,并最终导致“受保护的多库”错误或误导性依赖项问题。

以下方案很典型:

  • 在更新过程中通过安全外壳 (SSH) 运行 yum update 并遇到连接中断

  • 向进程发送信号SIGINTkill -2yum,或选择 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<><>
    非欧盟 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. 通过运行以下命令创建 /var/lib/rpmtar备份:

    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”

如果在 yum Red Hat 7 上运行命令,将显示以下错误。连接到 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 提供的最新版本curllibcurllibcurl-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 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区