Linux软件包管理器dnf与apt的介绍和对比

390 阅读5分钟

有许多方法可以将应用程序放到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 获得相关结果,你可以使用regex

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中的设计套件组包含流行的创意应用程序。许多想要一个创意应用程序的艺术家很可能想要类似的应用程序,而安装整个组是一个简单而快速的方法,可以合理地开始建立一个数字工作室。你可以用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 cheat sheetdnf cheat sheet,这样你就可以在最需要的时候把最重要的语法放在手边。