Linux 包管理器 dnf

了解如何使用 dnf 命令在 Linux 上安装软件包,然后下载我们的速查表,以便随时掌握正确的命令。
48 位读者喜欢这篇文章。

在计算机系统上安装应用程序非常简单。您只需将文件从存档文件(如 .zip 文件)复制到目标计算机上操作系统期望应用程序所在的位置。因为我们很多人都习惯使用花哨的安装程序“向导”来帮助我们在计算机上安装软件,所以这个过程似乎在技术上应该比实际情况更复杂。

然而,真正复杂的是构成应用程序的问题。用户认为的单个应用程序实际上包含从软件库(即 Linux 上的 .so 文件、Windows 上的 .dll 文件和 macOS 上的 .dylib 文件)借用的代码,这些代码分散在整个操作系统中。

为了让用户不必担心这种相互依赖代码的复杂矩阵,Linux 使用软件包管理系统来跟踪哪个应用程序需要哪个库,哪个库或应用程序有安全或功能更新,以及每个软件标题安装了哪些额外的数据文件。软件包管理器本质上是一个安装程序向导。它们易于使用,提供图形界面和基于终端的界面,并且使您的生活更轻松。您越了解您发行版的软件包管理器,您的生活就越轻松。

在 Linux 上安装应用程序

如果您是一位希望在 Linux 上安装应用程序的休闲桌面用户,那么您可能正在寻找 GNOME Software,这是一款桌面应用程序浏览器。

Image of the GNOME Software application

它的工作方式正如您所期望的那样:您在其界面中单击,直到找到一个看起来有用的应用程序,然后单击安装按钮。

或者,您可以打开从网络下载的 .rpm.flatpakref 软件包,在 GNOME Software 中安装它们。

如果您倾向于使用键入的命令来控制您的计算机,请继续阅读!

使用 dnf 查找软件

在安装应用程序之前,您可能需要确认它是否存在于您的发行版服务器上。通常,使用 dnf 搜索应用程序的常用名称就足够了。例如,假设您最近阅读了 一篇关于 Cockpit 的文章,并决定尝试一下。您可以搜索 cockpit 以验证您的发行版是否包含它

$ dnf search cockpit
 Last metadata expiration check: 0:01:46 ago on Tue 18 May 2021 19:18:15 NZST.
 ==== Name Exactly Matched: cockpit ====
 cockpit.x86_64 : Web Console for Linux servers

==== Name & Summary Matched: cockpit ==
 cockpit-bridge.x86_64 : Cockpit bridge server-side component
 cockpit-composer.noarch : Composer GUI for use with Cockpit
 [...]

有一个完全匹配的项。列为匹配项的软件包名为 cockpit.x86_64,但名称的 .x86_64 部分仅表示它兼容的 CPU 架构。默认情况下,您的系统安装具有匹配 CPU 架构的软件包,因此您可以忽略该扩展名。因此,您已确认您要查找的软件包确实简称为 cockpit

现在您可以放心地使用 dnf install 安装它。此步骤需要管理权限

$ sudo dnf install cockpit

通常,这就是典型的 dnf 工作流程:搜索和安装。

但是,有时 dnf search 的结果对您来说不清楚,或者您想要了解有关软件包的更多信息,而不仅仅是其常用名称。有一些相关的 dnf 子命令,具体取决于您要查找的信息。

软件包元数据

如果您觉得您的搜索让您接近您想要的软件包,但您还不确定,那么查看软件包的元数据通常很有帮助,例如项目的 URL 和描述。要获取此信息,请使用令人愉悦的直观 dnf info 命令

$ dnf info terminator
Available Packages
Name         : terminator
Version      : 1.92
Release      : 2.el8
Architecture : noarch
Size         : 526 k
Source       : terminator-1.92-2.el8.src.rpm
Repository   : epel
Summary      : Store and run multiple GNOME terminals in one window
URL          : https://github.com/gnome-terminator
License      : GPLv2
Description  : Multiple GNOME terminals in one window.  This is a project to produce
             : an efficient way of filling a large area of screen space with
             : terminals. This is done by splitting the window into a resizeable
             : grid of terminals. As such, you can  produce a very flexible
             : arrangements of terminals for different tasks.

此信息转储告诉您可用软件包的版本、系统注册的哪个存储库提供它、项目的网站以及对其功能的详细描述。

哪个软件包提供文件?

软件包名称并不总是与您要查找的内容匹配。例如,假设您正在阅读文档,告诉您必须安装名为 qmake-qt5 的内容

$ dnf search qmake-qt5
No matches found.

dnf 数据库非常广泛,因此您不必将自己限制在搜索完全匹配项。您可以使用 dnf provides 命令来了解是否有任何内容作为某个较大软件包的一部分提供您正在查找的内容

$ dnf provides qmake-qt5
qt5-qtbase-devel-5.12.5-8.el8.i686 : Development files for qt5-qtbase
Repo        : appstream
Matched from:
Filename    : /usr/bin/qmake-qt5

qt5-qtbase-devel-5.15.2-3.el8.x86_64 : Development files for qt5-qtbase
Repo        : appstream
Matched from:
Filename    : /usr/bin/qmake-qt5

这证实了应用程序 qmake-qt5 是名为 qt5-qtbase-devel 的软件包的一部分。它还告诉您应用程序安装到 /usr/bin,因此您确切地知道安装后在哪里可以找到它。

软件包中包含哪些文件?

有时,我发现自己完全从不同的角度接近 dnf。有时,我已经确认应用程序已安装在我的系统上;我只是想不起来我是如何安装它的。有时,我知道我安装了特定的软件包,但我不清楚该软件包究竟在我的系统上安装了什么。

如果您需要“逆向工程”软件包的有效负载,您可以使用 dnf repoquery 命令以及 --list 选项。这会查看有关软件包的存储库元数据,并返回该软件包提供的所有文件的列表

$ dnf repoquery --list qt5-qtbase-devel
/usr/bin/fixqt4headers.pl
/usr/bin/moc-qt5
/usr/bin/qdbuscpp2xml-qt5
/usr/bin/qdbusxml2cpp-qt5
/usr/bin/qlalr
/usr/bin/qmake-qt5
/usr/bin/qvkgen
/usr/bin/rcc-qt5
[...]

这些列表可能会很长,因此将命令通过 less 或您喜欢的分页器管道传输会有所帮助。

删除应用程序

如果您决定不再需要安装在系统上的应用程序,您可以使用 dnf remove 卸载它、作为其软件包一部分安装的所有文件以及任何不再需要的依赖项

$ dnf remove bigapp

有时,依赖项与一个应用程序一起安装,后来被您安装的某些其他应用程序发现有用。如果两个软件包都需要相同的依赖项,则 dnf remove 不会删除该依赖项。在安装和卸载大量应用程序后,最终会留下一些零散的软件包并非闻所未闻。大约一年一次,我执行 dnf autoremove 以清除任何未使用的软件包

$ dnf autoremove

这不是必需的,但这是一个内务处理步骤,让我感觉我的计算机更好。

了解 dnf

您越了解您的软件包管理器的工作原理,您在必要时就越容易安装和查询应用程序。即使您不是经常使用 dnf 的用户,当您发现自己与基于 RPM 的发行版交互时,了解它也可能很有用。

yum 毕业后,我最喜欢的软件包管理器之一是 dnf 命令。虽然我不喜欢它的所有子命令,但我发现它是目前最强大的软件包管理系统之一。下载我们的 dnf 速查表,以习惯该命令,并且不要害怕尝试一些新技巧。一旦您熟悉它,您可能会发现很难使用其他任何东西。

接下来阅读什么
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,而且经常同时工作。

5 条评论

使用 dnf 组比看起来更棘手。我更喜欢使用
dnf grouplist
显示已安装和可用的组。棘手之处在于您尝试安装其中一个组。例如,假设您要安装
开发工具
语法是
dnf group install "Development Tools"
这比尝试执行
dnf install @development-tools
更简单。这是正确的吗?还是
dnf install @DevelopmentTools
或其他什么?
手册页在这方面有点粗略。

我使用 -v 标志执行 grouplist,它在括号中列出确切的组昵称。

$ dnf grouplist -v
RPM Development Tools (rpm-development-tools)
Development Tools (development)
Graphical Administration Tools (graphical-admin-tools)
$ sudo dnf install @development

可能还有其他方法可以做到这一点,但这就是我多年来一直做的事情,到目前为止还没有让我失望。

回复 作者 Greg P

dnf 是简化任务的强大命令吗?

有三个程序在运行:rpm、yum 和 dnf。为什么需要 3 个?

我不明白这个问题,因为不需要 3 个命令。我相信本文有效地证明了这一点。

您列出的 3 个命令确实存在。我可以提供一些背景信息

* Yum 是历史遗留的,并且已经重构为基于 libdnf。对于多年来一直喜欢 Yum 并且不想迁移的用户来说,它现在是 dnf 的可选接口。如果它最终被弃用或符号链接到 `dnf` 可执行文件,我不会感到惊讶。

* `rpm` 命令是 RPM 数据库的直接接口,用于跟踪系统上的软件包。它的存在是因为 Linux 为用户提供了许多工具,并且将数据库放在用户的系统上而没有与其通信的方式将是一种遗憾。通常,您不应期望使用 `rpm` 命令,因为 dnf 是一种更友好、统一且强大的与 RPM 系统交互的方式。

回复 作者 paul

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.