Red Hat Training

A Red Hat training course is available for RHEL 8

第 12 章 管理软件包

12.1. Red Hat Enterprise Linux 8 中的软件管理工具

在 RHEL 8 中,软件安装由基于 DNF 技术的 YUM 工具(YUM v4)的新版本启用。

注意

上游文档将此技术称为 DNF,这个工具在上游社区被称为 DNF。因此,RHEL 8 中新 YUM 工具返回的一些输出会引用 DNF

尽管 RHEL 8 中使用的 YUM v4 是基于 DNF的,但它与 RHEL 7 中使用的 YUM v3 兼容。对于软件安装, yum 命令及其大多数选项在 RHEL 8 中的工作方式与在 RHEL 7 中相同。

精选的 yum 插件和工具已移植到新的 DNF 后端,并可按照与 RHEL 7 的名称相同的安装。软件包也提供兼容性符号链接,因此可在通常的位置找到 二进制文件、配置文件和目录。

请注意,YUM v3 提供的旧版本的 Python API 不再可用。您可以将插件和脚本迁移到 YUM v4 (DNF Python API)提供的新 API 中,该 API 是稳定并被完全支持的。如需更多信息,请参阅 DNF API 参考

12.2. 应用程序流

Red Hat Enterprise Linux 8 引进了应用程序流(Application Streams)的概念。和操作系统软件包相比,现在为用户空间组件提供了多个版本且会更频繁地进行更新。这为自定义 Red Hat Enterprise Linux 提供了更大的灵活性,不会影响平台或特定部署的基本稳定性。

作为 Application Streams 提供的组件可打包为模块(module)或 RPM 软件包,并通过 RHEL 8 中的 AppStream 软件仓库提供。每个 Application Stream 都有一个生命周期,它与 RHEL 8 的生命周期相同或更短。Red Hat Enterprise Linux 8 Application Streams 生命周期页中列出了生命周期较短的 Application Streams

模块是代表逻辑单元的软件包集合: 应用程序、语言堆栈、数据库或一组工具。这些软件包被一同构建、测试并发布。

模块流代表 Application Stream 组件的版本。例如,PostgreSQL 数据库服务器的两个流(版本)位于 postgresql 模块中: PostgreSQL 10(默认流)和 PostgreSQL 9.6。在系统中只能安装 一 个模块流。不同的容器可以使用不同的版本。

详细的模块命令,请参考 安装、管理和删除用户空间组件文档。有关 AppStream 中可用模块列表,请查看 软件包清单

12.3. 搜索软件包

yum 允许您使用软件包执行一组完整的操作。

下面的部分描述了如何使用 yum:

  • 搜索软件包。
  • 列出软件包。
  • 列出软件仓库。
  • 显示软件包信息。
  • 列出软件包组。
  • 在 yum 输入中指定全局表达式。

12.3.1. 使用 yum 搜索软件包

  • 要搜索软件包,使用:

    # yum search term

    使用与该软件包相关的术语替换 term

    请注意, yum search 命令返回与软件包名称和概述中的术语匹配。这样可加快搜索速度,您可以搜索您不知道名称但您了解相关术语的软件包。

  • 要在软件包描述中包含匹配名,请使用:

    # yum search --all term

    用您要在软件包名称、概述或描述中搜索的术语替换 term

    请注意, yum search --all 启用了更详细但更慢的搜索。

12.3.2. 使用 yum 列出软件包

  • 要列出所有安装以及可用软件包的信息,请使用:

    # yum list --all
  • 要列出安装在您的系统中的所有软件包,请使用:

    # yum list --installed
  • 要列出所有启用的库中所有可用来安装的软件包,请使用:

    # yum list --available

请注意,您可以通过将全局表达式附加为参数来过滤结果。详情请查看 第 12.3.6 节 “在 yum 输入中指定全局表达式”

12.3.3. 使用 yum 列出库

  • 要列出您系统中所有启用的库,请使用:

    # yum repolist
  • 要列出系统中所有禁用的软件仓库,请使用:

    # yum repolist --disabled
  • 要列出启用和禁用的存储库,请使用:

    # yum repolist --all
  • 要列出有关存储库的附加信息,请使用:

    # yum repoinfo

请注意,您可以通过传递 ID 或库名称作为参数或者附加全局表达式来过滤结果。详情请查看 第 12.3.6 节 “在 yum 输入中指定全局表达式”

12.3.4. 使用 yum 显示软件包信息

  • 要显示一个或多个软件包的信息,请使用:

    # yum info package-name

    使用软件包名称替换 package-name

请注意,您可以通过将全局表达式附加为参数来过滤结果。详情请查看 第 12.3.6 节 “在 yum 输入中指定全局表达式”

12.3.5. 使用 yum 列出软件包组

  • 要查看已安装的和可用组的数量,请使用:

    # yum group summary
  • 要列出所有安装的和可用的组,请使用:

    # yum group list

    请注意,您可以通过为 yum group list 命令添加命令行选项(--hidden--available)过滤结果。更多可用选项请查看 man page。

  • 要列出特定组群中包含的强制和可选软件包,请使用:

    # yum group info group-name

    用组群的名称替换 group-name

请注意,您可以通过将全局表达式附加为参数来过滤结果。详情请查看 第 12.7.4 节 “在 yum 输入中指定全局表达式”

12.3.6. 在 yum 输入中指定全局表达式

yum 命令允许您将一个或多个 glob 表达式附加为参数来过滤结果。当作为参数传递给 yum 命令时,全局表达式必须被转义。要确定将全局表达式传递给 yum,请使用以下方法之一:

  • 使用双引号或单引号包括整个全局表达式。

    # yum provides "*/file-name"

    用文件名替换 file-name

  • 在它们前面使用反斜杠(\)字符转义通配符字符。

    # yum provides \*/file-name

    用文件名替换 file-name

12.4. 安装软件包

下面的部分描述了如何使用 yum:

  • 安装软件包。
  • 安装软件包组。
  • 在 yum 输入中指定软件包名称。

12.4.1. 使用 yum 安装软件包

  • 要安装软件包以及所有软件包的依赖软件包,请使用:

    # yum install package-name

    使用软件包名称替换 package-name

  • 要同时安装多个软件包及其依赖软件包,请使用:

    # yum install package-name-1 package-name-2

    使用软件包名称替换 package-name-1package-name-2

  • 当在一个 multilib 系统(AMD64、Intel 64 机器)中安装软件包时,您可以指定软件包的构架,方法是将其附加到软件包名称中:

    # yum install package-name.arch

    使用软件包的名称和构架替换 package-name.arch

  • 如果您知道要安装的二进制代码的名称,但不知道软件包名,则可以使用到这个二进制代码的路径作为一个参数:

    # yum install /usr/sbin/binary-file

    使用二进制文件的路径替换 /usr/sbin/binary-file

    yum 搜索软件包列表,找到提供 /usr/sbin/binary-file 的软件包,并提示您是否要安装它。

  • 要从本地目录中安装之前下载的软件包,请使用:

    # yum install /path/

    使用到该软件包的路径替换 /path/

请注意,您可以通过显式定义如何解析参数来优化软件包搜索。详情请查看 第 12.4.3 节 “在 yum 输入中指定软件包名称”

12.4.2. 使用 yum 安装软件包组

  • 要根据组名称安装软件包组,请使用:

    # yum group install group-name

    或者

    # yum install @group-name

    使用组群或者环境组群的完整名称替换 group-name

  • 要根据 groupID 安装软件包组,请使用:

    # yum group install groupID

    使用组 ID 替换 groupID

12.4.3. 在 yum 输入中指定软件包名称

要优化安装和删除过程,您可以在 yum installyum remove 命令中附加 -n-na-nerva 后缀,以明确定义如何解析参数:

  • 要使用准确的名称安装软件包,请使用:

    # yum install-n name

    使用具体软件包名称替换 name

  • 要使用准确的名称和构架安装软件包,请使用:

    # yum install-na name.architecture

    使用软件包的实际名称和构架替换 namearchitecture

  • 要使用准确的名称、epoch、version、release 和 architecture 安装软件包,请使用:

    # yum install-nevra name-epoch:version-release.architecture

    用软件包的名称、epoch、版本、发行和架构替换 nameepochversionreleasearchitecture

12.5. 更新软件包

yum 允许您检查您的系统是否有待处理的更新。您可以列出需要更新的软件包,并选择更新单个软件包、多个软件包或者所有软件包。如果您选择更新的软件包有依赖项,它们也会被更新。

下面的部分描述了如何使用 yum:

  • 检查更新。
  • 更新单个软件包。
  • 更新软件包组。
  • 更新所有软件包及其依赖项。
  • 应用安全更新。
  • 自动软件更新。

12.5.1. 检查 yum 更新

  • 要查看您系统中安装的软件包是否有可用的更新,请使用:

    # yum check-update

    输出返回有可用更新的软件包及其依赖项列表。

12.5.2. 使用 yum 更新单个软件包

  • 要更新软件包,请使用:

    # yum update package-name

    使用软件包名称替换 package-name

重要

当对内核应用更新时, yum 总会 安装 一个新内核,无论您是使用 yum update 还是 yum install 命令。

12.5.3. 使用 yum 更新软件包组

  • 要更新软件包组,请使用:

    # yum group update group-name

    使用软件包组的名称替换 group-name

12.5.4. 使用 yum 更新所有软件包及其依赖项

  • 要更新所有软件包及其依赖项,请使用:

    # yum update

12.5.6. 自动化软件更新

要自动检查并下载软件包更新,您可以使用 dnf-automatic 软件包提供的 DNF Automatic 工具。

DNF Automaticyum 的替代命令行界面,它适用于使用 systemd 计时器、cron 任务和其它此类工具自动和常规执行。

DNF Automatic 根据需要同步软件包元数据,然后检查可用更新。之后,该工具可以根据您的配置方式执行以下操作之一:

  • Exit
  • 下载更新的软件包
  • 下载并应用更新

然后,操作的结果由所选机制报告,如标准输出或电子邮件。

12.5.6.1. 安装 DNF Automatic

以下流程描述了如何安装 DNF Automatic 工具。

流程

  • 要安装 dnf-automatic 软件包,请使用:

    # yum install dnf-automatic

验证步骤

  • 要验证成功安装,请运行以下命令确认是否存在 dnf-automatic 软件包:

    # rpm -qi dnf-automatic

12.5.6.2. DNF Automatic 配置文件

默认情况下,DNF Automatic 使用 /etc/dnf/automatic.conf 作为其配置文件定义其行为。

配置文件被分隔为以下主题部分:

  • [commands] 部分

    设置 DNF Automatic 的操作模式。

  • [emitters] 部分

    定义如何报告 DNF Automatic 的结果。

  • [command_email] 部分

    为用来发送电子邮件的外部命令提供电子邮件发布程序配置。

  • [email] 部分

    提供电子邮件发布程序配置。

  • [base] 部分

    覆盖 yum 主配置文件中的设置。

使用 /etc/dnf/automatic.conf 文件的默认设置, DNF Automatic 检查可用更新,下载它们,并将结果报告为标准输出。

警告

[commands] 部分中的操作模式设置会被 systemd 计时器单元用于除 dnf-automatic.timer 以外的所有计时器单元的设置覆盖。

其它资源

12.5.6.3. 启用 DNF Automatic

要运行 DNF Automatic,您始终需要启用并启动特定的 systemd 计时器单元。您可以使用 dnf-automatic 软件包中提供的计时器单元之一,或者根据需要编写您自己的计时器单元。

下面的部分论述了如何启用 DNF Automatic

先决条件

  • 您可以通过修改 /etc/dnf/automatic.conf 配置文件来指定 DNF Automatic 的行为。

有关 DNF Automatic 配置文件的更多信息,请参阅 section 2.5.6.2 "DNF Automatic 配置文件"。

流程

  • 选择、启用并启动一个符合您需要的 systemd 计时器单元:

    # systemctl enable --now <unit>

    其中 <unit> 是以下计时器之一:

    • dnf-automatic-download.timer
    • dnf-automatic-install.timer
    • dnf-automatic-notifyonly.timer
    • dnf-automatic.timer

下载 可用更新,请使用:

# systemctl enable dnf-automatic-download.timer
# systemctl start dnf-automatic-download.timer

下载并安装 可用更新,请使用:

# systemctl enable dnf-automatic-install.timer
# systemctl start dnf-automatic-install.timer

报告 可用更新,请使用:

# systemctl enable dnf-automatic-notifyonly.timer
# systemctl start dnf-automatic-notifyonly.timer

另外,您可以使用:

# systemctl enable dnf-automatic.timer
# systemctl start dnf-automatic.timer

就下载和应用更新而言,这个计时器单元的行为根据 /etc/dnf/automatic.conf 配置文件中的设置实现。默认行为类似于 dnf-automatic-download.timer:它下载更新的软件包,但不安装它们。

注意

另外,您还可以从命令行或自定义脚本直接执行 /usr/bin/dnf-automatic 文件来运行 DNF Automatic

验证步骤

  • 要验证是否启用了计时器,请运行以下命令:

    # systemctl status <systemd timer unit>

其它资源

12.5.6.4. dnf-automatic 软件包中包含的 systemd 计时器单元概述

systemd 计时器单元优先使用 /etc/dnf/automatic.conf 配置文件中有关下载和应用更新的设置。

例如,如果您设置了:

download_updates = yes

/etc/dnf/automatic.conf 配置文件中,但已激活了 dnf-automatic-notifyonly.timer 单元,软件包不会下载。

dnf-automatic 软件包包括以下 systemd 计时器单元:

计时器单元功能覆盖 /etc/dnf/automatic.conf 文件中的设置?

dnf-automatic-download.timer

下载软件包以便进行更新。

注: 这个计时器单元没有安装更新的软件包。要执行安装,您必须执行 dnf update 命令。

dnf-automatic-install.timer

下载并安装更新的软件包。

dnf-automatic-notifyonly.timer

只下载存储库数据以保持存储库缓存最新状态,并通知您可用更新。

注: 这个计时器单元不下载或安装更新的软件包

dnf-automatic.timer

此计时器有关下载和应用更新的行为是由 /etc/dnf/automatic.conf 配置文件中的设置指定。

默认行为与 dnf-automatic-download.timer 单元相同:它只下载软件包,但不安装它们。

其它资源

12.6. 卸载软件包

下面的部分描述了如何使用 yum:

  • 删除软件包。
  • 删除软件包组。
  • 在 yum 输入中指定软件包名称。

12.6.1. 使用 yum 删除软件包

  • 要删除某个软件包以及所有相依性软件包,请使用:

    # yum remove package-name

    使用软件包名称替换 package-name

  • 要同时删除多个软件包及其依赖项,请使用:

    # yum remove package-name-1 package-name-2

    使用软件包名称替换 package-name-1package-name-2

注意

在删除其依赖软件包前。yum 无法删除软件包。

请注意,您可以通过显式定义如何解析参数来优化软件包搜索。详情请查看 第 12.6.3 节 “在 yum 输入中指定软件包名称”

12.6.2. 使用 yum 删除软件包组

  • 要根据组群名称删除软件包组,请使用:

    # yum group remove group-name

    或者

    # yum remove @group-name

    使用组群的全名替换 group-name

  • 要通过 groupID 删除软件包组,请使用:

    # yum group remove groupID

    使用组 ID 替换 groupID

12.6.3. 在 yum 输入中指定软件包名称

要优化安装和删除过程,您可以在 yum installyum remove 命令中附加 -n-na-nerva 后缀,以明确定义如何解析参数:

  • 要使用准确的名称安装软件包,请使用:

    # yum install-n name

    使用具体软件包名称替换 name

  • 要使用准确的名称和构架安装软件包,请使用:

    # yum install-na name.architecture

    使用软件包的实际名称和构架替换 namearchitecture

  • 要使用准确的名称、epoch、version、release 和 architecture 安装软件包,请使用:

    # yum install-nevra name-epoch:version-release.architecture

    用软件包的名称、epoch、版本、发行和架构替换 nameepochversionreleasearchitecture

12.7. 管理软件包组

软件包组是用于共同目的的软件包集合(System ToolsSound and Video)。安装软件包组会拉取一组依赖软件包,这可节省大量时间。

下面的部分描述了如何使用 yum:

  • 列出软件包组。
  • 安装软件包组。
  • 删除软件包组。
  • 在 yum 输入中指定全局表达式。

12.7.1. 使用 yum 列出软件包组

  • 要查看已安装的和可用组的数量,请使用:

    # yum group summary
  • 要列出所有安装的和可用的组,请使用:

    # yum group list

    请注意,您可以通过为 yum group list 命令添加命令行选项(--hidden--available)过滤结果。更多可用选项请查看 man page。

  • 要列出特定组群中包含的强制和可选软件包,请使用:

    # yum group info group-name

    用组群的名称替换 group-name

请注意,您可以通过将全局表达式附加为参数来过滤结果。详情请查看 第 12.7.4 节 “在 yum 输入中指定全局表达式”

12.7.2. 使用 yum 安装软件包组

  • 要根据组名称安装软件包组,请使用:

    # yum group install group-name

    或者

    # yum install @group-name

    使用组群或者环境组群的完整名称替换 group-name

  • 要根据 groupID 安装软件包组,请使用:

    # yum group install groupID

    使用组 ID 替换 groupID

12.7.3. 使用 yum 删除软件包组

  • 要根据组群名称删除软件包组,请使用:

    # yum group remove group-name

    或者

    # yum remove @group-name

    使用组群的全名替换 group-name

  • 要通过 groupID 删除软件包组,请使用:

    # yum group remove groupID

    使用组 ID 替换 groupID

12.7.4. 在 yum 输入中指定全局表达式

yum 命令允许您将一个或多个 glob 表达式附加为参数来过滤结果。当作为参数传递给 yum 命令时,全局表达式必须被转义。要确定将全局表达式传递给 yum,请使用以下方法之一:

  • 使用双引号或单引号包括整个全局表达式。

    # yum provides "*/file-name"

    用文件名替换 file-name

  • 在它们前面使用反斜杠(\)字符转义通配符字符。

    # yum provides \*/file-name

    用文件名替换 file-name

12.8. 处理软件包管理历史记录

yum history 命令允许您查看有关 yum 事务的范围、发生日期和时间、受影响的软件包数量、这些事务是成功还是被终止的信息,以及 RPM 数据库在事务间是否有变化。yum history 也可以用命令来撤销或重做事务。

下面的部分描述了如何使用 yum:

  • 列出事务。
  • 恢复事务。
  • 重复事务。
  • 在 yum 输入中指定全局表达式。

12.8.1. 使用 yum 列出事务

  • 要显示所有最新的 yum 事务列表,请使用:

    # yum history
  • 要显示所选软件包的最新操作列表,请使用:

    # yum history list package-name

    使用软件包名称替换 package-name。您可以通过附加全局表达式来过滤命令输出。详情请查看 第 12.8.4 节 “在 yum 输入中指定全局表达式”

  • 要检查特定的事务,请使用:

    # yum history info transactionID

    用事务的 ID 替换 transactionID

12.8.2. 使用 yum 恢复事务

  • 要恢复特定的事务,请使用:

    # yum history undo transactionID

    用事务的 ID 替换 transactionID

  • 要恢复到最后的事务,请使用:

    # yum history undo last

请注意, yum history undo 命令只恢复事务期间执行的操作步骤。如果事务安装了一个新的软件包, yum history undo 命令会卸载它。如果事务卸载了软件包,yum history undo 命令会重新安装它。yum history undo 另外,如果旧的软件包仍然可用,则尝试将所有更新的软件包降级到之前的版本。

12.8.3. 使用 yum 重复事务

  • 要重复特定的事务,请使用:

    # yum history redo transactionID

    用事务的 ID 替换 transactionID

  • 要重复最后的事务,请使用:

    # yum history redo last

请注意, yum history redo 命令只重复事务期间执行的操作步骤。

12.8.4. 在 yum 输入中指定全局表达式

yum 命令允许您将一个或多个 glob 表达式附加为参数来过滤结果。当作为参数传递给 yum 命令时,全局表达式必须被转义。要确定将全局表达式传递给 yum,请使用以下方法之一:

  • 使用双引号或单引号包括整个全局表达式。

    # yum provides "*/file-name"

    用文件名替换 file-name

  • 在它们前面使用反斜杠(\)字符转义通配符字符。

    # yum provides \*/file-name

    用文件名替换 file-name

12.9. 管理软件存储库

yum 及相关工具的配置信息保存在 /etc/yum.conf 文件中。此文件包含一个或多个 [repository] 部分,用于设置特定软件仓库选项。

建议您在 .repo 目录中的新或现有 /etc/yum.repos.d/ 文件中定义单独的软件仓库。

请注意,您在 [repository] 文件的独立 /etc/yum.conf 部分中定义的值会覆盖 [main] 部分中设置的值。

下面的部分描述了如何:

  • 设置 [repository] 选项。
  • 添加 yum 软件仓库。
  • 启用 yum 软件仓库。
  • 禁用 yum 软件仓库。

12.9.1. 设置 yum 软件仓库选项

/etc/yum.conf 配置文件包含 [repository] 部分,其中 repository 是唯一 的存储库 ID。[repository] 部分允许您定义独立的 yum 软件仓库。

注意

不要给出红帽软件仓库使用的自定义软件仓库名称以避免冲突。

有关可用 [repository] 选项的完整列表,请查看 yum.conf(5)手册页中的 [repository] OPTIONS 部分。

12.9.2. 添加 yum 软件仓库

要定义新软件仓库,您可以:

  • /etc/yum.conf 文件中添加 [repository] 部分。
  • /etc/yum.repos.d/ 目录中的 .repo 文件中添加 [repository] 部分。

    yum 软件仓库通常提供它们自己的 .repo 文件。

注意

建议您在 .repo 文件中而不是 /etc/yum.conf 中定义您的程序库,因为在这个目录中的所有 .repo 文件扩展名都被 yum 读取。

  • 要在您的系统中添加库并启用该程序,请使用:

    # yum-config-manager --add-repo repository_URL

    使用指向库的 URL 替换 repository_url

警告

从基于红帽证书的 Content Delivery Network (CDN)以外的未经验证或不受信任的源获取并安装软件包会存在潜在的安全隐患,并可能导致安全、稳定性、兼容性和维护问题。

12.9.3. 启用 yum 软件仓库

12.9.4. 禁用 yum 软件仓库

12.10. 配置 yum

yum 及相关工具的配置信息保存在 /etc/yum.conf 文件中。这个文件包含一个必须的 [main] 部分,它可让您设置具有全局效果的 yum 选项。

下面的部分描述了如何:

  • 查看当前的 yum 配置。
  • 设置 yum [main] options。
  • 使用 yum 插件。

12.10.1. 查看当前的 yum 配置

  • 要显示在 /etc/yum.conf 文件的 [main] 部分指定的全局 yum 选项的当前值,请使用:

    # yum config-manager --dump

12.10.2. 设置 yum 主选项

/etc/yum.conf 配置文件包含一个 [main] 部分。本节中的键值对会影响 yum 如何运行和对待软件仓库。

您可以在 /etc/yum.conf[main] 部分标题下添加附加选项。

有关可用 [main] 选项的完整列表,请查看 yum.conf(5)手册页中的 [main] OPTIONS 部分。

12.10.3. 使用 yum 插件

yum 提供扩展和增强操作的插件。默认安装某些插件。

下面的部分论述了如何启用、配置和禁用 yum 插件。

12.10.3.1. 管理 yum 插件

插件配置文件始终包含 [main] 部分,其中 enabled= 选项控制在运行 yum 命令时插件是否启用。如果缺少这个选项,您可以手动将其添加到该文件中。

每个安装的插件在 /etc/dnf/plugins/ 目录中都有自己的配置文件。您可以在这些文件中启用或禁用特定插件选项。

12.10.3.2. 启用 yum 插件

  • 启用所有 yum 插件:

    1. 确定 /etc/yum.conf 文件的 [main] 部分有以 plugins= 开头的行。
    2. plugins= 的值设置为 1

      plugins=1

12.10.3.3. 禁用 yum 插件

  • 禁用所有 yum 插件:

    1. 确定 /etc/yum.conf 文件的 [main] 部分有以 plugins= 开头的行。
    2. plugins= 的值设置为 0

      plugins=0
      重要

      不建议禁用所有插件。某些插件提供重要的 yum 服务。特别是 product-idsubscription-manager 插件,它们支持基于证书的 Content Delivery Network (CDN)。在全局范围内禁用插件作为一个方便的选项,只有在诊断 yum 的潜在问题时才建议使用。

  • 要禁用特定命令的所有 yum 插件,请在该命令中附加 --noplugins 选项。

    # yum --noplugins update
  • 要在单个命令中禁用特定的 yum 插件,请在该命令中附加 --disableplugin=plugin-name 选项。

    # yum update --disableplugin=plugin-name

    使用插件的名称替换 plugin-name