DNF是基于 RPM 的 Linux 发行版的软件包管理器,包括 RHEL、Fedora、CentOS、AlmaLinux、Rocky Linux 和 Oracle Linux。它最初于 2013 年在 Fedora 18 中引入。
DNF 可自动检查依赖关系,并确定在 Linux 系统的软件包库中安装、删除、更新或执行任何其他操作所需的操作,从而简化软件包维护工作。此外,DNF 软件包管理器还可以管理和收集 Linux 系统上软件仓库的信息。
许多人可能对它的前身 YUM 并不陌生。因此,在进一步了解之前,我们先来看看 DNF 与 YUM 相比有哪些优势:
与 DNF 一样,YUM(YellowDog Updater Modified)也是一个软件包管理器,用于管理基于 RPM 的 Linux 系统中软件包的安装、更新和删除。
遗憾的是,YUM 存在一些问题,其中最严重的是性能不佳、内存使用率过高和依赖关系解决延迟。所有这些都促使我们开发出更优越的 YUM 版本,这就是 DNF 出现的原因。
综上所述,我们可以概括出 DNF 相对于 YUM 的以下最基本优势:
DNF 利用 libsolv(由 openSUSE 创建和维护)来解析依赖关系,这是一个更高效的依赖关系解析库。
由于 DNF 是用 C、C++ 和 Python 开发的,因此运行速度快,占用内存少。相比之下,YUM 完全是用 Python 编写的。
DNF 的 API 文档齐全。相比之下,由于 YUM 的应用程序接口没有适当的文档记录,因此添加新功能具有挑战性。
YUM 只支持 Python 扩展,而 DNF 支持许多扩展。
既然你已经知道 DNF 是什么,为什么它比 YUM 更优越,那么就让我们进入本指南:如何使用 DNF 管理基于 RPM 的 Linux 发行版中的软件包。
检查可用的软件包更新,使用下面的命令,您可以从启用的软件库中获取可用于更新系统上现有软件包的所有软件包列表,该命令会检查更新,但不会下载或安装软件包:
dnf check-update
全面系统更新,如果有任何可用更新,请使用以下命令将其全部安装。
sudo dnf update
仅更新某些软件包,或者,使用以下命令只更新选定的软件包,例如 nginx 和 mariadb。
sudo dnf update nginx mariadb
仅不更新:
sudo dnf update --exclude nginx mariadb
另一个广泛使用的 DNF 基本功能是软件包搜索。例如,如果我们想查看软件仓库中是否有 nginx 软件包,请键入以下命令:
sudo dnf search nginx
要使用 dnf 命令安装新软件包,例如 nginx,请运行下面命令,跟yum一样,可以加-y参数免确认安装:
sudo dnf install nginx
重装软件包:
sudo dnf reinstall nginx
本地安装 RPM 文件:
sudo dnf install /home/linuxiac/nginx-1.20.1-10.el9.alma.x86_64.rpm
RPM 文件与安装软件包相比,我们可以选择只从软件源下载 .rpm 安装文件。默认情况下,软件包会下载到当前工作目录。不过,如果要将 .rpm 文件下载到当前目录以外的其他目录,请使用 --destdir 选项,并在其后跟上目录路径。
sudo dnf download nginx
DNF 软件包管理器的另一个常用功能是删除/卸载软件包。删除参数可用于卸载软件包。例如,要卸载 nginx 软件包,应运行:
sudo dnf remove nginx
删除不必要的软件包:
删除不需要的软件包有助于减少磁盘使用量和潜在问题。例如,自动删除选项会从系统中删除所有作为用户安装的软件包的依赖关系而安装的 "子 "软件包,但任何此类软件包都不再需要它们。
sudo dnf autoremove
在某些情况下,您可能希望恢复到软件包先前的更新版本。例如,如果更新版本中未检测到的错误导致系统出错。因此,要降级先前更新的软件包,例如nginx,请使用以下命令:
sudo dnf downgrade nginx
一旦我们知道了如何查看可用软件组列表,就应该知道它们包含哪些软件包。例如,要查看 "开发工具 "组中的可用软件包,请键入:
sudo dnf groupinfo "Development Tools"
使用 groupinstall 选项可以轻松安装软件组。例如,如果要安装 "开发工具 "组,可按下图所示完成安装:
sudo dnf groupinstall "Development Tools"
与安装类似,使用 groupremove 选项卸载整个软件组也很简单。
sudo dnf groupremove "Development Tools"
当我们查找软件包或想检查系统中是否已安装软件包时,显示软件包列表会很有帮助。下面我们就来看看如何使用 dnf 命令获取这些信息。
列出所有软件包:
要查看所有可用软件包的列表,请运行下面的命令。它将输出一个庞大的软件包列表。其中包括系统本地安装的所有软件包,以及系统可用和允许安装的软件仓库中的所有软件包:
sudo dnf list
列出所有已安装的软件包:
下面的命令将返回 Linux 系统本地安装的所有 RPM 软件包的完整列表。
sudo dnf list installed
列出特定软件源中安装的所有软件包,如果您想查看从特定软件源(例如 EPEL 软件源)安装到系统上的软件包列表,请键入:
sudo dnf repository-packages epel list installed
使用 dnf list installed 命令是最有价值、最实用的方法之一。你可以用它来查看系统中是否安装了某个软件包。例如,要查看 nginx 软件包是否已安装,请运行
sudo dnf list installed 命令,并将结果导入 grep 命令,然后输入要查找的软件包名称。
sudo dnf list installed | grep nginx
我们可以看到,该命令会返回软件包(如果已在本地安装)、版本和所属软件仓库的信息。
info 选项可用于查看软件包的详细信息。这将为我们提供有用的信息,如架构、版本号、发布号、总大小以及软件包实际执行功能的描述。例如,要查看 nginx 软件包信息,请运行下面的命令:
sudo dnf info nginx
*需要注意的是,无论软件包是否安装在本地 Linux 系统上,该命令都会返回相关信息。
软件包仓库(在 DNF 中)是用于存储和管理 RPM 软件安装包的仓库。它支持 DNF 和 YUM 等客户端,这些客户端用于管理基于 RHEL 的 Linux 发行版(如 CentOS、AlmaLinux、Rocky Linux 和 Oracle Linux)中的二进制软件包。
列出已安装的软件源:
以下命令将显示 Linux 系统中可用的所有(已启用和已禁用)软件包仓库:
sudo dnf repolist --all
此外,如果您只想获得允许使用的软件源列表,请键入:
sudo dnf repolist sudo dnf repository-packages epel list installed
可以通过手动编辑或在 /etc/yum.repos.d 目录中创建新的 .repo 文件来添加新的软件仓库。不过,DNF 软件包管理器能大大简化添加软件仓库的操作,以便从中安装或更新软件包。
dnf config-manager 命令可用于添加持久性软件仓库。在 --add-repo 选项后提供一个已知的软件源 URL,就会根据指定的软件源 URL 名称创建一个 .repo 文件。
sudo dnf config-manager --add-repo https://rpms.remirepo.net/enterprise/9/remi/x86_64/
添加版本库,启用版本库:
要启用特定版本库,请键入以下命令,其中最后一个参数是版本库 ID。例如,dnf repolist --all 命令的输出会提供版本库 ID。
udo dnf config-manager --set-enabled rpms.remirepo.net_enterprise_9_remi_x86_64_
或者,您也可以禁用软件包资源库,如运行:
sudo dnf config-manager --set-disabled rpms.remirepo.net_enterprise_9_remi_x86_64_
DNF 软件包管理器会缓存 /var/cache/dnf 目录中的文件。其中包括禁用或移除的软件源以及各种发行版本所留下的任何此类数据。当然,不建议手动删除 /var/cache/dnf 目录下的文件或目录。因此,要删除它们,请使用下面显示的命令:
sudo dnf clean all
使用 dnf history 命令,用户可以查看 DNF 事务时间线,包括事务发生的日期和时间。此外,该命令还提供了所涉及软件包的数量、事务是否成功或被取消,以及 RPM 数据库在事务之间是否被更改。
sudo dnf history
此外,dnf 历史记录命令还可用于撤销或重做某些事务。除了查看事务历史记录,dnf 历史记录命令还允许您回退或重复特定事务。例如,要回退(撤销)上表中 ID 为 6(安装 nginx)的事务,请键入以下命令:
sudo dnf history undo 6
同样,要重复(重做)某个事务,键入:
sudo dnf history redo 6
需要注意的是,撤消和重做命令会还原或重复事务中的步骤,如果所需软件包不可用,则撤消和重做命令会失败。换句话说,如果事务安装了一个新软件包,撤销命令将删除该软件包,并尝试将所有更新的软件包降级到以前的版本。不过,如果相关软件包不可用,该命令还是会失败。
这就是我们完整的 DNF 软件包管理器指南(含示例)。它也可用作 dnf 命令的快速参考。它为你提供了在基于 RPM 的 Linux 系统上管理软件所需的信息。
当然,DNF 软件包管理器还提供了更多选项。不过,我们强烈建议你从 DNF 官方文档中熟悉这些选项。希望本指南对您使用基于 RPM 的 Linux 发行版的 DNF 之旅有所帮助。欢迎在下面的部分提出任何建议和意见。DNF 的 API 文档齐全。相比之下,由于 YUM 的应用程序接口没有适当的文档记录,因此添加新功能具有挑战性。