了解 Ubuntu 的軟件存儲庫系統
當你開始使用 Ubuntu 或者其它基于 Ubuntu 的發行版時,你很快就會學會使用 apt
命令安裝軟件包:
sudo apt install package_name
你可能還會使用這三條 PPA 命令安裝其它軟件:
sudo add-apt-repository ppa:PPA_Name/ppa
sudo apt update
sudo apt install package_from_ppa
但當你添加一些外部的軟件存儲庫時,很可能會遇到一些更新錯誤。
盡管你可以在互聯網上搜索到同樣的報錯以及對應的解決方案,但在大多數情況下,你并不知道這些錯誤為什么會出現,也不知道它們是怎么被解決的。
如果你了解了 Ubuntu 軟件存儲庫的運行機制,你就會很清楚這些問題的根源是什么,進而對癥下藥地給出處理方式。
在技術論壇上,你可以找到很多相關的零散內容,但那些碎片化的信息并不能讓你對其產生一個全面的理解。
因此我寫出了這篇文章,以便讓你全面了解軟件存儲庫是如何運作的。
本文的內容適用于 Linux Mint、Elementary OS 以及其它基于 Ubuntu 的發行版(Debian 或許也適用)。
本文主要面向終端用戶而不是開發者,我只會介紹維護系統軟件存儲庫所需要的知識,不會展示如何在 Ubuntu 中打包應用程序。
我們會先從關鍵部分開始,了解軟件包管理器和軟件存儲庫的基本概念。這可以為了解它們的底層運作方式奠定基礎。
1、什么是包管理器?
簡單地說,包管理器就是讓用戶在操作系統上安裝、移除、升級、配置、管理軟件包的工具。
Ubuntu 通過軟件存儲庫為用戶提供軟件。軟件存儲庫中包含了各種不同類型的軟件包以及它們的元數據文件,元數據文件中記錄了軟件包的信息,包括軟件包名稱、版本號、軟件包描述和軟件存儲庫名稱等。
軟件包管理器與元數據進行交互,并在你的系統上創建本地的元數據緩存。當你需要安裝軟件時,軟件包管理器會引用這些緩存來獲取信息,通過互聯網連接到對應的存儲庫下載軟件包,然后再將軟件包安裝到系統上。
下面這篇文章詳細介紹了軟件包管理器的工作原理,歡迎查閱。
2、Ubuntu 的默認軟件存儲庫
在上一節中,你可能已經對軟件存儲庫有了一些認識。
你可能已經猜到,沒有哪個軟件存儲庫會包含所有軟件包。因為軟件包會被分類放置在不同的軟件存儲庫中,這樣就可以方便地啟用或禁用部分軟件存儲庫。
每個 Ubuntu 版本都有自己的一組四個官方存儲庫:
- Main – Canonical 支持的自由開源軟件
- Universe – 社區維護的自由開源軟件
- Restricted – 設備的專有驅動程序
- Multiverse – 受版權或法律問題限制的軟件
下面這篇文章介紹了如何在 Ubuntu 中啟用 Universe 和 Multiverse 軟件存儲庫。
3、了解 sources.list
sources.list
是 Ubuntu 軟件存儲庫機制的一個組成部分。sources.list
文件中存在的錯誤條目常常是引發一些與更新問題的根本原因。
因此,了解 sources.list
很重要。
sources.list
是一個記錄了軟件存儲庫信息的文本文件,每一行未被注釋的內容都代表一個單獨的軟件存儲庫。
sources.list in Ubuntu
但這些內容需要遵循特定的格式,并且不應出現重復的行。下面這篇文章中介紹了 sources.list
的更多詳細內容。
4、深入了解 PPA
盡管 Ubuntu 最近在大力推廣 Snap,但 PPA 仍然是獲取 Ubuntu 最新軟件的一個可靠途徑。
然而很多 Ubuntu 用戶都只是刻板地直接運行上面的三條命令來使用 PPA,自然很容易會遇到諸如“repository does not have release file”這樣的問題。
下面這篇文章是一篇深入詳盡的 PPA 指南。
5、添加外部軟件存儲庫
除了默認軟件存儲庫和 PPA,你還可以從第三方軟件存儲庫中添加軟件。比如 Brave 瀏覽器、Docker 等軟件都專門為 Ubuntu 提供了軟件存儲庫。
你可以通過下面這篇文章了解使用外部軟件存儲庫的機制。
6、排查常見錯誤
現在你已經了解了底層機制,現在可以熟悉一下在使用 Ubuntu 時可能遇到的典型更新錯誤了。
當你看到出現錯誤之后,你會得到一些關于它的根本原因的提示。在了解根本原因后,你就能知道某個解決方案是如何解決問題的了。
這就是本文的目的。讓你充分了解軟件包管理系統的底層知識,從而避免常見錯誤或者直接有效修復這些錯誤。
你不僅要知其然,還要知其所以然。
下載軟件存儲庫信息失敗
如果遇到了這種情況,就可以開始調查了。
Failed to download repository information
在某些情況下,可能是網絡連接的問題,但也有可能是因為你自行添加了某些軟件存儲庫,或者 sources.list
中的條目有誤。
這個時候應該在終端中嘗試刷新軟件包緩存。
sudo apt update
檢查輸出結果的最后幾行,它會給出錯誤信息(也就是以 “E:” 開頭的行)。有了錯誤信息之后,就可以開始故障排除了。
軟件存儲庫中沒有發布文件
如果 Ubuntu 用戶未檢查某個 PPA 是否支持其 Ubuntu 版本,就盲目向系統中添加該 PPA 時,就很可能會遇到這樣的錯誤。
E: The repository ‘http://ppa.launchpad.net/numix/ppa/ubuntu focal Release’ does not have a Release file.
原因很可能就是這個軟件存儲庫沒有針對所使用的 Ubuntu 版本進行配置。
下面這篇文章對此做了詳細解釋。
MergeList 問題
如果你看到這樣的錯誤:
E:Encountered a section with no Package: header,
E:Problem with MergeList /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise_universe_binary-i386_Packages,
E:The package lists or status file could not be parsed or opened.
這表明第二行中提到的緩存文件已經損壞。對應的解決方法是清空緩存并重試。
下面這篇文章對此做了詳細解釋。
目標軟件包被多次配置
好吧!嚴格來說,這不是一個錯誤。它只是一個警告。但它仍然很常見,可能會給許多 Ubuntu 新用戶帶來麻煩。
這是一個能讓你把新學到的知識用在這里的好例子。
出現這個問題是因為 sources.list
文件中有重復的條目。解決辦法是將所有重復的行刪除至只保留一行。
下面這篇文章對此做了詳細解釋。
7、繼續學習
在讀完這篇文章后,希望你對 Ubuntu 的軟件存儲庫機制能有更深入的了解。下一次當你遇到錯誤并尋找解決方案時,你就更有可能理解發生了什么。
接下來,你應該學會使用 apt
的各種命令管理軟件包,不僅僅只是 apt install
或 apt remove
。
你還可以詳細了解一下關于軟件包管理的其它知識。
由于 Ubuntu 比以往任何時候都更推崇 Snap,所以你也應該學習一些必要的 Snap 命令。
Flatpak 應用程序也越來越受歡迎,你也很可能會接觸到它們。
希望你喜歡學習軟件存儲庫的機制,并對軟件包管理有更清晰的認識。