理解樹莓派軟體源與 apt,一篇文章就夠了

引子

在 DIY 樹莓派各種專案的時候,總要安裝各種各樣的軟體包,一般執行 sudo apt-get install 指令就可以完成安裝。如果下載速度太慢,還可以 更換軟體源 加速下載。

樹莓派初學者通常到這裡就結束了,但如果你想基於樹莓派進一步學習 Linux 知識,成為樹莓派高階玩家,就非常有必要了解 apt-get 這條指令背後的原理,以及 Debian 系的包管理知識。

樹莓派官方的 Raspbian 作業系統是 Debian 的衍生版,共用 Debian 的軟體包管理機制,兩者是相通的。

起初 GNU/Linux 的世界中只有 。tar。gz。如果使用者要使用一個軟體,那就必須自己編譯。當 Debian 誕生以後,一種能管理作業系統中已安裝的軟體包的系統顯得很有必要,這個系統被命名為 dpkg。軟體包一詞在此第一次出現在 GNU/Linux。不久之後,紅帽公司建立了他們自己的包管理系統 rpm。

GNU/Linux 的創造者們很快又陷入了新的窘境。他們希望透過一種快捷、實用而且高效的方式來安裝軟體包,並能自動處理相互之間的依賴關係,還要在軟體包升級過程中維護好配置檔案。Debian 又一次充當了開路先鋒的角色,首創了 APT(Advanced Packaging Tool,高階軟體包管理工具)。這一工具後來被 Conectiva 移植到紅帽公司的 rpm 包管理系統。在其他一些發行版中,我們也能看到 APT 的身影。

dpkg (Debian Package)

在 Linux 發展之初,安裝軟體的時候是需要下載以 tar。gz 結尾的軟體原始碼包,然後對原始碼包進行編譯安裝。這是極其麻煩的使用。後來 Debian 開發了 dpkg(Debian Package) 管理工具來管理軟體,軟體都是以 deb 結尾的編譯好的二進位制包,透過 dpkg 命令可以安裝軟體和解除安裝軟體。

dpkg -i - 安裝軟體包

dpkg -r - 移除軟體包

dpkg -l - 檢視某個軟體包是否已經安裝

dpkg -L - 檢視某個軟體包中都包含哪些檔案

dpkg ——list - 檢視系統上安裝的所有軟體包和相關狀態

dpkg 是底層的包管理工具,不太常用,最常用的是 apt。

APT (Advanced Packaging Tool)

​dpkg 不夠人性化的一點就是不能自動解決依賴問題,比如 A 軟體包依賴於 B 軟體包,那麼你先得安裝 B 才能安裝 A。而且使用 dpkg 需要將軟體下載到本地才能安裝。使用 apt 安裝軟體時會自動從軟體倉庫下載軟體進行安裝,並且 apt 能自動解決依賴問題,當有依賴的時候它也會自動從軟體倉庫下載依賴的包進行安裝。當然 apt 底層還是呼叫 dpkg 來進行軟體安裝的。

apt相關檔案

/etc/apt/source。list 配置軟體包來源,也就是上面說的軟體倉庫

/ect/apt/apt。conf。d 存在apt的零碎配置檔案

/ect/apt/preferences 制定軟體包的版本引數

/var/cache/apt/archives 存放已下載的軟體包

/var/cache/apt/archives/partial 存放正在下載的軟體包

/var/lib/apt/lists 存放已下載的軟體包詳細資訊

樹莓派的 APT 相關配置檔案:

理解樹莓派軟體源與 apt,一篇文章就夠了

理解樹莓派軟體源與 apt,一篇文章就夠了

理解樹莓派軟體源與 apt,一篇文章就夠了

軟體源

軟體源(軟體倉庫)中存放這大量的軟體包,apt 會從軟體源中下載軟體。在 /ect/apt/soure。list 中可以為 apt 配置軟體源。在這個檔案中 deb 關鍵字定義已編譯的軟體包來源,deb-src 定義原始碼包的來源。每一行的格式如下:

deb(或deb-src) <軟體源地址> <主版本代號> [軟體倉庫1] [軟體倉庫2] [軟體倉庫3] 。。。

樹莓派的軟體倉庫一般有四種限定詞:

main:官方支援的符合 DFSG 規範的軟體

contrib:帶有非自由依賴關係的 DFSG 相容軟體

non-free:非 DFSG 相容軟體

firmware:官方韌體,非開源

DFSG 即 Debian Free Software Guidelines、自由軟體指導方針,比如規定軟體必須開源等。詳細說明見: Debian 社群契約

樹莓派的預設軟體源配置:

deb http://raspbian。raspberrypi。org/raspbian/ buster main contrib non-free rpideb-src http://raspbian。raspberrypi。org/raspbian/ buster main contrib non-free rpi

軟體源裡面有什麼?如果你在瀏覽器上開啟軟體源 url http://raspbian。raspberrypi。org/raspbian/,會發現它其實是一個靜態資源目錄:

理解樹莓派軟體源與 apt,一篇文章就夠了

dists 目錄包含 Raspbian 的各個發行版,既包括像 buster 一樣的具體發行版本,也包括像 stable、testing 和 unstable 的代號

pool 目錄為軟體包的下載地址。為了方便管理,pool 目錄下會繼續劃分 main、contrib 和 non-free 等子目錄。比如 python3 就位於 pool/main/p/python3-defaults 這個目錄下。

apt-get 命令

apt-get 命令一般用於軟體包的安裝,更新和移除

apt-get update - 更新本地的軟體源索引。在你更改了 Raspbian 的 /etc/apt/sources。list 或 /etc/apt/preferences 後,需要執行這個命令讓改動生效。最好能定期執行該命令,以確保軟體源索引是最新的。

apt-get upgrade - 更新所有已安裝的軟體包

apt-get install - 安裝軟體包

apt-get reinstall - 重灌軟體包

apt-get remove - 刪除已安裝的軟體包(保留配置檔案)

apt-get purge- 刪除已安裝包,同時刪除配置檔案

apt-get autoremove - 刪除未使用的安裝包

apt-get dist-upgrade - 更新整個系統到最新的發行版,相當於升級 Raspbian 系統

apt-get clean - 刪除本地所有的 deb 包(不會刪除軟體)

apt-get autoclean - 刪除本地已經安裝過的 deb 包

apt-get check - 檢查是否存在未安裝的軟體包依賴

apt-get source - 下載 deb 原始碼包到本地

apt-get download - 下載 deb 包到本地

apt-get changelog- 列印軟體包的版本變更日誌

apt-cache 命令

apt-cache 一般用於軟體包查詢和顯示軟體包資訊。

apt-cache search - 搜尋軟體包。當你不知道軟體包全名的時候,可以用這個指令搜尋關鍵詞

apt-cache depends - 列印軟體包的依賴包資訊

apt-cache rdepends - 列印依賴這個包的軟體包資訊(反向依賴)

常用命令組合

檢視系統上安裝的軟體包

檢視系統上安裝的所有軟體包和相關狀態,執行

dpkg ——list

輸出每個軟體包的一行簡單介紹,2 字元的狀態標誌,包名,所安裝版本和簡要描述。

理解樹莓派軟體源與 apt,一篇文章就夠了

如果要過濾包名,比如只顯示 python 開頭的包,執行

dpkg ——list python*

要獲取軟體包的更詳細資訊,比如 python3,執行:

dpkg ——status python3

輸出狀態、版本號、依賴包等資訊。

理解樹莓派軟體源與 apt,一篇文章就夠了

列出軟體包包含的檔案

要找出一個軟體包包含的所有檔案,比如找出 rclone 安裝過程中生成了哪些檔案,執行:

dpkg ——listfiles rclone

理解樹莓派軟體源與 apt,一篇文章就夠了

rclone 一是款檔案同步工具,支援本地檔案和 Microsoft OneDrive,Amazon Cloud Drive,Dropbox,FTP,SSH/SFTP 等多種雲端儲存同步 —— 如何在樹莓派上免費獲取 GB 級儲存空間 - 硬核樹莓派

也可以直接檢視 deb 包內的檔案,執行:

dpkg-deb ——contents rclone_1。45-3_armhf。deb

理解樹莓派軟體源與 apt,一篇文章就夠了

還可以把 deb 包內的檔案解壓到當前的 temp 目錄(這不是安裝,而是在本地目錄測試包內容的簡單方法),執行:

dpkg-deb ——extract rclone_1。45-3_armhf。deb temp

但如果你只想知道某個檔案是哪個軟體包生成的,執行:

dpkg ——search rclone

理解樹莓派軟體源與 apt,一篇文章就夠了

其他常用命令

Raspbian 不一定預設帶有下面這些命令。如果沒有的話,apt-get install 安裝即可。

apt-show-versions - 列印系統中所有已安裝的包的當前版本和可升級版本

apt-config - apt 的配置工具

tasksel - 用於安裝軟體集,例如一鍵安裝 gnome 桌面、xfce 桌面等等。——list-tasks 引數可以列出所有支援的軟體集。

dselect - 包管理系統的圖形選單介面,對第一次安裝和大範圍升級特別有用

dpkg-deb - 用於操作 deb 檔案,比如探查包內檔案等

dpkg-split - 大軟體包分割工具,例如把一個大 deb 分割成 N 部分,每部分 460KB

參考資料

UbuntuHelp:AptGet/Howto/zh - Ubuntu中文

APT HOWTO (Obsolete Documentation)

Ubuntu軟體包管理器 - 被罰站的樹 - 部落格園

Debian / packaging-tutorial · GitLab

The Debian GNU/Linux FAQ - Debian 的包管理系統

The Debian GNU/Linux FAQ - Debian 的 FTP

debian - What is the difference between ‘contrib’ and ‘non-free’ packages repositories? - Unix & Linux Stack Exchange

2。 The Debian Archive — Debian Policy Manual v4。5。0。0

Debian 社群契約

第 2 章 Debian 軟體包管理

網站:https://hardcore-rpi。biko。pub/

知乎專欄:https://zhuanlan。zhihu。com/hardcore-rpi

GitHub: https://github。com/hardcore-rpi

公眾號: https://hardcore-rpi。biko。pub/wx。html

頭條號: https://www。toutiao。com/c/user/1257451073577822/#mid=1659320797449220