引子
在 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 會從軟件源中下載軟件。在 /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/,會發現它其實是一個靜態資源目錄:
- 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 字符的狀態標誌,包名,所安裝版本和簡要描述。
如果要過濾包名,比如只顯示 python 開頭的包,執行
<code>dpkg --list python*/<code>
要獲取軟件包的更詳細信息,比如 python3,執行:
<code>dpkg --status python3/<code>
輸出狀態、版本號、依賴包等信息。
列出軟件包包含的文件
要找出一個軟件包包含的所有文件,比如找出 rclone 安裝過程中生成了哪些文件,執行:
<code>dpkg --listfiles rclone/<code>
rclone 一是款文件同步工具,支持本地文件和 Microsoft OneDrive,Amazon Cloud Drive,Dropbox,FTP,SSH/SFTP 等多種雲存儲同步 —— 如何在樹莓派上免費獲取 GB 級存儲空間 - 硬核樹莓派
也可以直接查看 deb 包內的文件,執行:
<code>dpkg-deb --contents rclone_1.45-3_armhf.deb/<code>
還可以把 deb 包內的文件解壓到當前的 temp 目錄(這不是安裝,而是在本地目錄測試包內容的簡單方法),執行:
<code>dpkg-deb --extract rclone_1.45-3_armhf.deb temp/<code>
但如果你只想知道某個文件是哪個軟件包生成的,執行:
<code>dpkg --search rclone/<code>
其他常用命令
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
閱讀更多 硬核樹莓派 的文章