Linux 术语克星:Linux 中的包管理器是什么? 它是如何工作的?

Linux 发行版之间的主要区别之一是包管理。 在 Linux 行话终结者系列的这一部分中,您将了解 Linux 中的打包和包管理器。 您将了解什么是包、什么是包管理器以及它们如何工作以及可用的包管理器类型。

Linux 中的包管理器是什么?

简单来说,包管理器是一种工具,允许用户在操作系统上安装、删除、升级、配置和管理软件包。 包管理器可以是一个图形应用程序,如软件中心或命令行工具,如 apt-get 或 pacman。

您经常会发现我在有关 It’s FOSS 的教程和文章中使用术语“包”。 要了解包管理器,您必须了解包是什么。

什么是包裹?

包通常是指应用程序,但也可以是 GUI 应用程序、命令行工具或软件库(其他软件程序需要)。 包本质上是一个存档文件,其中包含二进制可执行文件、配置文件,有时还包含有关依赖项的信息。

在过去,软件过去常常从其源代码安装。 您可以参考一个文件(通常名为自述文件)并查看它需要哪些软件组件、二进制文件的位置。 通常包含配置脚本或 makefile。 您必须自己编译软件或自行处理所有依赖项(某些软件需要安装其他软件)。

为了摆脱这种复杂性,Linux 发行版创建了自己的打包格式,为最终用户提供现成的二进制文件(预编译软件),用于安装软件以及一些 元数据 (版本号、描述)和依赖项。

这就像烤蛋糕和买蛋糕一样。

大约在 90 年代中期,Debian 创建了 .deb 或 DEB 打包格式,而 Red Hat Linux 创建了 .rpm 或 RPM(Red Hat Package Manager 的缩写)打包系统。 编译源代码仍然存在,但现在是可选的。

要与打包系统交互或使用打包系统,您需要一个包管理器。

包管理器如何工作?

请记住,包管理器是一个通用概念,并不是 Linux 独有的。 您经常会发现不同软件或编程语言的包管理器。 有专门用于 Python 包的 PIP 包管理器。 甚至 Atom 编辑器也有自己的包管理器。

由于本文的重点是 Linux,因此我将从 Linux 的角度来看待问题。 然而,这里的大部分解释也适用于一般的包管理器。

我已经创建了这个图(基于 SUSE Wiki),以便您可以轻松了解包管理器的工作原理。

几乎所有的 Linux 发行版都有软件存储库,它基本上是软件包的集合。 是的,可能有多个存储库。 存储库包含不同类型的软件包。

存储库还有元数据文件,其中包含有关软件包的信息,例如软件包名称、版本号、软件包描述和存储库名称等。这是您在 Ubuntu/Debian 中使用 apt show 命令时看到的内容。

您系统的包管理器首先与元数据交互。 包管理器在您的系统上创建元数据的本地缓存。 当您运行包管理器的更新选项(例如 apt update)时,它会通过引用存储库中的元数据来更新此元数据的本地缓存。

当您运行包管理器的安装命令(例如 apt install package_name)时,包管理器会引用此缓存。 如果它在缓存中找到包信息,它会使用 Internet 连接连接到适当的存储库,并在安装到您的系统之前首先下载包。

一个包可能有依赖关系。 这意味着它可能需要安装其他软件包。 包管理器通常会处理依赖项并将其与您正在安装的包一起自动安装。

同样,当您使用包管理器删除一个包时,它会自动删除或通知您您的系统有可以清理的未使用包。

除了安装、删除这些显而易见的任务外,您还可以使用包管理器来配置包并根据需要管理它们。 例如,您可以阻止从常规系统更新升级包版本。 您的包管理器可能还有更多功能。

不同类型的包管理器

包管理器因包装系统而异,但相同的包装系统可能有多个包管理器。

例如,RPM 有 百胜DNF 包管理器。 对于 DEB,你有 apt-get, 资质 基于命令行的包管理器。

包管理器不一定基于命令行。 你有像 Synaptic 这样的图形包管理工具。 您的发行版的软件中心也是一个包管理器,即使它在下面运行 apt-get 或 DNF。

结论

我不想更详细地讨论这个话题,因为我可以继续说下去。 但这会偏离主题的目标,即让您对 Linux 中的包管理器有一个基本的了解。

我暂时省略了 Snap 和 Flatpak 等新的通用包装格式。

我确实希望您对 Linux 中的包管理系统有更好的了解。 如果您仍然对此感到困惑或对此主题有任何疑问,请使用评论系统。 我会尽量回答你的问题,如果需要,用新的观点更新这篇文章。