Linux 发行版之间的主要区别之一是软件包管理,在下文中我们简称为包。在本教程中您将了解 Linux 包以及包管理器。

您将了解什么是包 Package、什么是包管理器 Package Manager、它们如何工作以及可用的包管理器类型。

什么是 Linux 包管理器

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

您经常会发现许多教程和文章中使用术语包。要了解包管理器,您必须了解包是什么。

什么是软件包

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

过去,软件通常是从源码构建安装。您可以参考一个文件(通常名为自述文件Readme)并查看它需要哪些依赖的软件、头文件或者动态库的位置。

通常还包含配置脚本或 makefile。您必须自行编译软件,并自行处理所有依赖的软件,多数软件都需要依赖其他软件的动态文件。

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

就像烤蛋糕一样

大约在 90 年代中期,Debian 创建 .deb 格式的 DEB 包管理系统,Red Hat Linux 创建 .rpm 格式的 Red Hat Package Manager 包管理系统  。

即使有包管理器,你仍然可以从编译源码来安装软件。要与这些打包系统交互,您需要一个包管理器。

包管理器如何工作

包管理器是一个通用概念,并不是 Linux 发行版所独有。您会发现会有针对不同软件或编程语言的包管理器。

例如有专门针对 Python 的 PIP 包管理器。甚至 VSCode 编辑器也有自己的包管理器。由于本文的重点是 Linux,因此我将从 Linux 的角度出发。

然而,这里的大部分解释也可以适用于一般的包管理器。下图是 SUSE Wiki 创建的包管理整个流程,方便您可以轻松了解包管理器的工作原理。

Linux 包管理器

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

仓库还包含元数据文件,其中包含软件包的信息,例如软件包名称、版本号、软件包描述和仓库名称等。

如果您在 Ubuntu/Debian 运行 apt show 命令查看 Chrome浏览器包的信息,您会看到以下内容。

apt show google-chrome-beta
Package: google-chrome-beta
Version: 116.0.5845.42-1
Priority: optional
Section: web
Maintainer: Chrome Linux Team <chromium-dev@chromium.org>
Installed-Size: 328 MB
Provides: www-browser
Pre-Depends: dpkg (>= 1.14.0)
Depends: ca-certificates, fonts-liberation, libasound2 (>= 1.0.17), libatk-bridge2.0-0 (>= 2.5.3), libatk1.0-0 (>= 2.2.0), libatspi2.0-0 (>= 2.9.90), libc6 (>= 2.17), libcairo2 (>= 1.6.0), libcups2 (>= 1.6.0), libcurl3-gnutls | libcurl3-nss | libcurl4 | libcurl3, libdbus-1-3 (>= 1.9.14), libdrm2 (>= 2.4.75), libexpat1 (>= 2.0.1), libgbm1 (>= 17.1.0~rc2), libglib2.0-0 (>= 2.39.4), libgtk-3-0 (>= 3.9.10) | libgtk-4-1, libnspr4 (>= 2:4.9-2~), libnss3 (>= 2:3.35), libpango-1.0-0 (>= 1.14.0), libu2f-udev, libvulkan1, libx11-6 (>= 2:1.4.99.1), libxcb1 (>= 1.9.2), libxcomposite1 (>= 1:0.4.4-1), libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxkbcommon0 (>= 0.5.0), libxrandr2, wget, xdg-utils (>= 1.0.2)
Download-Size: 96.9 MB
APT-Sources: https://dl.google.com/linux/chrome/deb stable/main amd64 Packages
Description: The web browser from Google
 Google Chrome is a browser that combines a minimal design with sophisticated technology to make the web faster, safer, and easier.

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

当您运行包管理器的安装命令(例如 apt install package_name)时,包管理器会引用此缓存。如果它在缓存中找到包信息,它会使用网络连接到相应的仓库下载相应的软件包并安装在系统。

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

sudo apt install copyq
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required: 不需要的软件建议运行自动删除
  android-libadb android-libbase android-libboringssl android-libcrypto-utils android-libcutils android-liblog android-sdk-platform-tools-common
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed: 依赖的软件
  copyq-plugins libqt5script5
Suggested packages:
  copyq-doc
The following NEW packages will be installed:
  copyq copyq-plugins libqt5script5
0 upgraded, 3 newly installed, 0 to remove and 3 not upgraded.
Need to get 2,547 kB of archives.
After this operation, 10.2 MB of additional disk space will be used.

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

除了安装、删除等任务之外,您还可以使用包管理器来配置包并根据您的需要管理它们。例如,您可以阻止系统更新软件升级指定的软件包版本。

不同类型的包管理器

包管理器因包系统而异,但同一包系统可能有多个包管理器。例如,RPM格式的包有 Yum 和 DNF 包管理器。对于 DEB,您有 apt-get、基于 aptitude 命令行的包管理器。

Synaptic 包管理器

包管理器不一定是基于命令行的。也有像 Synaptic 这样的图形包管理工具。你的发行版的软件中心也是一个包管理器,虽然软件中心是使用 apt-get 或 DNF 构建的 GUI 工具。

结论

至此,你已经对 Linux 中的包管理器有基本的了解。如果您有任何问题或反馈,请随时发表评论。点击下方阅读原文获取更好排版格式与文章参考引用。