章 2. Debian 軟體包管理

內容目錄

2.1. Debian 軟體包管理的前提
2.1.1. Debian 軟體包管理
2.1.2. 軟體包調配
2.1.3. 基本的注意事項
2.1.4. 持續升級的生活
2.1.5. Debian 檔案庫基礎
2.1.6. Debian 是100% 的自由軟體
2.1.7. 軟體包依賴關係
2.1.8. 包管理的事件流
2.1.9. 對包管理問題的第一個迴應
2.1.10. 如何挑選 Debian 軟體包
2.1.11. 怎樣和不一致的要求協作
2.2. 基礎軟體包管理操作
2.2.1. apt vs. apt-get / apt-cache vs. aptitude
2.2.2. 指令列中的基礎軟體包管理操作
2.2.3. aptitude 的互動式使用
2.2.4. aptitude 的按鍵繫結
2.2.5. aptitude 軟體包檢視
2.2.6. aptitude 搜尋方式選項
2.2.7. aptitude 正規表達式
2.2.8. aptitude 的依賴解決
2.2.9. 軟體包活動日誌
2.3. aptitude 操作範例
2.3.1. 查詢感興趣的軟體包
2.3.2. 通過正規表達式匹配軟體包名稱來列出軟體包
2.3.3. 使用正規表達式匹配瀏覽
2.3.4. 完整地清理已刪除軟體包
2.3.5. 調整自動/手動安裝狀態
2.3.6. 全面的系統升級
2.4. 高階軟體包管理操作
2.4.1. 指令列中的高階軟體包管理操作
2.4.2. 驗證安裝的軟體包檔案
2.4.3. 預防軟體包故障
2.4.4. 搜尋軟體包元資料
2.5. Debian 軟體包內部管理
2.5.1. 檔案庫元資料
2.5.2. 頂層“Release”檔案及真實性
2.5.3. 檔案庫層的“Release”檔案
2.5.4. 獲得用於軟體包的元資料
2.5.5. APT 的軟體包狀態
2.5.6. aptitude 的軟體包狀態
2.5.7. 獲得的軟體包的本地副本
2.5.8. Debian 軟體包檔名稱
2.5.9. dpkg 指令
2.5.10. update-alternatives 指令
2.5.11. dpkg-statoverride 指令
2.5.12. dpkg-divert 指令
2.6. 從損壞的系統中恢復
2.6.1. 缺少依賴導致的安裝失敗
2.6.2. 軟體包資料快取錯誤
2.6.3. 不相容舊的使用者調配
2.6.4. 具有相同檔案的不同軟體包
2.6.5. 修復損壞的軟體包指令碼
2.6.6. 使用 dpkg 指令進行救援
2.6.7. 恢復軟體包選擇資料
2.7. 軟體包管理技巧
2.7.1. 上傳軟體包的是誰?
2.7.2. 限制 APT 的下載頻寬
2.7.3. 自動下載和升級軟體包
2.7.4. 更新和向後移植
2.7.5. 外部軟體包檔案庫
2.7.6. 不使用 apt-pinning 的混合源檔案庫軟體包
2.7.7. 使用 apt-pinning 調整獲選版本
2.7.8. 阻止推薦的軟體包的安裝
2.7.9. 使用帶有 unstable 軟體包的 testing 版本
2.7.10. 使用帶有 experimental 軟體包的 unstable 版本
2.7.11. 緊急降級
2.7.12. equivs 軟體包
2.7.13. 移植一個軟體包到 stable 系統
2.7.14. 用於 APT 的代理伺服器
2.7.15. 更多關於軟體包管理的文件
[注意] 注意

這一章假定最新的穩定版的代號為:bookworm

在本文件中,APT 系統的資料來源總稱為源列表。能夠在 "/etc/apt/sources.list" 檔案、 "/etc/apt/sources.list.d/*.list"檔案或"/etc/apt/sources.list.d/*.source"檔案的任何地方定義。

Debian 是一個志願者組織,它建立一致的自由軟體的預編譯二進位制包並從檔案庫中分發它們。

許多遠端映象站提供了 HTTP 和 FTP 的方式來存取 Debian 檔案庫。也可以使用 CD-ROM/DVD

目前 Debian 的軟體包管理系統是 高階軟體包工具 (APT),它能夠使用所有這些資源。

Debian 軟體包管理系統,當使用適當時,可以讓使用者從檔案庫安裝統一設定的二進位制軟體包 到系統中。現在,有 74165 個可用於 amd64 架構的軟體包。

Debian 軟體包管理系統有豐富的歷史,有許多可供選擇的前端使用者程式和後端存取方式。現在,我們推薦下列的這些。

  • apt(8) 用於所有的互動式命令列操作,包含軟體包的安裝、移除和版本升級。

  • apt-get(8) 用於從指令碼中呼叫 Debian 軟體包管理系統。它在 apt 不可用時也可作為一個備選選項(常見於較舊的 Debian 系統)。

  • aptitude(8) 使用一個互動式的文字介面來管理已安裝的軟體包和搜尋可用的軟體包。


[警告] 警告

不要從任何的混合套件中安裝軟體包。它可能會打破軟體包的一致性,這需要你要深厚的系統管理知識,例如 ABI 編譯器、版本和直譯器特性等等。

Debian 系統管理員中的新手應該保持在只進行安全更新的 stable 版本。直到你十分了解 Debian 系統前,你應當遵循下列的預防措施。

  • 原始檔 中不要包含 testingunstable

  • 原始檔 裡不要在標準的 Debian 中混合使用其它非 Debian 的檔案庫,例如 Ubuntu 。

  • 不要建立 “/etc/apt/preferences” 。

  • 不瞭解會造成的全部影響,就不要通過組態檔案改變軟體包管理工具的預設行為。

  • 不要使用 “dpkg -i random_package” 安裝任何軟體包。

  • 絕不使用 “dpkg --force-all -i random_package” 安裝任何軟體包。

  • 不要刪除或修改 “/var/lib/dpkg/” 中的檔案。

  • 不要讓從原始碼直接安裝的程式覆蓋系統檔案。

    • 如果需要的話,將它們安裝到 “/usr/local” 或 “/opt” 中。

對 Debian 軟體包管理系統,違背上面的預防措施,會導致不相容影響,可能會使你的系統無法使用。

負責有關鍵任務的伺服器的嚴謹的 Debian 系統系統管理員,應該使用額外的預防措施。

  • 沒有在安全的條件下使用你特定的調配進行徹底地測試,就不要從 Debian 安裝任何軟體包(包含安全更新)。

    • 你作為系統管理員要對你的系統負責到底。

    • Debian 系統長久的穩定史並無法保證什麼。

[注意] 注意

對於你的生產伺服器,建議使用帶有安全更行的 stable 套件。對於你只進行有限管理的桌面 PC 也是同樣如此。

儘管我在上面進行了警告,我知道本文件的許多讀者希望可以執行更新的 testingunstable 版。

菩薩使用下面的內容拯救一個人,使他從掙扎於持續升級地獄因果報應中脫困,並讓他達到 Debian 的極樂世界

這個列表面向 自己管理的 桌面環境。

  • 使用 testing 版,實際上,它是自動滾動釋出的,由 Debian 檔案庫的 QA 質量架構來管理,比如:Debian 持續整合只上傳原始碼實踐庫轉換跟蹤。在 testing 版中的軟體包被更新得足夠頻繁來提供全部最新的特性。

  • 源列表裡面設定 testing 版相應的程式碼名為套件名(在 bookworm-作為-stable 版的釋出週期時,是"trixie")。

  • 大概在主版本釋出一個月後,僅僅在你自己評估了形勢後,才手動更新 原始檔 裡的這個程式碼名到新的版本號。對於這個更新,Debian 使用者和開發者郵件列表也是好的資訊來源。

使用 unstable 版是不推薦的。unstable 版對開發者 除錯軟體包合適,但對普通的桌面使用而言,會有使你暴露在不必要的風險中的傾向。 儘管 Debian 系統的 unstable 版在大多數時候看起來都非常穩定,但會有一些軟體包問題,並且它們中的一部分是不容易解決的。

這裡有一些基本預防措施意見,確保簡單快速地從 Debian 軟體包的 bug 中恢復。

  • 通過將 Debian 系統的 stable 套件安裝到另一個分割槽,可以使系統能夠進行雙啟動

  • 製作安裝 CD 便於用於 救援啟動

  • 考慮安裝 apt-listbugs ,這可以在升級之前檢查 Debian Bug 跟蹤系統(BTS) 的資訊

  • 對軟體包系統的基礎設施有足夠的瞭解來解決問題

[注意] 注意

如果你無法做到這些預防措施中的任何一個,那你可能還沒做好使用 testingunstable 版的準備。

[提示] 提示

Debian 檔案庫官方政策的定義參見 Debian 政策文件,第2章 —— Debian 檔案庫

讓我們從系統使用者的角度來看看 Debian 檔案庫

對於系統使用者,是使用 APT 系統來訪問 Debian 檔案庫

APT 系統定義它的資料來源作為源列表,在 sources.list(5) 裡面描述。

對於使用典型的 HTTP 訪問的 bookworm系統,單行格式的源列表如下:

deb http://deb.debian.org/debian/ bookworm main non-free-firmware contrib non-free
deb-src http://deb.debian.org/debian/ bookworm main non-free-firmware contrib non-free

deb http://security.debian.org/debian-security bookworm-security main non-free-firmware contrib non-free
deb-src http://security.debian.org/debian-security bookworm-security main non-free-firmware contrib non-free

可替代的,相等的使用 deb822 格式的源列表如下:

Types: deb deb-src
URIs: http://deb.debian.org/debian/
Suites: bookworm
Components: main non-free-firmware contrib non-free

Types: deb deb-src
URIs: http://security.debian.org/debian-security/
Suites: bookworm-security
Components: main non-free-firmware contrib non-free

原始檔 的關鍵點如下。

  • 單行格式

    • 它的定義檔案在"/etc/apt/sources.list"檔案和"/etc/apt/sources.list.d/*.list"檔案裡面。

    • 每一行定義了 APT 系統的資料來源。

    • deb” 的那行定義了二進位制軟體包。

    • deb-src” 的那行定義了原始碼軟體包。

    • 第一個參數是 Debian 檔案庫的根 URL 。

    • 第二個引數是發行版名稱,可以使用套件名或代號。

    • 第三個和之後的參數是 Debian 檔案庫的有效檔案庫範圍名稱。

  • Deb822 格式

    • 它的定義檔案在"/etc/apt/sources.list.d/*.source"檔案裡。

    • 由空格隔開的每個多行塊,定義了 APT 系統的資料來源。

    • "Types:" 章節定義列表型別,即"deb" 和 "deb-src"。

    • "URIs:"章節定義 Debian 檔案庫 URI 的根地址。

    • "Suites:"章節定義了發行版名稱列表,名稱可以使用套件名或代號。

    • "Components:" 章節定義 Debian 檔案庫中有效檔案庫名稱列表。

如果只是用 aptitude,它不訪問原始碼相關的元資料,“deb-src”定義可以安全地省略。這可以加速檔案庫元資料的更新。

URL 可以是 "https://", "http://", "ftp://", "file://",……

"#" 開頭的行是註釋,被忽略。

這裡,我傾向於使用代號 “bookworm”或"trixie"來代替套件名 “stable”或"testing" ,以避免下一個 stable 版本釋出時出現意外。

[提示] 提示

如果在上述的例子中,使用了 “sid” 代替 “bookworm” ,那麼源列表中用於安全更新的 “deb: http://security.debian.org/ …” 這行或它的 deb822 等價內容就不需要了。因為沒有用於 “sid” (unstable)的安全更新的檔案庫。

bookworm 釋出後,下面是配置檔案所使用的 Debian 檔案庫站點的 URL 和套件名或代號的列表。


[注意] 注意

只有帶有安全更新的純淨的 stable release 版本可以提供最佳的穩定性。執行大多數 stable release 版本的軟體包之中混合一些來自 testingunstable release 版本的軟體包會比執行純淨的 unstable release 版本冒更大的風險,這是因為庫版本的不匹配導致的。如果在 stable release 版本下你真的需要一些程式的最新版本,請使用來自stable-updatesbackports (參見 節 2.7.4, “更新和向後移植”)的軟體包。使用這些軟體包時必須額外小心。

[注意] 注意

在 "deb" 行中,你只需列出 stabletesting 或者 unstable 套件中的一個即可,如果你在 "deb" 行中混合了 stabletestingunstable 套件,APT 程式的執行速度將會變慢並且只有最新的檔案庫是有用的。只有在 "/etc/apt/preferences" 檔案帶有明確目標的時候,混合的列表才是有意義的。(檢視節 2.7.7, “使用 apt-pinning 調整獲選版本”)。

[提示] 提示

對於使用 stable 套件的 Debian 系統而言,在 源列表 中包含帶有 “http://security.debian.org/” 的內容是不錯的主意。它會啟用安全更新。

[注意] 注意

Debian 安全團體將會修正 stable 檔案庫的安全缺陷。這些行為是十分嚴格可靠的。testing 檔案庫中的缺陷,不一定會被 Debian 測試安全團體修正。由於一些原因,這些行為相對 stable 檔案庫沒有那麼嚴格,您可能需要等待已修正的 unstable 軟體包移植到 testingunstable 檔案庫的缺陷,交由各個維護者修改。經常維護的unstable 軟體包通常處於相當好的狀況,因為它利用了上流最新的安全修正。有關 Debian 怎樣處理安全缺陷,請參見 Debian安全常問問題


上述軟體包的數量是 amd64 架構的。main 區域提供 Debian 系統(參見 節 2.1.6, “Debian 是100% 的自由軟體”)。

通過把你的瀏覽器指向檔案庫 URL,這些 URL 在 distspool 之後是各不相同的,Debian 檔案庫能夠被有規劃的組織。

發行版可以用套件或代號來指定。發行版在許多文件中也被當做是套件的同義詞。套件和代號的關係總結如下。


代號的歷史參見 Debian FAQ: 6.2.1 Which other codenames have been used in the past?

在較嚴格的 Debian 檔案術語,“部分 section”這一詞特指按應用領域來分類的軟體包類別。(但是,主要部分 ("main section") 這一詞有時會用來描述 Debian 檔案區中,名為”main 主要"的區域 。)

Debian 開發者(DD)每次上傳軟體包到 unstable 檔案庫(通過 incoming 處理),都必須確保上傳的軟體包與最新的 unstable 檔案庫中的最新軟體包相容。

如果 DD 故意打破重要的庫升級等的這種相容性,這通常會在 Debian 開發者郵件列表等進行公告。

在 Debian 檔案庫維護指令碼將軟體包從 unstable 檔案庫移動到 testing 檔案庫前,檔案庫維護指令碼不僅檢查時間(約2-10天)和軟體包的 RC bug 報告的狀態,還嘗試確保它們可以和最新的 testing 檔案庫中的軟體相容。這個過程使得testing 檔案庫非常正確可用。

通過由釋出團隊領導的逐步凍結檔案庫的過程,並進行一些手動干預,使 testing 檔案庫完全一致,無缺陷。然後,將舊的 testing 檔案庫的程式碼名稱分配給新的 stable 檔案庫,併為新的 testing 檔案庫建立新的程式碼名稱。新的 testing 檔案庫最初的內容和新發布的 stable 檔案庫的內容完全相同。

unstabletesting 檔案庫都可能會遭受由以下幾個因素導致的臨時的小故障。

  • 損壞的軟體包被上傳到檔案庫(多見於 unstable

  • 延遲接受新的軟體包到檔案庫(多見於 unstable )

  • 檔案庫時間同步問題( testingunstable

  • 手動干預檔案庫,例如移除軟體包(多見於 testing )等。

因此,如果你決定使用這些檔案庫,你應該能夠修復或忍受這些型別的小故障。

[注意] 注意

在新的 stable 版本釋出後的幾個月,大多數桌面使用者應該使用帶有安全更新的 stable 檔案庫,即使他們通常使用 unstabletesting 檔案庫。在這個過渡期中,unstabletesting 檔案庫不適合大多數人。你使用 unstable 檔案庫的系統是很難保持良好的工作狀態的,因為它會遭受核心軟體包的大量升級狂潮。 testing 檔案庫不大有用,因為它包含有和沒有安全支援的 stable 檔案庫相同的內容(Debian testing 安全公告 2008-12)。一個月左右的時間後, 如果你仔細點的話, unstabletesting 檔案庫或許可以使用。

[提示] 提示

跟蹤 testing 檔案庫時,由一個已移除的軟體包引起的問題通常可以安裝 unstable 檔案庫中相同的軟體包(已修復 bug )來解決。

檔案庫的定義參見 Debian 政策文件

Debian 是100%的自由軟體,因為:

  • Debian 預設只安裝自由軟體,這尊重了使用者的自由。

  • Debian 在 main 中只提供自由軟體。

  • Debian 建議只執行來自 main 的自由軟體。

  • main 中的軟體包,沒有依賴或推薦在 non-freenon-free-firmwarecontrib 中的軟體包。

有人想知道下列的兩個事實是否互相矛盾。

因為下列原因,這並不矛盾。

  • Debian 系統具有100%的自由,並且它的軟體包位於 Debian 伺服器的 main 區域。

  • Debian 系統之外的軟體包位於 Debian 伺服器的 non-freenon-free-firmwarecontrib 區域。

Debian 社群契約的第4條和第5條對這進行了明確的解釋:

  • 我們將優先考慮我們的使用者及自由軟體

    • 我們由我們的使用者及自由軟體社群的需要所導向。我們將優先考慮他們的利益。我們將在多種計算環境中支援我們的使用者的操作需要。我們不反對在 Debian 系統上使用非自由軟體,我們也不會嘗試向建立和使用這部分軟體的使用者索取費用。我們允許他人,在沒有我們的資金的參與下,製造包括 Debian 以及商業軟體的增值套件。為了達成這些目標,我們將提供整合的、高質量的、100%自由的軟體,而不附加任何可能阻止在這些方面使用的法律限制。

  • 哪些作品不符合我們的自由軟體規範

    • 我們知道,某些我們的使用者需要使用不符合 Debian 自由軟體指導方針的作品。 我們為這些作品,在我們的檔案庫中留出了"non-free"、"non-free-firmware"和"contrib"目錄。在這些目錄下的軟體包,並不屬於 Debian 系統 儘管它們已被配置成可以在 Debian 下使用。我們鼓勵光碟製造商閱讀這些目錄下的軟體的許可證,以判斷他們是否可以在光碟中發行這些軟體 。所以,儘管非自由軟體並非 Debian 系統的一部分,我們仍支援它們的使用,並且我們為非自由軟體提供了公共資源 (諸如我們的缺陷跟蹤系統以及郵件列表)。Debian 官方媒介可以包括韌體,韌體不是 Debian 系統的一部分,這是一個例外,能夠讓 Debian 用於需要這些韌體的硬體上。

[注意] 注意

在目前的 Debian 社群契約(Debian Social Contract) 1.2 版本第 5 條條款的實際文字和上面的文字有稍微不同。在不改變 Debian 社群契約實際內容下,這個文字調整讓本使用者文件在邏輯上保持一致。

使用者應該瞭解使用 non-freenon-free-firmwarecontrib 中的軟體包所需要冒的風險:

  • 使用類似的軟體包會失去自由

  • 失去 Debian 對軟體包的支援(這些軟體包無法存取原始碼,Debian 不能進行完全的支援。)

  • 汙染你100%自由的 Debian 系統

Debian 自由軟體引導方針Debian 設立了自由軟體標準。Debian 對軟體包中的軟體做了最廣泛的解釋,包含文件、韌體、圖示和圖形資料。這使得 Debian 的自由軟體標準非常嚴格。

典型的 non-freenon-free-firmwarecontrib 軟體包包含了下列型別的自由分發的軟體包:

  • GNU Free Documentation License下的文件包 ,包含不變的部分 ,比如GCC 和 Make的。 (大多數都可以在non-free/doc找到 .)

  • 包含沒有原始碼的二進位制資料的韌體軟體包,例如在 節 9.10.5, “硬體驅動和韌體” 中作為 non-free-firmware 列出的軟體包。(多見於 non-free-firmware/kernel 部分。)

  • 遊戲和字型軟體包,對商業使用和/或內容修改進行了限制。

請注意,non-freenon-free-firmwarecontrib 軟體包的數量少於 main 軟體包的2%。允許訪問 non-freenon-free-firmwarecontrib 並不會模糊軟體包的來源。使用 aptitude(8) 的全屏互動式介面可以提供完全的可見性和完全的控制,可以讓你決定安裝來自某個部分的軟體包,來使你的系統保持自由。

Debian 系統通過其控制檔案欄位中的版本化二進位制依賴宣告機制來提供一致的二進位制軟體包集合。下面有一些它們的簡單定義。

  • “依賴”

    • 絕對的依賴,所有在這裡列出的軟體包都必須同時或提前安裝。

  • "預依賴"

    • 類似於 Depends,但列出的軟體包必須提前完成安裝。

  • "推薦"

    • 這裡表示一個強,但不是絕對的依賴關係 。大多數使用者不會想要這個包,除非在這裡列出的所有包都已經安裝。

  • "建議"

    • 較弱的依賴。這個軟體包的大多數使用者可能會從安裝所列的軟體包中受益,但沒有它們也可以有適當的功能。

  • "增強"

    • 這裡表明一個像建議的弱依賴關係,不裝也沒關係。

  • "破損"

    • 表明一個軟體包不相容一些版本規範。一般的解決方法就是升級列出的所有軟體包。

  • "衝突"

    • 這表明了絕對的不相容。為了安裝這個軟體包必須移除所有列出的軟體包。

  • "替代"

    • 這表明這個檔案安裝的檔案會替代所列的軟體包的檔案。

  • "提供"

    • 表明這個軟體包會提供所列的軟體包所有的檔案和功能。

[注意] 注意

請注意,同時將 “Provides” 、“Conflicts” 和 “Replaces” 定義到一個虛擬的軟體包是一個明智的調配。這確保了在任何一個時間只能安裝一個提供該虛擬包的真正軟體包。

包含原始碼依賴關係的官方定義位於 the Policy Manual: Chapter 7 - Declaring relationships between packages

這是 APT 提供的軟體包管理的簡單事件流摘要。

這裡,為了大局,我特意省略了技術細節。

無論你決定使用哪個 Debian 系統套件,你仍然希望執行在那個套件裡不存在的程式版本。即使你在其它 Debian 套件裡面,或者在其它非 Debian 的資源裡面,找到這個程式的二進位制軟體包,它們的要求可能和你目前的 Debian 系統不一致。

節 2.7.7, “使用 apt-pinning 調整獲選版本” 裡描述的 apt-pinning 等技術,雖然你能夠用它來調整軟體包管理系統來安裝這類不不同步的二進位制軟體包,但這樣的調整方法只有有限的使用場景,應為它們可能破壞那些程式和你的系統。

在單獨安裝這類不同步的軟體包之前,你需要查詢所有存在的和你目前 Debian 系統相容的安全技術替代方案。

在 Debian 系統中有許多基於 APT 的軟體包管理工具可以在 Debian 系統上進行基於倉庫的軟體包管理操作。在這裡,我們將介紹兩種基本的軟體包管理工具:aptapt-get / apt-cacheaptitude

對於涉及軟體包安裝或更新軟體包元資料的軟體包管理操作,你必須有 root 許可權。

儘管 aptitude 是作者主要使用的一個非常好的可互動工具,但你應該知道下列警示:

apt-getapt-cache 是最基礎 的基於 APT 的軟體包管理工具。

  • apt-getapt-cache 只提供指令列使用者介面。

  • apt-get 是進行跨版本的主系統升級等操作的最合適工具。

  • apt-get 提供了一個強大的軟體包依賴解析器。

  • apt-get 對硬體資源的要求不高。它消耗更少的記憶體並且執行速度更快。

  • apt-cache 提供了一個 標準的正規表達式來搜尋軟體包名稱和描述。

  • apt-getapt-cache 可以使用 /etc/apt/preferences 來管理軟體包的多個版本,但這非常繁瑣。

apt指令是一個高階的命令列介面用於套件管理。基本上,它是apt-getapt-cache及其相似指令的封裝。本意為一個終端使用者介面,且預設開啟一些適合互動用途的選項。

  • apt 工具在使用者使用 apt install 安裝軟體包時提供了一個友好的進度條。

  • 在成功安裝下載的軟體包後,apt 將預設刪除快取的 .deb 軟體包。

[提示] 提示

建議使用者使用新的 apt(8) 命令用於 互動式的使用場景,而在 shell 指令碼中使用 apt-get(8) 和apt-cache(8) 命令。

aptitude 指令是最通用的基於 APT 的軟體包管理工具。

  • aptitude 提供了一個全螢幕的互動式文字使用者介面。

  • aptitude 同樣也提供了一個指令使用者介面。

  • aptitude 是用於日常軟體包管理(例如檢查已安裝的軟體包和搜尋可用的軟體包)的最合適工具。

  • aptitude 對硬體資源的要求更高。它消耗更多的記憶體並且執行速度更慢。

  • aptitude 提供一個增強的正規表達式來搜尋所有的軟體包元資料。

  • aptitude 可以管理軟體包的多個版本,並且不使用 /etc/apt/preferences,這會十分直觀。

下面是使用 apt(8), aptitude(8) 和 apt-get(8) / apt-cache(8) 的命令列基本軟體包管理操作。

表格 2.6. 使用 apt(8), aptitude(8) 和 apt-get(8) / apt-cache(8) 的命令列基本軟體包管理操作

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 正則表示式 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 的軟體包不必安裝的原因
apt list --manual-installed aptitude search '~i!~M' apt-mark showmanual 列出手動安裝的軟體包

apt / apt-getaptitude 能夠混用,沒有大問題。

aptitude why regex” 可以透過 “aptitude -v why regex” 列出更多的資訊。類似的資訊可以透過"apt rdepends package" 或 “apt-cache rdepends package” 獲取。

aptitude 指令在指令列模式下啟動後遇到了一些問題(例如軟體包衝突),你可以在之後的提示中按下 “e” 鍵切換到全螢幕的互動模式。

[注意] 注意

雖然 aptitude 命令提供了豐富的功能,例如增強的軟體包解析器,但它的複雜程度導致了(或可能導致)一些退步,例如 Bug #411123Bug #514930Bug #570377。如有疑問,請使用 apt,apt-getapt-cache 命令來替代 aptitude 命令。

你可以在 “aptitude” 後面使用的指令選項。


更多內容參見 aptitude(8) 和位於 “/usr/share/doc/aptitude/README” 的 “aptitude 使用者手冊”。

aptitude(8) 全螢幕互動模式下,軟體包列表裡的軟體包會像下面的例子那樣顯示。

idA   libsmbclient                             -2220kB 3.0.25a-1  3.0.25a-2

該行的從左到右的含義如下。

  • “狀態”標籤 (第一個字母)

  • “動作”標籤(第二個字母)

  • “自動”標籤(第三個字母)

  • 軟體包名稱

  • 該“動作”對磁碟空間的變化

  • 軟體包當前版本

  • 軟體包可用版本

[提示] 提示

您可以在幫助選單中找到完整的標籤列表,按“?”即可在幫助選單底部顯示。

可用版本 的選擇是依據當前的本地首選項(參見 apt_preferences(5) 和 節 2.7.7, “使用 apt-pinning 調整獲選版本”)。

軟體包檢視的幾種型別都可以在“ 檢視 ”選單下找到。


標準“軟體包檢視”分類軟體包的方法與帶有一些額外功能的 dselect 有點像。


[提示] 提示

軟體集檢視可以用來為你的任務選出最佳的軟體包。

aptitude 常規表達式是類 mutt 的拓展 ERE(參見 節 1.6.2, “正規表達式”),aptitude 具體的特殊匹配規則擴充如下。

表格 2.11. aptitude 正規表達式

擴充的比對規則描述 正規表達式
匹配軟體包名稱 ~nregex_name
匹配描述 ~dregex_description
匹配軟體集名稱 ~tregex_task
匹配 debtag ~Gregex_debtag
匹配維護者 ~mregex_maintainer
匹配軟體包的 section ~sregex_section
匹配軟體包版本 ~Vregex_version
匹配檔案庫 ~A{bookworm,trixie,sid}
匹配來源 ~O{debian,…}
匹配優先順序 ~p{extra,important,optional,required,standard}
匹配必要的軟體包 ~E
匹配虛擬軟體包 ~v
匹配新的軟體包 ~N
匹配待執行的動作 ~a{install,upgrade,downgrade,remove,purge,hold,keep}
匹配已安裝軟體包 ~i
匹配帶有 A 標籤的已安裝軟體包(自動安裝的軟體包) ~M
匹配不帶有 A 標籤的已安裝軟體包(管理員選擇的軟體包) ~i!~M
匹配已安裝並且是可升級的軟體包 ~U
匹配已刪除但未清除的軟體包 ~c
匹配已移除,已清除或可移除的軟體包 ~g
匹配破壞依賴關係的軟體包 ~b
匹配破壞 type 依賴關係的軟體包 ~Btype
匹配 pattern 軟體包的 type 依賴關係 ~D[type:]pattern
匹配 pattern 軟體包破壞的 type 依賴關係 ~DB[type:]pattern
匹配依賴於 pattern 軟體包的 type 依賴的軟體包 ~R[type:]pattern
匹配依賴於 pattern 軟體包破壞的 type 依賴的軟體包 ~RB[type:]pattern
匹配其它已安裝軟體包所依賴的軟體包 ~R~i
匹配沒有被其它已安裝軟體包所依賴的軟體包 !~R~i
匹配其它已安裝軟體包所依賴或建議安裝的軟體包 ~R~i|~Rrecommends:~i
匹配 pattern 過濾版本之後的軟體包 ~S filter pattern
匹配所有軟體包(真) ~T
不匹配軟體包(假) ~F

  • 正規表達式使用的是 ERE,就跟 egrep(1)、awk(1) 和 perl(1) 這些典型的類 Unix 文字工具中所使用的 “^”、“.*”、“$” 等是相同的。

  • 依賴關係 type 是一種特定的軟體包相互關係(depends、predepends、recommends、suggests、conflicts、replaces、provides)。

  • 預設的 type 依賴關係是 “depends”。

[提示] 提示

regex_pattern 為空字串時,請立即在指令後面新增 "~T"。

下面是一些快捷方式。

  • "~Pterm" == "~Dprovides:term"

  • "~Cterm" == "~Dconflicts:term"

  • "…~W term" == "(…|term)"

使用者熟悉 mutt 的快速選擇,因為 mutt 的靈感來源於表示式語法。參見 “使用者手冊” “/usr/share/doc/aptitude/README” 中的 “SEARCHING, LIMITING, AND EXPRESSIONS”。

[注意] 注意

lenny 版本的 aptitude(8) 中,新的長格式語法,例如 “?broken”,在正規表達式中可以用來等效為它舊的短格式~b”。現在空格字元 “ ” 被認為是除了波浪字元 “~” 外的另一個正規表達式終止字元。新的長格式語法參見 “使用者手冊”。

下面是一些 aptitude(8) 的操作範例。

下面是調整軟體包的自動/手動安裝狀態的方法(在使用非 aptitude 軟體包管理器之後)。

  1. 用 root 以互動模式執行 aptitude

  2. 用 "u" 指令更新可用的軟體包列表,"U" 指令標記所有可升級的軟體包以執行升級,"f" 指令清除新軟體包列表,"g" 指令執行所有可升級的軟體包以執行升級。

  3. 按下 “l”,並輸入 “~i(~R~i|~Rrecommends:~i)” 來限制軟體包的顯示,按下 “M” 將 “已安裝軟體包” 的狀態改為自動安裝。

  4. 按下 “l”,並輸入 “~prequired|~pimportant|~pstandard|~E” 來限制軟體包的顯示,按下 “m” 將 “已安裝軟體包” 的狀態改為手動安裝。

  5. 按下 “l”,並輸入 “~i!~M” 來限制軟體包的顯示,在 “已安裝軟體包” 上按下 “[” 來陳列無用的軟體包,按下 “-” 將它們移除。

  6. 按下 “l”,並輸入 “~i” 來限制軟體包的顯示,之後在 “軟體集” 上按下 “m” 將那些軟體包標記為手動安裝。

  7. 退出 aptitude

  8. 用 root 使用者執行 "apt-get -s autoremove|less" 指令,來檢視有那些軟體包是不再需要的。

  9. 在互動模式下重啟 aptitude 程式,用 “m” 指令標記所需要的軟體包。

  10. 用 root 使用者重新執行 "apt-get -s autoremove|less" 這個指令來複查移除的包中是不是隻含有自己所希望移除的軟體包。

  11. 用 root 使用者執行 "apt-get autoremove|less" 指令來自動移除不再需要的軟體包。

在你所需要執行的 "Tasks" 上,執行 "m" 指令是一個可選的操作,目的就是為了防止大量軟體包被解除安裝的情況出現。

[注意] 注意

當你遷移到新的發行版的時候,雖然正如下面所描述的那樣,Debian 是可升級的,但是你還是應該考慮純淨的安裝新的系統。這給了你機會去移除廢棄的軟體包同時還可以接觸到最新軟體包的完美集合體。當然,在做遷移之前,你也應該對你的系統做完整的備份,並把它移到安全的地方去(檢視節 10.2, “備份和恢復”)。“我”也建議用不同的分割槽做另外一個啟動項,來實現平穩的升級。

你可以透過改變 源列表 的內容使之指向新的發行版所在地址的方法來進行系統的全面升級,然後執行 "apt update; apt dist-upgrade" 命令。

bookworm-作為-stable 釋出迴圈中, 從 stable 升級到 testing 或者 unstable,你應該用 "trixie" 或者 "sid" 替換源列表 檔案裡的 "bookworm"示例,參考 節 2.1.5, “Debian 檔案庫基礎”

事實上,由於一些軟體包版本變遷的問題,你可能會遇到一些困難,主要是由於軟體包的依賴問題。升級之後的差異越大,你越有可能遇到麻煩。在新版本發行後,系統從舊的 stable 過渡到新的 stable,你可以檢視 Release Notes 然後按照裡面的步驟去做,來儘可能的減少麻煩。

在它正式釋出之前,你決定要從先前的 stable 遷移到將要釋出的 testing,這裡沒有 Release Notes 可以幫到你。 在前一個 stable 釋出以後, stable 發行版跟將要釋出的 testing 發行版之間的差異可能變得相當大同時也使得升級系統變得更加的複雜。

在全面升級系統的時候,你應該謹慎的操作,同時你也應該從郵件列表中獲得最新的資料然後根據你的常識作出正確的判斷。

  1. 檢視先前的“發行說明”。

  2. 備份整個系統(尤其是資料和調配資訊)。

  3. 當 bootloader 壞了的時候,手邊應該有可以引導電腦啟動的儲存介質。

  4. 事先通知系統上的使用者。

  5. script(1) 記錄升級的過程。

  6. 用 “unmarkauto” 指令來保留你想要的軟體包,例如 "aptitude unmarkauto vim" 這個指令是用來防止移除vim這個軟體的。

  7. 為了減少軟體包之間可能會發生的衝突,應該儘量減少要安裝的軟體包的數目,例如,移除桌面環境這個軟體包。

  8. 移除 "/etc/apt/preferences" 檔案(停用apt-pinning)。

  9. 試著一步步的升級: oldstablestabletestingunstable.

  10. 升級 源列表 檔案,使其指向新的檔案庫然後執行 "aptitude update" 命令。

  11. 可選的安裝選項,首先是新的 core packages,例如 “aptitude install perl"。

  12. 執行 "apt-get -s dist-upgrade" 指令來評估升級造成的影響。

  13. 最後執行 "apt-get dist-upgrade" 指令。

[注意] 注意

stable 版本升級的時候,跳過主要的 Debian 發行版是不明智的。

[注意] 注意

在先前的“發行手冊”裡, GCC, Linux Kernel, initrd-tools, Glibc, Perl, APT tool chain 等等,有一些關於系統全面升級的重要注意事項。

關於 unstable 版本的日常升級,檢視 節 2.4.3, “預防軟體包故障”

下面列出了一些其它的軟體包管理操作,這些操作對於 aptitude 過於高階或缺失所需的功能。

表格 2.13. 高階軟體包管理操作

指令 操作
COLUMNS=120 dpkg -l package_name_pattern 列出已安裝軟體包的列表用於錯誤報告
dpkg -L package_name 顯示一個已安裝軟體包的內容
dpkg -L package_name | egrep '/usr/share/man/man.*/.+' 列出一個已安裝軟體包的 man 手冊頁
dpkg -S file_name_pattern 列出匹配檔名的已安裝軟體包
apt-file search file_name_pattern 列出檔案庫中匹配檔名的軟體包
apt-file list package_name_pattern 列出檔案庫中匹配的軟體包的內容
dpkg-reconfigure package_name 重新調配軟體包
dpkg-reconfigure -plow package_name 通過最詳細的方式來重新調配軟體包
configure-debian 以全螢幕選單的形式重新調配軟體包
dpkg --audit 部分安裝軟體包的審計系統
dpkg --configure -a 調配所有部分安裝的軟體包
apt-cache policy binary_package_name 顯示一個二進位制軟體包的可用版本、優先順序和檔案庫資訊
apt-cache madison package_name 顯示一個軟體包的可用版本和檔案庫資訊
apt-cache showsrc binary_package_name 顯示一個二進位制軟體包的原始碼軟體包資訊
apt-get build-dep package_name 安裝構建軟體包所需要的軟體包
aptitude build-dep package_name 安裝構建軟體包所需要的軟體包
apt-get source package_name (從標準檔案庫)下載原始碼
dget dsc 檔案的 URL (從其它檔案庫)下載原始碼軟體包
dpkg-source -x package_name_version-debian.revision.dsc 從原始碼軟體包集合(“*.orig.tar.gz” 和 “*.debian.tar.gz"/"*.diff.gz”)中構建程式碼樹
debuild binary 從本地的原始碼樹中構建軟體包
make-kpkg kernel_image 從核心原始碼樹中構建一個核心軟體包
make-kpkg --initrd kernel_image 從啟用了 initramfs 的核心程式碼樹中構建一個核心軟體包
dpkg -i package_name_version-debian.revision_arch.deb 安裝一個本地的軟體包到系統中
apt install /path/to/package_filename.deb 安裝一個本地軟體包到系統中,同時,嘗試自動地解析依賴性
debi package_name_version-debian.revision_arch.dsc 安裝本地軟體包到系統中
dpkg --get-selections '*' >selection.txt 儲存 dpkg 級別的軟體包選擇狀態資訊
dpkg --set-selections <selection.txt 使用 dpkg 設定軟體包選擇狀態
echo package_name hold | dpkg --set-selections 使用 dpkg 將一個軟體包的包選擇狀態設定為 hold(相當於 "aptitude hold < 包名> ")

[注意] 注意

對於一個支援多架構的軟體包,你可能需要為一些指令指定架構名稱。例如,使用 “dpkg -L libglib2.0-0:amd64” 來列出 amd64 架構的 libglib2.0-0 軟體包的內容。

[注意] 注意

系統管理員應該小心使用低階的軟體包工具(例如 “dpkg -i …” 和 “debi …”),它們不會自動處理所需的軟體包依賴。 dpkg 的指令列選項 “--force-all” 和類似的選項(參見 dpkg(1))只適用於高手。沒有完全理解它們的效果卻使用它們會破壞你的整個系統。

請注意以下幾點。

已經安裝 debsums 軟體包的,能使用 debsums(1) 指令通過 "/var/lib/dpkg/info/*.md5sums" 檔案中的 MD5sum 值,驗證已安裝的檔案。參見節 10.3.5, “MD5 校驗和”來獲得 MD5sum 是怎樣工作的資訊。

[注意] 注意

因為 MD5sum 資料庫可能被侵入者篡改,debsums(1) 作為安全工具使用有限。這種工具用於校驗管理者造成的本地修改或媒體錯誤造成的損壞是很不錯的。

儘管近來瀏覽 Debian 網站 https://packages.debian.org/ 是搜尋軟體包元資料更加簡單的方法,但我們依舊來看看更傳統的方法。

grep-dctrl(1) 、grep-status(1) 和 grep-available(1) 指令被用來搜尋具有 Debian 軟體包控制檔案格式的任何檔案。

dpkg -S file_name_pattern” 能夠被用來搜尋包含該檔案的軟體包名稱,其匹配的名稱是由 dpkg 安裝的。但它會忽略維護者的指令碼建立的檔案。

如果你需要對 dpkg 元資料進行更復雜的搜尋,你需要在 “/var/lib/dpkg/info/” 目錄下執行 “grep -e regex_pattern *” 命令。這會使你在軟體包指令碼和安裝查詢文字中搜索提及的單詞。

如果你想遞迴查詢軟體包依賴,你應該使用 apt-rdepends(8) 。

讓我們來學習 Debian 軟體包管理的內部工作原理。這應該能夠幫助你獨立解決一些軟體包問題。

[提示] 提示

頂層“Release”檔案用於簽署secure APT系統下的歸檔檔案。

每個 Debian 檔案庫的網址都有一個這樣的 “Release” 檔案,例如 “http://deb.debian.org/debian/dists/unstable/Release”,內容如下。

Origin: Debian
Label: Debian
Suite: unstable
Codename: sid
Date: Sat, 14 May 2011 08:20:50 UTC
Valid-Until: Sat, 21 May 2011 08:20:50 UTC
Architectures: alpha amd64 armel hppa hurd-i386 i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 sparc
Components: main contrib non-free
Description: Debian x.y Unstable - Not Released
MD5Sum:
 bdc8fa4b3f5e4a715dd0d56d176fc789 18876880 Contents-alpha.gz
 9469a03c94b85e010d116aeeab9614c0 19441880 Contents-amd64.gz
 3d68e206d7faa3aded660dc0996054fe 19203165 Contents-armel.gz
...
[注意] 注意

節 2.1.5, “Debian 檔案庫基礎” 裡,你能夠發現我使用"suite" 和 "codename"的邏輯。“發行版”被用來同時談及"suite" 和 "codename".所有由檔案庫提供的歸檔 "area" 名,會被列在 "Components" 下.

頂層檔案 "Release" 的完整性,是由叫 secure apt 的加密架構來驗證,在 apt-secure(8)中進行描述。

  • 加密簽名檔案 "Release.gpg" 是由頂層授權檔案 "Release" 和加密的 Debian 檔案庫公鑰建立。

  • 公開的 Debian 檔案庫公鑰能夠透過安裝 debian-archive-keyring 軟體包來安裝到本地。

  • secure APT 系統自動驗證下載的頂層檔案 "Release" 的完整性。加密驗證過程用到了"Release.gpg"檔案和本地安裝的 Debian 檔案庫公鑰.

  • 所有 "Packages" 和 "Sources" 檔案的完整性是由在頂層 "Release" 檔案裡的 MD5sum 值來驗證。所有軟體包檔案的完整性由 "Packages" 和 "Sources" 檔案裡的 MD5sum 值來驗證.參見 debsums(1) 和 節 2.4.2, “驗證安裝的軟體包檔案”.

  • 因加密簽名驗證比計算 MD5sum 值消耗更多的 CPU,使用 MD5sum 值來驗證每一個軟體包,使用加密簽名來驗證頂層的 "Release" 檔案,這種方式提供 較好安全性的同時,也有比較好的效能 (參見 節 10.3, “資料安全基礎”).

如果 源列表條目特別指定了 "signed-by" 選項,它下載的頂層"Release"檔案使用這個指定的公鑰來驗證。這在當源列表包含有非 Debian 檔案庫時有用。

[提示] 提示

不贊成使用 apt-key(8) 命令來管理 APT 金鑰。

當然,你能夠使用 gpg 手工驗證"Release" 的完整性,使用 "Release.gpg" 檔案和在 ftp-master.debian.org 上公佈的 Debian 檔案庫公鑰。

當使用 APT 工具時,如 aptitude, apt-get, synaptic, apt-file, auto-apt,我們需要更新包含 Debian 檔案庫資訊元資料的本地複製。這些本地複製的檔名稱,和在 源列表檔案裡面的 distribution, area, architecture 相應名稱一致。 (參見 節 2.1.5, “Debian 檔案庫基礎”).

  • "/var/lib/apt/lists/deb.debian.org_debian_dists_distribution_Release"

  • "/var/lib/apt/lists/deb.debian.org_debian_dists_distribution_Release.gpg"

  • "/var/lib/apt/lists/deb.debian.org_debian_dists_distribution_area_binary-architecture_Packages"

  • "/var/lib/apt/lists/deb.debian.org_debian_dists_distribution_area_source_Sources"

  • "/var/cache/apt/apt-file/deb.debian.org_debian_dists_distribution_Contents-architecture.gz" (apt-file)

前 4 種類型的檔案是所有相關的 APT 命令共享的,並且可以透過 “apt-get update” 或 “aptitude update” 在命令列中進行更新。如果在源列表中有相應的 “deb” 行,則 “軟體包” 元資料會進行更新。如果在 源列表中有相應的 “deb-src” 行,則 “原始碼” 元資料會進行更新。

"Packages" 和 "Sources" 的元資料檔案包含有“Filename:”欄位,指向二進位制和原始碼包檔案的位置。目前,這些軟體包都統一放在"pool/"目錄樹下,這樣可以改善跨版本釋出的傳輸。

軟體包”元資料的本地副本可以使用 aptitude 來進行互動式的搜尋。專門的搜尋指令 grep-dctrl(1) 可以搜尋“軟體包”和“原始碼”元資料的本地副本。

"Contents-architecture"元資料的本地拷貝,能夠被"apt-file update"更新,它的位置和其它 4 個不同。參見 apt-file(1). (auto-apt 的 "Contents-architecture.gz"檔案的本地拷貝預設也使用不同的位置。)

Debian 軟體包檔案有特定的名稱結構。


[提示] 提示

這裡僅敘述了基本的原始碼包格式。更多內容請參考 dpkg-source(1)。


[注意] 注意

你可以用 dpkg(1)提供的指令檢查軟體包版本, 例如., "dpkg --compare-versions 7.0 gt 7.~pre1 ; echo $?" .

[注意] 注意

debian-installer (d-i) 使用 udeb 作為它的二進位制軟體包的副檔名,而非普通的 deb。一個 udeb 軟體包是從 deb 軟體包中剝離了一些不必要的內容(例如文件),從而節省空間同時也放寬軟體包政策的要求。debudeb 軟體包會共享相同的軟體包結構。“u” 表示微小。

dpkg(1) 是 Debian 軟體包管理中最底層的工具。它非常強大,必須小心使用。

當安裝名為 “package_name” 的軟體包時,dpkg 會按照下列的順序處理它。

  1. 解包 deb 檔案(等同於 “ar -x”)

  2. 使用 debconf(1) 執行 “package_name.preinst

  3. 將軟體包安裝到系統中(等同於 “tar -x”)

  4. 使用 debconf(1) 執行 “package_name.postinst

debconf 系統提供帶有 I18N 和 L10N (章 8, I18N 和 L10N)支援的標準化使用者互動。


status” 檔案也被例如 dpkg(1)、“dselect update” 和 “apt-get -u dselect-upgrade” 等工具使用。

專門的搜尋指令 grep-dctrl(1) 可以搜尋 “status” 和 “available” 元資料的本地副本。

[提示] 提示

debian 安裝器環境下, udpkg 指令用於開啟udeb 軟體包,udpkg 指令是 dpkg 指令的一個精簡版本.

當執行 測試版不穩定版 系統,系統管理員會遇到從錯誤的軟體包管理進行恢復的情形。

[注意] 注意

下面的一些方法具有很高的風險。在此先對你進行警告!

軟體包資料快取錯誤,能夠造成奇怪的錯誤,比如 APT 的 "GPG error: ... invalid: BADSIG ..."

你應該透過 "sudo rm -rf /var/lib/apt/* " 刪除所有快取的資料,然後重新嘗試。(如果使用了 apt-cacher-ng,你還應執行"sudo rm -rf /var/cache/apt-cacher-ng/* "。 )

文件級的軟體包管理系統,比如說 aptitude(8) 或 apt-get(1), 使用軟體包依賴,當出現相同檔案時,不會嘗試去安裝軟體包。(參見 節 2.1.7, “軟體包依賴關係”).

軟體包維護者的錯誤,或者系統管理員調配了不一致的檔案庫混合源,(參見 節 2.7.6, “不使用 apt-pinning 的混合源檔案庫軟體包”),都會出現不正確的軟體包依賴情況。如果在出現相同檔案的情況下,你通過 aptitude(8) 或 apt-get(1) 安裝軟體包,dpkg(1) 在對軟體包解包時,確定會給呼叫程式回傳錯誤,並不會覆蓋已經存在的檔案。

[注意] 注意

使用第三方軟體包會導致重大的系統風險,因為其通過使用 root 許可權執行維護者指令碼能夠對你的系統做任何事。dpkg(1) 指令只防止解包時的覆蓋行為。

可以先通過刪除舊的令人討厭的軟體包,old-package,來解決這類錯誤的安裝問題。

$ sudo dpkg -P old-package

因為 dpkg 是非常底層的軟體包工具,它可以在很糟糕的情況下進行工作,例如無法啟動系統且沒有網路連線。讓我們假定 foo 軟體包損壞了,並且需要更換。

你可以在軟體包快取目錄:“/var/cache/apt/archives/” 中找到舊的 foo 軟體包的無 bug 版本。(如果找不到,你可以從檔案庫 https://snapshot.debian.org/ 中下載它,或從具有軟體包快取功能的機器中複製它。)

如果你能夠啟動系統,你可以通過下列指令來安裝它。

# dpkg -i /path/to/foo_old_version_arch.deb
[提示] 提示

如果你係統損壞較小,你也可以使用更高層的 APT 系統來降級整個系統,就像 節 2.7.11, “緊急降級” 中做的那樣。

如果你的系統無法從硬碟啟動,你應該尋找其它方式來啟動它。

  1. 使用 Debian 安裝光碟以救援模式啟動系統。

  2. 將硬碟上無法啟動的系統掛載到 “/target”。

  3. 通過下列指令安裝舊版本的 foo 軟體包。

# dpkg --root /target -i /path/to/foo_old_version_arch.deb

即使位於硬碟上的 dpkg 指令已損壞,該指令依舊可以執行。

[提示] 提示

任何由硬碟、live GNU/Linux CD、可啟動的 USB 驅動或網路啟動上的另一系統啟動的 GNU/Linux 系統到可以類似地用來救援損壞的系統。

如果由於依賴問題,無法用這種方式安裝軟體包,並且你真的必須真麼做,你可以使用 dpkg 的 “--ignore-depends”、“--force-depends” 和其它選項來無視依賴。如果你這麼做了,之後你必須認真努力地修復依賴關係。更多細節參見 dpkg(8)。

[注意] 注意

如果你的系統嚴重損壞了,你應該將系統完整備份到一個安全的地方(參見 節 10.2, “備份和恢復”)並進行一次全新的安裝。這是耗時較少且效果較好的辦法。

出於簡化,在bookworm 釋出後,在這個章節的源列表例子,使用單行式樣在 "/etc/apt/sources.list" 裡表示。

stable-updates ("bookworm-updates",在 bookworm-作為-stable 釋出迴圈) 和 backports.debian.org 檔案庫提供了 stable 版軟體包更新。

為了去使用這些檔案庫,你需要在 "/etc/apt/sources.list" 檔案裡寫入如下所示的檔案庫列表。

deb http://deb.debian.org/debian/ bookworm main non-free-firmware contrib non-free
deb http://security.debian.org/debian-security bookworm-security main non-free-firmware contrib non-free
deb http://deb.debian.org/debian/ bookworm-updates main non-free-firmware contrib non-free
deb http://deb.debian.org/debian/ bookworm-backports main non-free-firmware contrib non-free

並不需要在 "/etc/apt/preferences" 檔案中顯式設定Pin-Priority值. 當新的包可用時,預設調配提供了更合理的更新 (請見 節 2.5.3, “檔案庫層的“Release”檔案”).

  • 所有已安裝的舊軟體包都可以通過 bookworm-updates 檔案庫升級到新軟體包。

  • 只有從 bookworm-backports 檔案庫中手動安裝的舊軟體包才會通過 bookworm-backports 檔案庫升級到新軟體包。

當你想要從 bookworm-backports 檔案庫中手動的安裝一個名叫 "package-name" 的軟體及其依賴包的時候,你應該在目標檔案庫之前加一個 “-t" 參數。

$ sudo apt-get install -t bookworm-backports package-name
[警告] 警告

不要從 backports.debian.org 檔案庫安裝太多軟體包。它能夠造成軟體包依賴複雜。替代解決方案參見 節 2.1.11, “怎樣和不一致的要求協作”

[注意] 注意

從混合源檔案庫中安裝軟體包是不被 Debian 官方發行版所支援的,除了官方支援的檔案庫的特殊組合以外,例如 stablesecurity updatesstable-updates

這裡有一個列子,在原有隻跟蹤 testing 的場景,操作包含在 unstable 裡發現的新的上游軟體包版本。

  1. 臨時更改 "/etc/apt/sources.list" 檔案,使之指向單一的 "unstable" 發行版路徑。

  2. 執行 "aptitude update" 指令。

  3. 執行 "aptitude install package-name" 指令。

  4. 恢復到原始 "/etc/apt/sources.list" 檔案,使之指向 testing 路徑。

  5. 執行 "aptitude update" 指令。

使用這個手工方法,你不需要建立 "/etc/apt/preferences" 檔案,也不需要擔心 apt-pinning。但這個方法仍然是非常麻煩的。

[注意] 注意

當使用混合檔案源的時候,因為 Debian 不會確保軟體之間的相容性,所以你必須自己去解決相容性問題。如果軟體之間存在不相容性,系統可能會損壞。你必須能夠判斷這些操作所需的技術要求。使用任意混合的檔案源是完全可選的操作,我並不鼓勵你去使用它。

從不同的檔案庫中安裝軟體包的一般規則如下。

[注意] 注意

為了使軟體包的安裝變得更保險 ,一些商業的非自由的二進位制程式包可能會提供完整的靜態連結庫。你還是應該檢查 ABI 的相容性問題等等。

[注意] 注意

除非為了短期避免破壞軟體包,從非 Debian 檔案庫安裝二進位制軟體包通常是一個壞的主意。你需要查詢所有存在的和你目前 Debian 系統相容的安全技術替代方案。(參見 節 2.1.11, “怎樣和不一致的要求協作”)。

[警告] 警告

新手用 apt-pinning 命令會造成比較大的問題。你必須避免使用這個命令除非確實需要它。

沒有 "/etc/apt/preferences" 檔案,APT 系統使用版本字串來選擇最新的可用版本作為 候選版本。這是通常的狀態,也是 APT 系統最推薦的使用方法。所有官方支援的檔案庫集合,並不要求 "/etc/apt/preferences" 檔案,因此,一些不應當被作為自動更新源的軟體包,被標記為 NotAutomatic,並被適當處理。

[提示] 提示

版本字串的比較規則可以被驗證,例子如下,"dpkg --compare-versions ver1.1 gt ver1.1~1; echo $?" (參見 dpkg(1))。

如果經常從混合源檔案庫中安裝軟體包 (參見節 2.7.6, “不使用 apt-pinning 的混合源檔案庫軟體包”), 你可以通過建立 "/etc/apt/preferences" 檔案並且在其中寫入關於調整候選版本的軟體包選取規則的合適條目 (如apt_preferences(5) 中所示)來自動化這些複雜的操作。這被稱為 apt-pinning

當使用 apt-pinning 命令時,因為 Debian 不會確保軟體之間的相容性,所以你必須自己確認其相容性。apt-pinning 是完全可選的操作,我並不建議去使用它。

檔案庫層級的 Release 檔案 (參見 節 2.5.3, “檔案庫層的“Release”檔案”) 使用 apt_preferences(5) 的規則.對於 Debian 通用檔案庫Debian 安全檔案庫apt-pinning 只在 "suite" 名下工作。(這點和 Ubuntu 檔案庫不同.)例如,你在 "/etc/apt/preferences" 檔案裡面,可以使用"Pin: release a=unstable" ,但不能使用 "Pin: release a=sid".

當使用非 Debian 的檔案庫作為 apt-pinning 的一部分時,你應該檢查它們的用途和可信度。例如,Ubuntu 和 Debian 是不能混在一起的。

[注意] 注意

即使不建立 "/etc/apt/preferences" 檔案,在不用 apt-pinning 命令的情況下,你也可以進行相當複雜的系統工作 (參見節 2.6.6, “使用 dpkg 指令進行救援”節 2.7.6, “不使用 apt-pinning 的混合源檔案庫軟體包”)。

如下是關於 apt-pinning 技術的簡化說明。

可用的軟體包源在 "/etc/apt/sources.list" 檔案裡面定義,APT 系統從可用的軟體包源裡面選擇 Pin-Priority 值最大的,作為升級 軟體包的候選版本.如果一個軟體包的 Pin-Priority 大於 1000,這個版本限制為只能 升級,關閉了軟體包降級功能 (參見 節 2.7.11, “緊急降級”).

每個軟體包的 Pin-Priority 值是在 "/etc/apt/preferences" 檔案中的 "Pin-Priority" 條目中定義或者是使用它的預設值。


目標版本檔案倉庫,能夠由命令列選項設定,例如: "apt-get install -t testing some-package"

NotAutomaticButAutomaticUpgrades 的檔案是由檔案庫伺服器上檔案層級的 Release 檔案來設定,(參見 節 2.5.3, “檔案庫層的“Release”檔案”),同時包含"NotAutomatic: yes" 和 "ButAutomaticUpgrades: yes".而 NotAutomatic 檔案也是由檔案庫伺服器上的檔案層級的 Release 檔案來設定,但只包含 "NotAutomatic: yes".

來自眾多檔案源的軟體包apt-pinning 情況可以通過 "apt-cache policy package" 指令顯示。

  • "Package pin:" 開頭的行,列出了軟體包版本的 pin ,如果 package 相關的 pin 已經定義, 例如, "Package pin: 0.190".

  • 沒有 "Package pin:" 的行存在,如果沒有 package 相關的定義。

  • package 相關的 Pin-Priority 值列在所有版本字串的右邊,比如,"0.181 700".

  • "0" 是列在所有版本字串的右邊,如果沒有 package 相關的定義。例如, "0.181 0".

  • 檔案庫 (在 "/etc/apt/preferences" 檔案作為"Package: *"定義) 的 Pin-Priority 值,列在所有檔案庫路徑的左邊,例如,"100 http://deb.debian.org/debian/ bookworm-backports/main Packages".

[警告] 警告

新手用 apt-pinning 命令會造成比較大的問題。你必須避免使用這個命令除非確實需要它。

如下是一個關於 apt-pinning 技術的例子,當使用 testing的時候,實現 unstable 中的特定的較新的上游版本軟體包的日常升級。你應該按如下所示的在 "/etc/apt/sources.list" 檔案中列出所有需要的檔案庫。

deb http://deb.debian.org/debian/ testing main contrib non-free
deb http://deb.debian.org/debian/ unstable main contrib non-free
deb http://security.debian.org/debian-security testing-security main contrib

按如下所示的設定 "/etc/apt/preferences" 檔案。

Package: *
Pin: release a=unstable
Pin-Priority: 100

當想要在此調配下從 unstable 檔案庫中安裝 "package-name" 軟體及它的依賴包時,你執行帶有 "-t" 選項 (unstable 的 Pin-Priority 值變為 990) 的轉換目標發行版的指令。

$ sudo apt-get install -t unstable package-name

在此調配下,執行 "apt-get update" 和 "apt-get dist-upgrade"(或者 "aptitude safe-upgrade" 和 "aptitude full-upgrade") 指令,會從 testing 檔案庫升級那些從 testing 檔案庫安裝的軟體包並且從 unstable 檔案庫升級那些從 unstable 檔案庫中安裝的軟體包。

[注意] 注意

小心不要去移除 "/etc/apt/sources.list" 檔案中的 "testing" 檔案庫。如果檔案中沒有 "testing" ,APT 系統會使用更加新的 unstable 檔案庫升級軟體包。

[提示] 提示

我通常會在上述操作後,馬上註釋掉 "/etc/apt/sources.list" 檔案中的 "unstable" 檔案庫記錄。這避免了因為處理 "/etc/apt/sources.list" 檔案中的眾多記錄而造成的升級緩慢雖然同時也阻止了那些從 unstable 檔案庫中安裝的軟體包通過 unstable 升級。

[提示] 提示

如果 "/etc/apt/preferences" 檔案中 "Pin-Priority: 1" 替代了 "Pin-Priority:100",即使 "/etc/apt/sources.list" 檔案中的 "testing" 記錄被刪除了,Pin-Priority 值為 100 的已安裝軟體包也不會通過 unstable 檔案庫升級。

如果你希望自動跟蹤 unstable 裡某些特殊的軟體包,而在安裝時不再使用初始化選項 "-t unstable" , 你必須建立 "/etc/apt/preferences" 檔案,並在該檔案頂部按下面的方式清晰的列出所有那些軟體包。

Package: package-1
Pin: release a=unstable
Pin-Priority: 700

Package: package-2
Pin: release a=unstable
Pin-Priority: 700

如下是為每個特定的軟體包設定 Pin-Priority 值。例如,為了使用最新的 unstable 的英文版 "Debian Reference",你應該在 "/etc/apt/preferences" 檔案中寫入以下條目。

Package: debian-reference-en
Pin: release a=unstable
Pin-Priority: 700

Package: debian-reference-common
Pin: release a=unstable
Pin-Priority: 700
[提示] 提示

即使你使用的是 stable 檔案庫,apt-pinning 技術仍然是有效的。根據我以前的經驗,從 unstable 檔案庫安裝的文件包一直是安全的。

[警告] 警告

新手用 apt-pinning 命令會造成比較大的問題。你必須避免使用這個命令除非確實需要它。

[注意] 注意

降級在 Debian 設計上就不被官方支援。僅僅是在緊急恢復過程中需要做的一部分工作。儘管憎恨這種情形,但降級在很多場景下工作得也不錯。對於重要系統,你應當在恢復操作後備份所有重要資料,並從零開始重新安裝一個新的系統。

你可以通過控制候選版本從新的檔案庫降級到舊的檔案庫(參見 節 2.7.7, “使用 apt-pinning 調整獲選版本”),從而使損壞的系統恢復。下面是一種懶惰的方法,可以避免許多冗長的 “dpkg -i broken-package_old-version.deb” 指令(參見 節 2.6.6, “使用 dpkg 指令進行救援”)。

搜尋 “/etc/apt/sources.list” 檔案中像下面那樣使用 unstable 的行。

deb http://deb.debian.org/debian/ sid main contrib non-free

使用下面的行替換它,從而改為使用 testing

deb http://deb.debian.org/debian/ trixie main contrib non-free

按如下所示的設定 "/etc/apt/preferences" 檔案。

Package: *
Pin: release a=testing
Pin-Priority: 1010

執行 “apt-get update; apt-get dist-upgrade” 使整個系統的軟體包強制降級。

在緊急降級後,移除 “/etc/apt/preferences” 這個特殊的檔案。

[提示] 提示

這是一個好方法,移除(不是清除!)儘可能多地軟體包,來減少依賴問題。你可能需要手動移除和安裝一些軟體包來使系統降級。需要特別注意 Linux 核心、載入程式、udev、PAM、APT 和網路相關的軟體包以及它們的組態檔案。