你大概知道怎麼在 Ubuntu 中使用
apt
指令安裝軟體包。那些軟體包都是來自 Ubuntu 的官方存儲庫。
那第三方或者外部存儲庫呢?不,我這裡并不是要講 PPA。
早晚你會碰到那種至少四行的安裝說明:你需要安裝名為
apt-transport-https
的包、操作一下 GPG 和 源清單source list 之後,你才能正常安裝軟體包。
沒有什麼印象的話,那我分享一個 在 Ubuntu 上安裝最新版本的 Yarn的例子:
sudo apt install apt-transport-https curl
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list.d/yarn.list'
sudo apt update && sudo apt install yarn
當你需要直接從開發者那裡安裝程式設計工具的時候,大機率會碰到這種安裝方式。
許多人隻是按照說明進行操作,并不會去思考其中的原理。這也沒什麼不對,但了解該過程實際上可以提升你在這方面的知識,而且有助于之後排除故障。
我來解釋一下這些代碼背後的邏輯。
了解從外部存儲庫安裝的過程
在你繼續往下閱讀之前,我強烈建議你先看看下面這兩篇文章,友善了解後續的概念:
- 什麼是 Ubuntu 中的存儲庫
- 什麼是 Ubuntu 中 PPA
為了讓你有點印象,這裡有一張軟體包存儲庫和 Linux 中的包管理器的圖檔。
整件事情其實就是在系統中添加一個新的外部存儲庫。這樣,你就可以從這個新存儲庫下載下傳并安裝可用的軟體包。如果這個存儲庫提供了包版本的更新,你可以在更新系統的同時更新這些軟體包(
apt update && apt upgrade
)。
那麼,這是什麼工作原理呢?讓我們一條一條地過一遍。
第 1 部分:為 apt 擷取 HTTPS 支援
第一行是這樣的:
sudo apt install apt-transport-https curl
curl
是一個Linux 終端下載下傳檔案的工具。這裡主要的部分是安裝
apt-transport-https
,但事實上已經不需要了。
明白了嗎?這個
apt-transport-https
包讓你的系統通過 HTTPS 協定安全通路存儲庫。按照設計,Ubuntu 的存儲庫使用 http 而不是 https 協定。
看看下面的截圖。 https 這張圖是我已經添加到系統中的外部存儲庫。Ubuntu 的存儲庫和 PPA 使用 http 協定。
在舊版本的
apt
包管理器中,不支援 https 協定。
apt-transport-https
包為
apt
添加了 https 支援。要新增一個使用 https 的存儲庫,首先就得先安裝此包。
我之前不是說不需要安裝這個包了嗎?是的,因為較新版本的
apt
(高于 1.5)已經支援 https,是以你不需要再安裝
apt-transport-https
。
但是你依然看到我在說明中提到了這個包。這更多是出于遺留原因,而且可能還有很舊的發行版在使用舊版本的
apt
包。
現在,你可能想知道既然 https 是安全協定,那為什麼 Ubuntu 的存儲庫還要使用 http 而不是 https。這難道沒有安全風險嗎?接着往下看你就知道答案了。
第 2 部分:添加遠端存儲庫的 GPG 密鑰
Linux 存儲庫内置了基于 GPG 密鑰的安全機制。每個存儲庫都将其 GPG 公鑰添加到你的系統信任密鑰中。來自存儲庫的包由這個 GPG 密鑰“簽名signed”,并且通過這份存儲的公鑰,系統能夠驗證軟體包正是來自這個存儲庫。
如果 密鑰之間不比對,你的系統會發出提醒,而不會繼續從該存儲庫安裝或者更新軟體包。
到目前為止,一切都很順利。下一步是将外部存儲庫的 GPG 公鑰添加到你的 Linux 系統,以便它能接收來自該存儲庫的軟體包。
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
在上面的指令中,你使用
curl
從指定的 URL 下載下傳 GPG 密鑰。選項
-sS
能夠讓你不看多餘的輸出(靜默模式),但會顯示錯誤(如果有的話)。最後一個
-
告訴
apt-key
使用标準輸入stdin而不是檔案(在本例中是
curl
指令的輸出)。
apt-key add
指令已經将下載下傳的密鑰添加到系統中。
你可以通過
apt-key list
指令檢視系統中各種存儲庫添加的 GPG 密鑰。
這是将 GPG 密鑰添加到系統的一種方法。你會看到一些其它的指令,看起來略有不同,但效果一樣,都是将存儲庫的公鑰添加到你的系統裡面。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
你會注意到
apt-key
已被棄用的警告。在 Ubuntu 22.04 之前,你還可以使用
apt-key
指令,但它最終會被删除。現在不需要杞人憂天。
第 3 部分:将外部存儲庫添加到源清單
下個指令是在系統的源清單中添加一個新條目。這樣,你的系統就會知道它得檢查該存儲庫中的包和更新。
sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list.d/yarn.list'
有一個檔案
/etc/apt/sources.list
包含 Ubuntu 存儲庫的詳細資訊。最好不要随便動這個檔案。所有新增的存儲庫都應放在
/etc/apt/sources.list.d
目錄中相應的檔案裡(約定以
.list
結尾)。
這使得包管理變得更容易。如果你要從系統中删除一個存儲庫,隻需删除相應的源檔案即可。無需修改主
sources.list
檔案。
讓我們再仔細地看一下這行指令。
sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list.d/yarn.list'
使用
sh
可以在一個新的 shell 程序中運作指令,而不是子 shell。
-c
選項告訴
sh
指令從參數而不是标準輸入讀取指令。然後它運作
echo
指令,也就是把
deb https://dl.yarnpkg.com/debian/ stable main
這一行添加到
/etc/apt/sources.list.d/yarn.list
檔案(會建立該檔案)。
現在,你可以通過各種方法在指定目錄中建立
.list
檔案并在其中添加包含存儲庫詳細資訊的資料行。你也可以像這樣使用:
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
明白了吧?
第 4 部分:從新添加的存儲庫安裝應用程式
到目前為止,你已經将存儲庫的 GPG 密鑰和存儲庫的 URL 添加到系統中。
但是系統仍然不曉得這個新存儲庫中有哪些可用的包。這就是為什麼你需要先使用下面這個指令更新包中繼資料的本地緩存:
sudo apt update
這時你的系統就已經知道新增存儲庫中可用軟體包的資訊,現在可以試試安裝軟體包:
sudo apt install yarn
為了節省時間,你可以在 同一行挨着運作這兩個指令e。
sudo apt update && sudo apt install yarn
&&
可以確定第二個指令隻會在前一個指令沒有任何報錯的前提下運作。
整個流程就是這樣。
有沒有豁然開朗呢,還是一臉懵逼?
我已經解釋了在 Ubuntu 中使用外部存儲庫背後的邏輯。希望你現在能更好地了解它,當然可能還有很多細節會讓你困惑。
如果你還不清楚或者還有其他問題,可以聯系我。如果你發現了技術上的纰漏,記得在評論區告訴我。
via: https://itsfoss.com/adding-external-repositories-ubuntu/
作者:Abhishek Prakash選題:lujun9972譯者:nophDog校對:wxy
本文由 LCTT原創編譯,Linux中國榮譽推出