Linux 软件包管理器:dnf vs apt

软件包管理器执行相同的通用操作——安装、管理和卸载应用程序——但它们并非所有操作都相同。
74 位读者喜欢这篇文章。
Gift box opens with colors coming out

Opensource.com

有很多方法可以将应用程序安装到 Linux 系统上。有些是新的,例如 Flatpak 和容器。另一些,例如 DEB 和 RPM,是经受时间考验的经典格式。

没有任何操作系统拥有通用的安装程序。如今,所有主要的操作系统都混合使用应用商店(第一方和第三方)、拖放安装和安装向导,因为有无数的开发者交付软件。不同的开发者对其交付的代码有不同的要求,这决定了他们各自选择的安装方法。

Linux 开创了软件包管理器的概念,这是一个用于安装、管理和卸载应用程序的命令。两个常见的软件包管理器命令是 aptdnfapt 命令管理 DEB 软件包,而 dnf 管理 RPM 软件包。理论上,两者并非严格互斥,但在实践中,Linux 发行版通常使用其中之一。理论上可以在一个系统上同时运行两者,但软件包安装会重叠,版本控制会很困难,并且这些命令会彼此冗余。但是,如果您在混合 Linux 环境中工作,与运行一个发行版的工作站和运行另一个发行版的服务器交互,您可能需要了解两者。

搜索应用程序

在可以使用软件包管理器安装应用程序之前,您需要知道软件包的名称。通常,应用程序名称和软件包名称是相同的。在 dnfapt 上验证要安装的软件包名称的过程完全相同

$ sudo dnf search zsh
====== Name Exactly Matched: zsh ======
zsh.x86_64 : Powerful interactive shell
[...]

使用 apt

$ sudo apt search zsh
Sorting... Done
Full Text Search... Done
csh/stable 20110502-4+deb10u1 amd64
  Shell with C-like syntax

ddgr/stable 1.6-1 all
  DuckDuckGo from the terminal

direnv/stable 2.18.2-2 amd64
  Utility to set directory specific environment variables

draai/stable 20180521-1 all
  Command-line music player for MPD
[...]

为了在搜索早期从 apt 获得相关结果,您可以使用 正则表达式

apt search ^zsh
Sorting... Done
Full Text Search... Done
zsh/stable 5.7.1-1 amd64
  shell with lots of features
[...]

查找应用程序的软件包

有些命令与其他命令捆绑在一起,都在一个软件包中。当发生这种情况时,您可以使用软件包管理器来了解哪个软件包提供了您需要的内容。dnfapt 命令在搜索此类元数据的方式上有所不同。

dnf

$ sudo dnf provides pgrep
procps-ng-3.3.15-6.el8.x86_64 : System and process monitoring utilities
Repo        : baseos
Matched from:
Filename    : /usr/bin/pgrep

apt 命令使用子命令 apt-file。要使用 apt-file,您必须先安装它,然后提示它更新其缓存

$ sudo apt install apt-file
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libapt-pkg-perl libexporter-tiny-perl liblist-moreutils-perl libregexp-assemble-perl
The following NEW packages will be installed:
  apt-file libapt-pkg-perl libexporter-tiny-perl liblist-moreutils-perl libregexp-assemble-perl
0 upgraded, 5 newly installed, 0 to remove and 14 not upgraded.
Need to get 297 kB of archives.
After this operation, 825 kB of additional disk space will be used.
Do you want to continue? [Y/n] y

$ sudo apt-file update
[...]

您可以使用 apt-file 搜索命令。您可以通过仅搜索命令来撒一张非常大的网,但是如果您碰巧知道命令的预期路径,它会更准确

$ sudo apt-file search /usr/bin/pgrep
pgreplay: /usr/bin/pgreplay               
procps: /usr/bin/pgrep

安装应用程序

使用 aptdnf 安装应用程序基本上是相同的

$ sudo apt install zsh

使用 dnf,您可以使用相同的选项安装单个软件包

$ sudo dnf install zsh

许多基于 RPM 的发行版都具有安装组,这些组将有时表面上相关的应用程序收集到一个易于安装的目标中。例如,Fedora 中的 Design Suite 组包含流行的创意应用程序。许多想要一个创意应用程序的艺术家可能也想要类似的应用程序,安装整个组是快速轻松地开始构建数字工作室的明智方法。您可以使用 group list 查看可用的组(使用 -v 查看不带空格的组名)

$ sudo dnf group list -v
[...]
Available Groups:
   Container Management (container-management)
   RPM Development Tools (rpm-development-tools)
   Design Suite (design-suite)
   Development Tools (development)
[...]

使用 group install 子命令安装 RPM 组

$ sudo dnf group install design-suite

您可以使用 @ 符号来减少输入

$ sudo dnf install @design-suite

升级应用程序

使用软件包管理器的一个优势是它可以知道它曾经安装的所有应用程序。这意味着您不必去寻找应用程序的更新版本。相反,您可以告诉软件包管理器扫描更新。

dnfapt 使用的子命令略有不同。由于 apt 保留了需要定期更新的信息缓存,因此它使用 upgrade 子命令进行应用程序更新

$ sudo apt upgrade

相比之下,dnf 每次使用命令时都会更新元数据,因此 updateupgrade 子命令是可互换的

$ sudo dnf upgrade

这与以下命令相同

$ sudo dnf update

卸载应用程序

如果您曾经尝试在任何平台上手动卸载应用程序,那么您就会知道,在卸载应用程序后,不可避免地会有剩余文件,例如首选项文件或资源或图标,散落在硬盘驱动器的各个角落。使用软件包管理器的另一个优势是,您的软件包管理器知道软件包安装的每个文件

$ sudo dnf remove zsh

remove 子命令也用于 apt

$ sudo apt remove zsh

使用 apt 卸载软件包不会删除修改后的用户配置文件,以防您不小心卸载了软件包。如果您希望 apt 删除应用程序及其配置文件,请对您之前卸载的应用程序使用 purge

$ sudo apt purge zsh

aptdnf(即使使用 purge)都不会删除您主目录中的数据或配置文件。要从您的主目录中删除数据,您必须手动执行(通常可以在 ~/.config~/.local 中找到)。

学习软件包管理

无论您选择的 Linux 发行版偏爱 apt 还是 dnf,这些命令的用途大致相同。它们帮助您安装、更新和卸载软件包。这两个是最常见的软件包管理器,它们在很大程度上相互镜像了最重要的语法元素,因此在它们之间切换非常容易。

每个都有一些高级功能,例如存储库管理,这些功能差异很大,但这些功能往往不如经典的 searchinstall 序列那样频繁运行。

无论您更频繁地使用哪个软件包管理器,您都可以下载我们的 apt 速查表dnf 速查表,以便在最需要时手边有最重要的语法。

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

9 条评论

我认为您也可以输入
sudo dnf group install "Design Suite"

文章没有提到“apt update”,只有“apt upgrade”。看起来本应有一段关于此的段落,但它不在那里。

您还应该提及“apt”和“apt-get”之间的区别。“apt”对于交互式会话更用户友好,涉及彩色文本和动画状态栏。这些功能看起来不错,但是当命令被脚本化或者您从简单的终端类型运行它时,它们会碍事。

“apt-get”命令几乎与 apt 做的事情相同,但用户反馈更简单,使其更适合在脚本中使用以及用户可能使用功能最少的终端的地方。

当 dnf 将“upgrade”与“update”设为相同时,我认为这是一个错误。
对我来说,升级意味着例如从 Fedora 33 升级到 34,而不仅仅是将 33 更新到最新状态。

您好,
非常感谢
我喜欢 dnf....

我很惊讶在这些关于软件包管理器的讨论中没有提及 Gdebi。好吧,它只做安装,但它一直对我有效。

yattdst,Linux 遭受了 YATTDST 综合症的严重困扰 - 又一个工具来做同样的事情。发明做新事物的新应用程序很难。因此,想要成为编码员的人编写工具来做其他人已经(大部分)做的事情。很大程度上是浪费时间。而且不要让我开始谈论 systemd .....

从不同的角度来看,这是开源的优势。如果我选择编写自己的软件包管理前端,它不会对任何人产生负面影响,并且好处是我可以使用我喜欢的工具来完成我每天交互的任务。

关注和约束有优势,但它有可能与替代方案共存。例如,如果您因为任何原因不喜欢 systemd,您可以使用 OpenRC 或其他 init —— 即使这些替代方案是“yattdst”。

回复 作者 cube1

另一个主要的 Linux 母系,Arch / pacman 呢?

非常有帮助,谢谢。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.