Debian 軟體包管理
基礎軟體包管理知識
Debian 檔案庫
- Debian 官方建立一致的軟體包並從檔案庫中分發它們
- 提供 HTTP 和 FTP 的方式來訪問 Debian 檔案庫
- 全世界都有 Debian 檔案庫的 映象站,可以理解為 Debian 檔案庫的備份
軟體包管理工具
-
可以讓使用者從檔案庫安裝 統一設定 的二進位制軟體包到系統中
-
目前 Debian 的軟體包管理系統是 高階軟體包工具
APT
- apt: 用於所有的 互動式命令列 操作
- apt-get: 主要用於 指令碼呼叫,在 apt 不可用時可作為備用選項
- aptitude: 互動式的文字介面 來管理已安裝的軟體包和搜尋可用的軟體包
-
APT 前端使用者程式和後端的不同訪問方式
- dpkg: 底層 軟體包管理系統
- apt: 命令列 管理軟體包的 APT 前端 apt, apt-get, apt-cache
- aptitude: 全屏控制檯 互動式管理 軟體包的 APT 前端,可以管理軟體包的多個版本
- gnome-software: GNOME 圖形化的 APT 前端
- synaptic: GTK 圖形化的 APT 前端
-
APT 輔助工具
- apt-utils: APT 實用程式 apt-extracttemplates, apt-ftparchive, apt-sortpkgs
- apt-file: 軟體包搜尋工具
- apt-cache: 提供了標準的正規表示式來搜尋軟體包名稱和描述
- apt-rdepends: 查詢軟體包依賴
- apt-listchanges: 軟體包歷史更改提醒工具
- apt-listbugs: 在 APT 安裝前列出嚴重的 bug
- unattended-upgrades: 用於 APT 的增強軟體包,會自動安裝安全更新
-
apt-get 和 apt-cache 是最基礎的基於 APT 的軟體包管理工具,意味快但功能不豐富
-
apt-get 和 apt-cache 可以使用
/etc/apt/preferences
來管理軟體包的多個版本,但這非常繁瑣 -
在成功安裝下載的軟體包後,apt 將預設刪除快取的
.deb
軟體包
sources.list 檔案格式
對於典型的 HTTP 訪問,檔案庫在 /etc/apt/sources.list
檔案
# 源的資訊組成 deb/deb-src URL stable/testing/unstable [area ...]
deb http://deb.debian.org/debian/ bullseye main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye main contrib non-free
-
一行一條
-
第一個引數
- deb 表示二進位制軟體包
- deb-src 表示原始碼軟體包,非必要,不使用可以加速檔案庫後設資料的更新
-
第二個引數 Debian 檔案庫 的根 URL
- URL 可以是 "http://", "ftp://", "file://", ...
-
第三個引數是發行版名稱,這個一般需要檢視一下
- stable: 穩定版,不用說一般都是使用這個,用於你的生產伺服器
- testing: 測試版,它是自動滾動釋出的,由 Debian 檔案庫的 QA 質量架構來管理,更新得足夠頻繁來提供全部最新的特性
- unstable: 不穩定版,不推薦的使用,僅對開發者除錯軟體包合適
-
後面全部引數是 Debian 檔案庫的有效檔案庫範圍名稱
- main: 遵從 Debian 自由軟體指導方針(DFSG),並且不依賴於 non-free
- contrib: 遵從 Debian 自由軟體指導方針(DFSG),但依賴於 non-free
- non-free: 不遵從 Debian 自由軟體指導方針(DFSG)
自由軟體
- Debian 預設只安裝自由軟體
- Debian 建議只執行來自 main 的自由軟體
下面是一個小指令碼可以幫助你新增 第三方檔案庫,前提是你的預設 /etc/apt/sources.list 沒有被破壞並且會 Linux 的 CLI 介面的基本操作,此指令碼是根據預設的 sources.list 建立,當然你可以不用指令碼用手動編輯 φ(゜▽゜*)♪
-
第一步,在命令列執行以下內容
# 建立一個資料夾 test 名稱隨意 mkdir test # 建立指令碼,可以使用 vi, vim, ... 編輯,建議不會對應編輯器可以查詢一下用法 vi apt-sources.sh
-
第二步,編輯
apt-sources.sh
指令碼,注意:在進入 vi 編輯模式後 小心 每個操作,如果 不確定 或 有問題,可以按ESC
進入命令模式再按u
撤銷-
按照
i
輸入下面內容,只要按i
就可以進入編輯模式#!/bin/bash if [ -r $1 ]; then while read -r url; do filename=${url#*.} grep "^deb.*" /etc/apt/sources.list | sed -E "s~http.*\.[[:lower:]]{2,5}~$url~" > /etc/apt/sources.list.d/${filename%%.*}.list done < "$1" apt update else echo "檔案不存在或無法許可權讀取" fi
-
輸入完上面內容,按
Esc
進入命令模式,按:wq
儲存退出 vi 編輯器,如果有問題按照上面警告可以撤銷操作按:q!
退出 vi -
注:讀不懂指令碼,可以在 此處 瞭解 shell 指令碼的基本知識
-
-
第三步,編輯第三方檔案庫資訊,
vi sources.txt
像第二步一樣輸入下面內容,當然你可以新增其他你知道的 第三方檔案庫資訊,注意一條地址一行http://mirrors.ustc.edu.cn https://mirrors.aliyun.com
-
第四步,執行指令碼
# 賦予指令碼執行權 chmod +x apt-sources.sh # 執行指令碼 sudo ./apt-sources.sh sources.txt # 檢視新增是否成功 cd /etc/apt/sources.list.d/ && ls -lh
- 使用時部分命令可能執行不了,建議檢視許可權,可以使用
sudo
進行臨時提權,關於 sudo 資訊
- 使用時部分命令可能執行不了,建議檢視許可權,可以使用
說明:
- 如果需要對 檔案庫的有效檔案庫範圍 變更可以在
/etc/apt/sources.list.d/
目錄中找到不同第三方檔案庫進行調整 - 在
/etc/apt/sources.list.d/
目錄中最好一個檔案庫一個檔案 - 注意
/etc/apt/sources.list.d/
是官方為我們準備的不是指令碼建立的 - 此指令碼的作用:根據預設的 /etc/apt/sources.list 為模板,將每條 sources.txt 中的檔案庫地址於預設的進行替換,並一個檔案庫建立一個
.list
檔案存放在/etc/apt/sources.list.d/
目錄中
網上直接複製的源一般存在以下問題
-
協議問題,一般是 HTTP 協議,部分對 HTTPS 協議不友好需要安裝
apt-transport-https
或ca-certificates
的支援 -
發行版號不匹配,這個建議檢視自己當前系統
uname -a
然後在官網檢視,或看看 /etc/apt/sources.list 預設的內容,所以一般別改 /etc/apt/sources.list -
deb-src
一般含義此行需要下載大量原始碼資訊,一些不必的可以註釋掉,不一定每個倉庫需要拉取 -
GPG error
問題,這個一般是版本問題或安裝時是離線安裝,導致發行版的後設資料檔案 Release 不同步出現 GPG 驗證錯誤,或者離線安裝沒有網路在安裝時 apt 自動配置根據 CD/DVD 的資料配置等可能,建議瞭解 GPG解決方法是新增上對應的簽名即可,兩種方法,都需要 wget 這個一般有自帶,解決時的兩種關於簽名的檔案
.asc
或.gpg
-
直接使用 gpg 程式
-
確認 gpg 是否安裝,沒有就安裝一下
sudo apt-get install gpg
-
得到
.gpg
檔案,具體名字隨便,建議有辨識度,比如阿里雲記為 aliyun.gpg# 根據對應檔案庫的 Release.gpg 檔案下載 wget -qO- https://mirrors.aliyun.com/debian/dists/buster/Release.gpg?spm=a2c6h.25603864.0.0.25864a07v5Lsgz > aliyun.gpg # 如果是 .asc 檔案,使用 gpg --dearmor 轉化 wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
-
新增
.gpg
檔案,兩種方法# 方法一:安裝 /etc/apt/keyrings/ 目錄 sudo install -D -o root -g root -m 644 aliyun.gpg /etc/apt/keyrings/aliyun.gpg # 方法二:安裝 /etc/apt/trusted.gpg.d/ 目錄 sudo install -D -o root -g root -m 644 aliyun.gpg /etc/apt/trusted.gpg.d/aliyun.gpg
方法一需要改變 list 檔案,在
deb/deb-src
和url
之間新增一條資訊[arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/aliyun.gpg]
# 這是 /etc/apt/sources.list.d/aliyun.list 檔案,其中 ... 是簡化的需要根據情況填寫,參考預設的 /etc/apt/sources.list deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/aliyun.gpg] https://mirrors.aliyun.com/debian ...
-
-
使用 apt 預設的 apt-key
使用非常方便,首先下載 .asc 或 .gpg 檔案,然後使用 apt-key 安裝
# 下載 wget https://archive.kali.org/archive-key.asc wget -qO- https://mirrors.aliyun.com/debian/dists/buster/Release.gpg?spm=a2c6h.25603864.0.0.25864a07v5Lsgz > aliyun.gpg # 安裝 sudo apt-key archive-key.asc sudo apt-key aliyun.gpg
Release.gpg 檔案在每個檔案庫都有的,比如阿里的訪問 https://mirrors.aliyun.com/debian/dists/buster 就可以看到,
.asc
檔案也差不多在檔案庫中但位置不定,不同檔案庫可能不同需要自己查,Debian 官方檔案庫 的 keys 倉庫 地址 -
新手建議
-
/etc/apt/sources.list 不要包含 testing 或 unstable
-
/etc/apt/sources.list 不要在標準的 Debian 中混合使用其它非 Debian 的檔案庫
-
第三方檔案庫放在 /etc/apt/sources.list.d 分類以
.list
字尾結尾的檔案中 -
不要建立 /etc/apt/preferences
-
不瞭解會造成的全部影響,就不要透過配置檔案改變軟體包管理工具的預設行為
-
不要使用
dpkg -i random_package
或dpkg --force-all -i random_package
安裝任何軟體包 -
不要刪除或修改 /var/lib/dpkg/ 中的檔案
-
不要讓從原始碼直接安裝的程式覆蓋系統檔案
-
沒有在安全的條件下使用你特定的配置進行徹底地測試,就不要從 Debian 安裝任何軟體包
-
使用 non-free 和 contrib 中的軟體包所需要冒的風險
- 使用類似的軟體包會失去自由
- 失去 Debian 對軟體包的支援,這些軟體包無法訪問原始碼,Debian 不能進行完全的支援
- 可能存在商業付費
檔案庫臨時小故障
- 損壞的軟體包被上傳到檔案庫,多見於 unstable
- 延遲接受新的軟體包到檔案庫,多見於 unstable
- 檔案庫時間同步問題,在 testing 和 unstable
- 手動幹預檔案庫,多見於 testing
軟體包依賴關係
Debian 系統透過其控制檔案欄位中的版本化二進位制依賴宣告機制
- Depends: 絕對的依賴,所有在這裡列出的軟體包都必須同時或提前安裝
- Pre-Depends: 類似於 Depends,但列出的軟體包必須提前完成安裝
- Recommends: 這裡表示一個強,但不是絕對的依賴關係,大多數使用者不會想要這個包除非在這裡列出的所有包都已經安裝
- Suggests: 較弱的依賴,這個軟體包的大多數使用者可能會從安裝所列的軟體包中受益,但沒有它們也可以有適當的功能
- Enhances: 這裡表明一個像建議的弱依賴關係,不裝也沒關係
- Breaks: 表明一個軟體包不相容一些版本規範,一般的解決方法就是升級列出的所有軟體包
- Conflicts: 這表明了絕對的不相容,為了安裝這個軟體包必須移除所有列出的軟體包
- Replaces: 這表明這個檔案安裝的檔案會替代所列的軟體包的檔案
- Provides: 表明這個軟體包會提供所列的軟體包所有的檔案和功能
Conflicts, Replaces, Provides 定義到一個虛擬的軟體包,確保了在任何一個時間只能安裝一個提供該虛擬包的真正軟體包
APT 進行軟體包管理
基本操作
更新後設資料: apt update, apt-get update, aptitude update
- 從遠端檔案庫獲取檔案庫後設資料
- 重建並更新 APT 使用的本地後設資料
安裝軟體: apt install ..., apt-get install ..., aptitude install ...
- 選擇命令列中列出的包
- 解決軟體包依賴關係
- 從遠端伺服器獲取已選二進位制包
- 解包所獲取的二進位制軟體包
- 執行 preinst 指令碼
- 安裝二進位制檔案
- 執行 postinst 指令碼
升級軟體: apt upgrade/full-upgrade, pt-get upgrade/dist-upgrade, aptitude safe-upgrade/full-upgrade
- 選擇候選版本,預設最新的可用版本,除非手動指定版本
- 解決軟體包依賴關係
- 如果候選版本與已安裝的版本不同,會從遠端檔案庫獲取所選擇的二進位制軟體包
- 解包所獲取的二進位制軟體包
- 執行 preinst 指令碼
- 安裝二進位制檔案
- 執行 postinst 指令碼
移除軟體: apt remove ..., apt-get remove ..., aptitude remove ...
- 選擇命令列中列出的包
- 解決軟體包依賴關係
- 執行 prerm 指令碼
- 移除已安裝的檔案,除了 配置檔案
- 執行 postrm 指令碼
清除軟體: apt purge ..., apt-get purge ..., aptitude purge ...
- 選擇命令列中列出的包
- 解決軟體包依賴關係
- 執行 prerm 指令碼
- 移除已安裝的檔案,包含 配置檔案
- 執行 postrm 指令碼
軟體包管理操作
- apt 用於互動式命令列
- aptitude 全屏的互動式文字使用者介面
- apt-get/apt-cache 基本工具,主要用於指令碼
apt | aptitude | apt-get/apt-cache | 描述 |
---|---|---|---|
apt update | aptitude update | apt-get update | 更新軟體包檔案庫後設資料 |
apt install foo | aptitude install foo | apt-get install foo | 安裝 foo 軟體包的候選版本以及它的依賴 |
apt upgrade | aptitude safe-upgrade | apt-get upgrade | 安裝已安裝的軟體包的候選版本並且不移除任何其它的軟體包 |
apt full-upgrade | aptitude full-upgrade | apt-get dist-upgrade | 安裝已安裝的軟體包的候選版本,並且需要的話會移除其它的軟體包 |
apt remove foo | aptitude remove foo | apt-get remove foo | 移除 foo 軟體包,但留下配置檔案 |
apt autoremove | N/A | apt-get autoremove | 移除不再需要的自動安裝的軟體包 |
apt purge foo | aptitude purge foo | apt-get purge foo | 清除 foo 軟體包的配置檔案 |
apt clean | aptitude clean | apt-get clean | 完全清除本地倉庫的軟體包檢索檔案 |
apt autoclean | aptitude autoclean | apt-get autoclean | 清除本地倉庫中過時軟體包的軟體包檢索檔案 |
apt show foo | aptitude show foo | apt-cache show foo | 顯示 foo 軟體包的詳細資訊 |
apt search regex | aptitude search regex | apt-cache search regex | 搜尋匹配 regex 的軟體包 |
N/A | aptitude why regex | N/A | 解釋匹配 regex 的軟體包必須被安裝的原因 |
N/A | aptitude why-not regex | N/A | 解釋匹配 regex 的軟體包不必安裝的原因 |
N/A | aptitude search '~i!~M' | apt-mark showmanual | 列出手動安裝的軟體包 |
- 對於使用體驗和功能性: aptitude > apt > apt-get/apt-cache
- 對於自動化指令碼: apt-get/apt-cache > apt > aptitude
- apt 算得上是 apt-get, apt-cache, ... 類似命令的封裝,針對終端使用者互動的介面
注意:
- 不建議在新版本釋出後在 stable 的 Debian 系統上使用 aptitude 命令來進行跨版本的系統升級
- aptitude 命令有時候會為了 testing 或 unstable 的 Debian 系統升級清除大量軟體包
- 建議使用者使用 apt 命令用於 互動式 的使用場景,而在 shell 指令碼 中使用 apt-get/apt-cache 命令
- 對於它們更精細化或特殊選項的使用建議 man 檢視