Linux 黑話解釋:什么是包管理器?它是如何工作的?
Linux 發行版之間有什么不同 的要點之一是包管理。在這篇 Linux 黑話解釋中,你將了解 Linux 中的打包和包管理器。你將了解什么是包,什么是包管理器,它們是如何工作的,以及有什么包管理器。
什么是包管理器?
簡單來說,“ 包管理器(package manager)”(或“軟件包管理器”)是一種工具,它允許用戶在操作系統上安裝、刪除、升級、配置和管理軟件包。軟件包管理器可以是像“軟件中心”這樣的圖形化應用,也可以是像 apt-get 或 pacman 這樣的命令行工具。
你會發現我經常在教程和文章中使用“包”這個詞。要了解包管理器,你必須了解什么是包。
什么是包?
一個“ 包(package)”(或“軟件包”)通常指的是一個應用程序,它可以是一個 GUI 應用程序、命令行工具或(其他軟件程序需要的)軟件庫。包本質上是一個存檔文件,包含二進制可執行文件、配置文件,有時還包含依賴關系的信息。
在舊時代, 軟件曾經是從它的源代碼安裝的 。你會參考一個文件(通常命名為 README),看看它需要什么軟件組件、二進制文件的位置。它通常包括一個配置腳本或 Makefile。你必須自己編譯該軟件或自己處理所有的依賴關系(有些軟件需要安裝其他軟件)。
為了擺脫這種復雜性,Linux 發行版創建了自己的打包格式,為終端用戶提供隨時可用的二進制文件(預編譯軟件),以便安裝軟件,同時提供一些 元數據 (版本號、描述)和依賴關系。
這就像烤蛋糕與買蛋糕一樣。
大約在上世紀 90 年代中期,Debian 創建了 DEB 打包格式(.deb),Red Hat Linux 創建了 RPM(Red Hat Package Manager 的縮寫)打包系統(.rpm)。編譯源代碼的方式仍然存在,但現在是可選的。
要與打包系統交互或使用打包系統,你需要一個包管理器。
包管理器是如何工作的?
請記住,包管理器是一個通用的概念,它并不是 Linux 獨有的。你會經常發現各種軟件或編程語言的包管理器。有 只是針對 Python 包的 PIP 包管理器 。甚至 Atom 編輯器也有自己的包管理器 。
由于本文的重點是 Linux,所以我會從 Linux 的角度出發。不過,這里的大部分解釋也可以應用于一般的包管理器。
我創建了這個圖(基于 SUSE Wiki),這樣你就可以很容易理解包管理器是如何工作的。

幾乎所有的 Linux 發行版都有“ 軟件倉庫(software repository)”,它基本上是軟件包的集合。是的,可以有不止一個軟件庫。軟件庫包含不同種類的軟件包。
軟件倉庫也有元數據文件,其中包含了軟件包的信息,如軟件包的名稱、版本號、軟件包的描述和軟件倉庫名稱等。這就是你在 Ubuntu/Debian 中使用 apt show 命令 所看到的。
你的系統上的包管理器首先會與元數據進行交互。包管理器在你的系統上創建了一個元數據的本地緩存。當你運行包管理器的更新選項(例如 apt update)時,它會通過引用倉庫中的元數據來更新本地元數據緩存。
當你運行軟件包管理器的安裝命令(例如 apt install package_name)時,軟件包管理器會引用這個緩存。如果它在緩存中找到了包的信息,它就會使用互聯網連接到相應的倉庫,并在你的系統上安裝之前先下載包。
一個包可能有依賴關系。意思是說,它可能需要安裝其他軟件包。軟件包管理器通常會處理這些依賴關系,并將其與你正在安裝的軟件包一起自動安裝。

Linux 中包管理器會處理依賴關系
同樣,當你使用包管理器刪除一個包時,它要么自動刪除,要么通知你系統有未使用的包可以清理。
除了安裝、刪除這些顯而易見的任務外,你還可以使用包管理器對包進行配置,并根據自己的需要進行管理。例如,你可以在常規的系統更新中 防止升級某個包的版本 。你的包管理器可能還能做很多事情。
不同種類的包管理器
包管理器因打包系統而異,但同一打包系統卻可能有多個包管理器。
例如,RPM 有 Yum 和 DNF 包管理器。對于 DEB,你有 apt-get、 aptitude 等基于命令行的包管理器。
Synaptic 包管理器
軟件包管理器不一定是基于命令行的,也有圖形化的軟件包管理工具,比如 Synaptic 。你的發行版的“軟件中心”也是一個軟件包管理器,即使它在底層運行的是 apt-get 或 DNF。
結論
我不想進一步詳細介紹這個話題,雖然我可以繼續說下去,但這將偏離本主題的目標 —— 即讓你對 Linux 中的包管理器有一個基本的了解。
我暫時忽略了新的通用打包格式,比如 Snap 和 Flatpak。