Debian 軟體包管理

2023-01-18 18:01:36

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-httpsca-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-srcurl 之間新增一條資訊 [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_packagedpkg --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 檢視

關於 GNU/Linux 的內容