Linux中國

詳解在 Ubuntu 從外部存儲庫安裝軟體包

你大概知道怎麼在 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

當你需要直接從開發者那裡安裝編程工具的時候,大概率會碰到這種安裝方式。

許多人只是按照說明進行操作,並不會去思考其中的原理。這也沒什麼不對,但了解該過程實際上可以提升你在這方面的知識,而且有助於之後排除故障。

我來解釋一下這些代碼背後的邏輯。

理解從外部存儲庫安裝的過程

在你繼續往下閱讀之前,我強烈建議你先看看下面這兩篇文章,方便理解後續的概念:

為了讓你有點印象,這裡有一張軟體包存儲庫和 Linux 中的包管理器 的圖片。

Illustration of repository and package manager

整件事情其實就是在系統中添加一個新的外部存儲庫。這樣,你就可以從這個新存儲庫下載並安裝可用的軟體包。如果這個存儲庫提供了包版本的更新,你可以在更新系統的同時更新這些軟體包(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 密鑰。

List GPG keys

這是將 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 結尾)。

External repository should have their own sources list file in the /etc/apt/sources.list.d directory

這使得包管理變得更容易。如果你要從系統中刪除一個存儲庫,只需刪除相應的源文件即可。無需修改主 sources.list 文件。

讓我們再仔細地看一下這行命令。

sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list.d/yarn.list'

使用 sh 可以在一個新的 shell 進程中運行命令,而不是 子 shel​​l-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中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國