第 2 章 Debian 軟體包管理

目录

2.1. Debian 軟體包管理的前提
2.1.1. 軟體包配置
2.1.2. 基本的注意事項
2.1.3. 持續升級的生活
2.1.4. Debian 檔案庫基礎
2.1.5. Debian 是100% 的自由軟體
2.1.6. 軟體包依賴關係
2.1.7. 包管理的事件流
2.1.8. 對包管理問題的第一個迴應
2.2. 基礎軟體包管理操作
2.2.1. 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.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. 使用 dpkg 命令進行救援
2.6.5. 恢復軟體包選擇資料
2.7. 軟體包管理技巧
2.7.1. 如何挑選 Debian 軟體包
2.7.2. 混合源檔案庫中的軟體包
2.7.3. 調整候選版本
2.7.4. 更新和向後移植
2.7.5. 阻止推薦的軟體包的安裝
2.7.6. 使用帶有 unstable 軟體包的 testing 版本
2.7.7. 使用帶有 experimental 軟體包的 unstable 版本
2.7.8. 自動下載和升級軟體包
2.7.9. 限制 APT 的下載頻寬
2.7.10. 緊急降級
2.7.11. 上傳軟體包的是誰?
2.7.12. equivs 軟體包
2.7.13. 移植一個軟體包到 stable 系統
2.7.14. 用於 APT 的代理伺服器
2.7.15. 小型公共軟體包檔案庫
2.7.16. 記錄和複製系統配置
2.7.17. 轉換或安裝一個外來的二進位制軟體包
2.7.18. 不使用 dpkg 解壓軟體包
2.7.19. 更多關於軟體包管理的文件
[注意] 注意

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

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

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

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

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

表 2.1. Debian 軟體包管理工具列表

軟件包 流行度 大小 說明
apt V:871, I:999 3647 高階軟體包工具(APT), dpkg 的前端,提供了 “http” 、“ftp” 和 “file” 的檔案庫訪問方式(包含apt-getapt-cache 命令)
aptitude V:136, I:778 4415 aptitude(8) ,基於終端的互動式軟體包管理工具
tasksel V:40, I:972 374 Debian 系統上對安裝進行選擇的工具(APT 的前端)
unattended-upgrades V:188, I:364 254 用於 APT 的增強軟體包,會自動安裝安全更新
dselect V:4, I:59 2498 基於終端的軟體包管理工具(之前的標準,APT 的前端和其它老的訪問方式)
dpkg V:932, I:999 6745 用於 Debian 的軟體包管理系統
synaptic V:70, I:453 7793 圖形化的軟體包管理工具(GNOME 的 APT 前端)
apt-utils V:391, I:997 1103 APT 實用程式:apt-extracttemplates(1)apt-ftparchive(1)apt-sortpkgs(1)
apt-listchanges V:350, I:838 365 軟體包歷史更改提醒工具
apt-listbugs V:7, I:12 451 在每次 APT 安裝前列出嚴重的 bug
apt-file V:13, I:77 82 APT 軟體包搜尋工具 —— 命令列介面
apt-rdepends V:0, I:6 40 遞迴列出軟體包依賴

[警告] 警告

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

Debian 系統管理員中的新手應該保持在只進行安全更新的 stable 版本。我的意思是,最好避免下列的一些行為作為一項預防措施,直到你十分了解 Debian 系統。下面有一些提醒。

  • 在 “/etc/apt/sources.list” 中不要包含 testingunstable

  • 在 “/etc/apt/sources.list” 裡不要在標準的 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 系統長久的穩定史並無法保證什麼。

儘管我在上面進行了警告,我知道許多閱讀這份文件的人還是想要使用 Debian 的 testingunstable 套件來作為他們自行管理的桌面環境的主系統。這是因為這些套件執行得很好,更新頻繁,並提供了最新的特性。

[小心] 小心

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

你只需要在 “/etc/apt/sources.list” 中簡單地將發行版字串設定為套件名:“testing” 或 “unstable”;或者代號:“buster” 或 “sid” 。這會使你享受持續升級的生活

使用 testingunstable很有樂趣的,但會帶來一些風險。儘管 Debian 系統的 unstable 套件在大多數時候看起來都非常穩定,但在 Debian 系統的 testingunstable 套件中存在一些軟體包問題,並且它們中的一部分是不容易解決的。這對你來說可能會很痛苦。有時候,你可能會有一個損壞的軟體包或缺少某些功能幾個星期。

這裡有一些方法,可以使你簡單快速地從 Debian 軟體包的 bug 中恢復。

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

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

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

[提示] 提示

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

對於典型的 HTTP 訪問,檔案庫在 “/etc/apt/sources.list” 檔案中像下面那樣指定,例如,現在 stable = stretch 系統。

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

deb http://security.debian.org/ stretch/updates main contrib
deb-src http://security.debian.org/ stretch/updates main contrib

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

/etc/apt/sources.list” 的含義在 sources.list(5) 中進行了描述,下面是一些要點。

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

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

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

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

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

如果只是用 aptitude(它不訪問原始碼相關的元資料),“deb-src”那行可以安全地刪掉(或者在檔案開頭新增 “#” 來將它註釋掉)。這可以加速檔案庫元資料的更新。URL 可以是“http://” 、“ftp://” 、 “file://” ……

[提示] 提示

如果在上述的例子中,使用了 “sid” 代替 “stretch” ,那麼 “/etc/apt/sources.list” 中的 “deb: http://security.debian.org/ …” 這行就不需要了。因為沒有用於 “sid” (unstable)的安全更新的檔案庫。

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


[小心] 小心

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

[小心] 小心

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

[提示] 提示

對於使用 stabletesting 套件的 Debian 系統而言,在 “/etc/apt/sources.list” 中包含帶有 “http://security.debian.org/” 的一行是不錯的主意。它會啟用安全更新。

[注意] 注意

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


上述軟體包的數量是 amd64 架構的。main 區域提供 Debian 系統(參見 第 2.1.5 节 “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 檔案庫前,檔案庫維護指令碼不僅檢查時間(約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)。一個月左右的時間後, 如果你仔細點的話, unstable 檔案庫或許可以使用。

[提示] 提示

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

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

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

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

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

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

  • main 中的軟體包沒有依賴於在 non-freecontrib 中的軟體包。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

為了滿足 main 嚴格的自由軟體標準,Debian 提供了 去掉 Mozilla 商標 的軟體包(例如 Firefox 、Thunderbird 和 Seamonkey),它們移除了 logo 和一些圖形資料;並將它們分別用 Iceweasel 、Icedove 和 Iceape 替代。

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

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

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

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

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

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

  • “依賴”

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

  • "預依賴"

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

  • "推薦"

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

  • "建議"

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

  • "增強"

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

  • "破損"

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

  • "衝突"

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

  • "替代"

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

  • "提供"

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

[注意] 注意

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

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

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

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

在 Debian 系統中有許多基於 ATP 的軟體包管理工具可以在 Debian 系統上進行基於倉庫的軟體包管理操作。在這裡,我們將介紹兩種基本的軟體包管理工具:apt-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 來管理軟體包的多個版本,但這非常繁瑣。

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

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

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

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

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

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

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

[提示] 提示

There is a new apt(8) command intended for interactive usage. Use the apt-get(8) and apt-cache(8) commands in the shell script.

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


[注意] 注意

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

[注意] 注意

因為在 lenny 版本之後的 Debian 系統中,apt-getaptitude 會共享自動安裝的軟體包的狀態(參見第 2.5.5 节 “APT 的軟體包狀態”),因此你可以混合使用這些工具而不會出現嚴重的麻煩(參見 Bug #594490)。

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

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

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


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

[提示] 提示

dselect 軟體包依舊可用,並且曾是之前釋出的版本中首選的全屏互動式軟體包管理工具。

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

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

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

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

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

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

  • 軟體包名稱

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

  • 軟體包當前版本

  • 軟體包可用版本

[提示] 提示

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

可用版本 的選擇是依據當前的本地首選項(參見 apt_preferences(5)第 2.7.3 节 “調整候選版本”)。

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


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


[提示] 提示

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

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

表 2.11. aptitude 正則表示式

擴充套件匹配規則描述 正則表示式
匹配軟體包名稱 ~n<regex_name>
匹配描述 ~d<regex_description>
匹配軟體集名稱 ~t<regex_task>
匹配 debtag ~G<regex_debtag>
匹配維護者 ~m<regex_maintainer>
匹配軟體包的 section ~s<regex_section>
匹配軟體包版本 ~V<regex_version>
匹配檔案庫 ~A{stretch,buster,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> 依賴關係的軟體包 ~B<type>
匹配 <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"。

下面是一些快捷方式。

  • "~P<term>" == "~Dprovides:<term>"

  • "~C<term>" == "~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 节 “備份和恢復”)。“我”也建議用不同的分割槽做另外一個啟動項,來實現平穩的升級。

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

stable 升級到 testing 或者 unstable,你應該用 "buster" 或者 "sid" 替換 "/etc/apt/sources.list" 檔案裡的 "stretch",參考 第 2.1.4 节 “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. 升級 "/etc/apt/sources.list" 檔案,使其指向新的檔案庫然後執行 "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 -p=low <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 <URL for dsc file> (從其它檔案庫)下載原始碼軟體包
dpkg-source -x <package_name>_<version>-<debian_version>.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_version>_<arch>.deb 安裝一個本地的軟體包到系統中
debi <package_name>_<version>-<debian_version>_<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 網站 http://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.4 节 “Debian 檔案庫基礎” 裡,你能夠發現我使用"suite" 和 "codename"的邏輯。“發行版”被用來同時談及"suite" 和 "codename".所有由檔案庫提供的歸檔 "area" 名,會被列在 "Components" 下.

頂層檔案 "Release" 的完整性,是由叫 secure apt 的加密架構來驗證.

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

  • 公開的 Debian 檔案庫公鑰能夠放入“/etc/apt/trusted.gpg”;

  • secure APT 系統驗證下載的頂層檔案 "Release" 的完整性。加密驗證過程用到了"Release.gpg"檔案和在"/etc/apt/trusted.gpg"裡的 Debian 檔案庫公鑰.

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

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

當使用 APT 工具時,如 aptitude, apt-get, synaptic, apt-file, auto-apt,我們需要更新包含 Debian 檔案庫資訊元資料的本地拷貝。這些本地拷貝的檔名稱,和在 "/etc/apt/sources.list" 檔案裡面的 distribution, area, architecture 相應名稱一致。 (參見 第 2.1.4 节 “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” 在命令列中進行更新。如果在 “/etc/apt/sources.list” 中有相應的 “deb” 行,則 “軟體包” 元資料會進行更新。如果在 “/etc/apt/sources.list” 中有相應的 “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 命令的一個精簡版本.

當執行 unstable 系統,系統管理員會遇到從錯誤的軟體包管理進行恢復的情形。

[小心] 小心

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

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

軟體包維護者的錯誤,或者系統管理員配置了不一致的檔案庫混合源,(參見 第 2.7.2 节 “混合源檔案庫中的軟體包”),都會出現不正確的軟體包依賴情況。如果在出現相同檔案的情況下,你通過 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 版本。(如果找不到,你可以從檔案庫 http://snapshot.debian.net/ 中下載它,或從具有軟體包快取功能的機器中拷貝它。)

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

# dpkg -i /path/to/foo_<old_version>_<arch>.deb
[提示] 提示

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

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

  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 节 “備份和恢復”)並進行一次全新的安裝。這是耗時較少且效果較好的辦法。

[小心] 小心

從混合源檔案庫中安裝軟體包是不被 Debian 官方發行版所支援的,除了官方支援的檔案庫的特殊組合以外,例如 stablesecurity updatesstretch-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 的相容性問題等等。

[注意] 注意

為避免短期出現壞的軟體包,從非官方支援的檔案庫安裝二進位制軟體包通常是一個壞注意。即使你在使用 apt-pinning 情況下,也是這樣的。(參見 第 2.7.3 节 “調整候選版本”).你應當考慮使用 chroot 或類似技術(參見 第 9.10 节 “虛擬化系統”)來執行不同檔案庫的程式。

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

[提示] 提示

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

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

[警告] 警告

新手用 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.4 节 “使用 dpkg 命令進行救援”第 2.7.2 节 “混合源檔案庫中的軟體包”)。

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

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

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


目標發行版檔案庫可以通過以下幾種方法來設定。

  • "/etc/apt/apt.conf" 配置檔案中寫入 "APT::Default-Release "stable";"

  • 命令列選項,例如: "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/ stretch-backports/main Packages".

stretch-updatesbackports.debian.org 檔案庫提供了stable (stretch) 發行版的更新軟體包。

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

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

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

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

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

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

$ sudo apt-get install -t stretch-backports <package-name>

如下是一個關於 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/ testing/updates 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 檔案庫安裝的文件包一直是安全的。

[小心] 小心

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

你可以通過控制候選版本從新的檔案庫降級到舊的檔案庫(參見 第 2.7.3 节 “調整候選版本”),從而使損壞的系統恢復。下面是一種懶惰的方法,可以避免許多冗長的 “dpkg -i <broken-package>_<old-version>.deb” 命令(參見 第 2.6.4 节 “使用 dpkg 命令進行救援”)。

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

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

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

deb http://deb.debian.org/debian/ buster 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 和網路相關的軟體包以及它們的配置檔案。

下面是一個建立小型公共軟體包檔案庫的例子,相容了現代的 secure APT 系統(參見 第 2.5.2 节 “頂層“Release”檔案及真實性”)。讓我們進行一些假定。

  • 賬號名:“foo

  • 主機名:“www.example.com

  • 所需軟體包:apt-utilsgnupg 和其它軟體包

  • URL: "http://www.example.com/~foo/" ( → "/home/foo/public_html/index.html")

  • 軟體包架構:“amd64

在該伺服器上使用如下方式為 Foo 建立一個 APT 源鑰匙對。

$ ssh foo@www.example.com
$ gpg --gen-key
...
$ gpg -K
...
sec   1024D/3A3CB5A6 2008-08-14
uid                  Foo (ARCHIVE KEY) <foo@www.example.com>
ssb   2048g/6856F4A7 2008-08-14
$ gpg --export -a 3A3CB5A6 >foo.public.key

公佈 "foo.public.key"檔案,即公鑰 ID 為 "3A3CB5A6"的源公鑰檔案,該檔案可用於 Foo 源的釋出

使用如下方式建立一個名為"Origin: Foo"的源目錄樹。

$ umask 022
$ mkdir -p ~/public_html/debian/pool/main
$ mkdir -p ~/public_html/debian/dists/unstable/main/binary-amd64
$ mkdir -p ~/public_html/debian/dists/unstable/main/source
$ cd ~/public_html/debian
$ cat > dists/unstable/main/binary-amd64/Release << EOF
Archive: unstable
Version: 4.0
Component: main
Origin: Foo
Label: Foo
Architecture: amd64
EOF
$ cat > dists/unstable/main/source/Release << EOF
Archive: unstable
Version: 4.0
Component: main
Origin: Foo
Label: Foo
Architecture: source
EOF
$ cat >aptftp.conf <<EOF
APT::FTPArchive::Release {
  Origin "Foo";
  Label "Foo";
  Suite "unstable";
  Codename "sid";
  Architectures "amd64";
  Components "main";
  Description "Public archive for Foo";
};
EOF
$ cat >aptgenerate.conf <<EOF
Dir::ArchiveDir ".";
Dir::CacheDir ".";
TreeDefault::Directory "pool/";
TreeDefault::SrcDirectory "pool/";
Default::Packages::Extensions ".deb";
Default::Packages::Compress ". gzip bzip2";
Default::Sources::Compress "gzip bzip2";
Default::Contents::Compress "gzip bzip2";

BinDirectory "dists/unstable/main/binary-amd64" {
  Packages "dists/unstable/main/binary-amd64/Packages";
  Contents "dists/unstable/Contents-amd64";
  SrcPackages "dists/unstable/main/source/Sources";
};

Tree "dists/unstable" {
  Sections "main";
  Architectures "amd64 source";
};
EOF

通過 dupload,你可以自動重複更新你伺服器系統上的 APT 檔案庫內容。

當 “~/.dupload.conf” 包含如下內容時,在客戶端執行 “dupload -t foo changes_file” 將所有的軟體包檔案放入 “~foo/public_html/debian/pool/main/”。

$cfg{'foo'} = {
  fqdn => "www.example.com",
  method => "scpb",
  incoming => "/home/foo/public_html/debian/pool/main",
  # The dinstall on ftp-master sends emails itself
  dinstall_runs => 1,
};

$cfg{'foo'}{postupload}{'changes'} = "
  echo 'cd public_html/debian ;
  apt-ftparchive generate -c=aptftp.conf aptgenerate.conf;
  apt-ftparchive release -c=aptftp.conf dists/unstable >dists/unstable/Release ;
  rm -f dists/unstable/Release.gpg ;
  gpg -u 3A3CB5A6 -bao dists/unstable/Release.gpg dists/unstable/Release'|
  ssh foo@www.example.com  2>/dev/null ;
  echo 'Package archive created!'";

dupload(1)觸發postupload鉤子指令碼,該指令碼為每次上傳建立軟體包檔案.

你可以通過下面的方法將這個小型公共檔案庫新增到你客戶端系統的 apt 源中。

$ sudo bash
# echo "deb http://www.example.com/~foo/debian/ unstable main" \
   >> /etc/apt/sources.list
# apt-key add foo.public.key
[提示] 提示

如果檔案庫位於本地檔案系統中,你可以使用 “deb file:///home/foo/debian/ …”。

在任何的 Unix-like 環境中都可以不使用 dpkg(1),而使用標準的 ar(1)tar(1) 來解壓 “dpkg*.deb” 軟體包。

# ar x /path/to/dpkg_<version>_<arch>.deb
# ls
total 24
-rw-r--r-- 1 bozo bozo  1320 2007-05-07 00:11 control.tar.gz
-rw-r--r-- 1 bozo bozo 12837 2007-05-07 00:11 data.tar.gz
-rw-r--r-- 1 bozo bozo     4 2007-05-07 00:11 debian-binary
# mkdir control
# mkdir data
# tar xvzf control.tar.gz -C control
# tar xvzf data.tar.gz -C data

其它的 “*.deb” 軟體包可以使用 dpkg-deb(1) 解壓來獲得上面的 “dpkg*.deb” 軟體包;或像上面那樣使用標準的 ar(1) 和較新的帶有 xz(1) 解壓支援的 GNU tar(1)

你也可以使用 mc 命令來瀏覽軟體包內容。