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

引子

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

樹莓派初學者通常到這裡就結束了,但如果你想基於樹莓派進一步學習 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 定義源碼包的來源。每一行的格式如下:

<code>deb(或deb-src)   [軟件倉庫1] [軟件倉庫2] [軟件倉庫3] .../<code>

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

  • main:官方支持的符合 DFSG 規範的軟件
  • contrib:帶有非自由依賴關係的 DFSG 兼容軟件
  • non-free:非 DFSG 兼容軟件
  • firmware:官方固件,非開源

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

樹莓派的默認軟件源配置:

<code>deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi/<code>

軟件源裡面有什麼?如果你在瀏覽器上打開軟件源 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 - 打印依賴這個包的軟件包信息(反向依賴)

常用命令組合

查看系統上安裝的軟件包

查看系統上安裝的所有軟件包和相關狀態,執行

<code>dpkg --list/<code>

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

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

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

<code>dpkg --list python*/<code>

要獲取軟件包的更詳細信息,比如 python3,執行:

<code>dpkg --status python3/<code>

輸出狀態、版本號、依賴包等信息。

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

列出軟件包包含的文件

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

<code>dpkg --listfiles rclone/<code>
理解樹莓派軟件源與 apt,一篇文章就夠了

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

也可以直接查看 deb 包內的文件,執行:

<code>dpkg-deb --contents rclone_1.45-3_armhf.deb/<code>
理解樹莓派軟件源與 apt,一篇文章就夠了

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

<code>dpkg-deb --extract rclone_1.45-3_armhf.deb temp/<code>

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

<code>dpkg --search rclone/<code>
理解樹莓派軟件源與 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


分享到:


相關文章: