章 2. Debian 軟體包管理

# 章 2. Debian 軟體包管理

| 注意
這一章假定最新的穩定版的代號為：`trixie` 。 在本文件中，APT 系統的資料來源總稱為源列表。能夠在 "`/etc/apt/sources.list`" 檔案、 "`/etc/apt/sources.list.d/*.list`"檔案或"`/etc/apt/sources.list.d/*.sources`"檔案的任何地方定義。

## 2.1. Debian 軟體包管理的前提

### 2.1.1. Debian 軟體包管理

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

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

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

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

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

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

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

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

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

軟體包 | 流行度 | 大小 | 說明
--- | --- | --- | ---
`dpkg` | V:904, I:1000 | 6399 | 用於 Debian 的底層軟體包管理系統（基於檔案的）
`apt` | V:892, I:1000 | 4956 | 使用命令列管理軟體包的 APT 前端： `apt`/`apt-get`/`apt-cache`
`aptitude` | V:32, I:168 | 4621 | 使用全屏控制台互動式管理軟體包的 APT 前端： aptitude(8)
`tasksel` | V:37, I:984 | 351 | 用來安裝選擇的任務的 APT 前端: tasksel(8)
`unattended-upgrades` | V:127, I:181 | 320 | 用於 APT 的增強軟體包，會自動安裝安全更新
`gnome-software` | V:155, I:259 | 4707 | GNOME 軟體中心(圖形化的 APT 前端)
`synaptic` | V:31, I:276 | 7788 | 圖形化的軟體包管理工具（GTK 的 APT 前端）
`apt-utils` | V:414, I:998 | 1181 | APT 實用程式：apt-extracttemplates(1) 、apt-ftparchive(1) 和 apt-sortpkgs(1)
`apt-listchanges` | V:396, I:891 | 562 | 軟體包歷史更改提醒工具
`apt-listbugs` | V:5.2, I:7.1 | 512 | 在每次 APT 安裝前列出嚴重的 bug
`apt-file` | V:15, I:56 | 89 | APT 軟體包搜尋工具 —— 指令列介面
`apt-rdepends` | V:0.4, I:4.7 | 39 | 遞迴列出軟體包依賴

### 2.1.2. 軟體包調配

下面是 Debian 系統軟體包調配的一些要點。

- 對於現代桌面環境來說，在軟體包配置修改和軟體包升級後重啟系統是確保系統正常執行的好主意。

- Debian 尊重系統管理員的手動調配。換句話說，軟體包調配系統不會為了方便而去更改那些調配。

- 每個軟體包都帶有自己的調配指令碼，它使用標準使用者介面 debconf(7) 來幫助軟體包初始化安裝過程。

- Debian 開發者通過軟體包調配指令碼，盡力使你能有一個完美的升級體驗。

- 系統管理員可以使用軟體包工具的全部功能。但在預設的安裝中會禁用那些具有安全風險的。

- 如果你手動激活了一些具有安全隱患的服務，你有責任遏制風險。

- 高深的配置可以由系統管理員手動啟用。這可能會對用於系統配置的通用流行幫助程式造成干擾。

### 2.1.3. 基本的注意事項

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

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

- 在 原始檔 中不要包含 `testing` 或 `unstable` 。

- 在 原始檔 裡不要在標準的 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 系統長久的穩定史並無法保證什麼。

### 2.1.4. 持續升級的生活

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

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

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

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

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

- 在源列表裡面設定 `testing` 版相應的程式碼名為套件名（在 `trixie`-作為-`stable` 版的釋出週期時，是"`forky`"）。

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

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

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

- 使用下面的 節 3.2, “應急救援系統” 製作緊急救援系統。

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

- 考慮安裝 `apt-listbugs` ，這可以在升級之前檢查 Debian Bug 跟蹤系統（BTS） 的資訊

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

| 注意
如果你無法做到這些預防措施中的任何一個，那你可能還沒做好使用 `testing` 和 `unstable` 版的準備。

### 2.1.5. Debian 檔案庫基礎

| 提示
Debian 檔案庫官方政策的定義參見 Debian 政策文件，第2章 —— Debian 檔案庫。

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

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

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

對於使用典型的 HTTP 訪問的 `trixie`系統，源列表 是在 "`/etc/apt/sources.list.d/debian.sources`" 中由 現代的如下的 deb822 式樣提供 ：

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

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

| 提示

如果 源列表 是在 "`/etc/apt/sources.list`" 或 "`/etc/apt/sources.list.d/*.list`" 檔案中提供的老舊單行式樣，使用它們更新：

     $ sudo apt modernize-sources

deb822 式樣的原始檔 的關鍵點如下。

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

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

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

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

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

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

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

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

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

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

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

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

表格 2.2. Debian 檔案庫站點列表

檔案庫 URL | 套件名 | 程式碼名 | 倉庫用途
--- | --- | --- | ---
http://deb.debian.org/debian/ | `stable` | `trixie` | 在擴充套件檢查後，類似靜態的 `stable` 釋出
http://deb.debian.org/debian/ | `testing` | `forky` | 在表面檢查和短期等待後的動態 `testing` 釋出
http://deb.debian.org/debian/ | `unstable` | `sid` | 在最少的檢查和不等待的動態 `unstable` 釋出
http://deb.debian.org/debian/ | `experimental` | N/A | 開發者預釋出實驗版本（可選，只適用於開發者）
http://deb.debian.org/debian/ | `stable-proposed-updates` | `trixie-proposed-updates` | 用於下一個穩定版 `stable` 的點版本（小版本）釋出的更新（可選）
http://deb.debian.org/debian/ | `stable-updates` | `trixie-updates` | `stable-proposed-updates` 套件的子集，需要緊急更新，比如說時區（可選的）
http://deb.debian.org/debian/ | `stable-backports` | `trixie-backports` | 大部分從 `testing` 版中隨機收集和重新編譯的軟體包（可選）
http://security.debian.org/debian-security/ | `stable-security` | `trixie-security` | `stable` 釋出的安全更新（重要）
http://security.debian.org/debian-security/ | `testing-security` | `forky-security` | 這個沒有積極支援，不被安全團隊使用

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

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

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

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

表格 2.3. Debian 歸檔列表

區域 | 軟體包數量 | 軟體包元件標準
--- | --- | ---
`main` | 76611 | 遵從 Debian 自由軟體引導方針（DFSG），並且不依賴於 `non-free`
`non-free-firmware` | 75 | 不符合 Debian 自由軟體指導方針（DFSG），正常的系統安裝過程中必需要用到的韌體
`contrib` | 362 | 遵從 Debian 自由軟體引導方針（DFSG），但依賴於 `non-free`
`non-free` | 1045 | 不遵從 Debian 自由軟體指導方針（DFSG），並且不在 `non-free-firmware`

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

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

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

表格 2.4. 套件和代號的關係

時間 | suite = `stable` | suite = `testing` | suite = `unstable`
--- | --- | --- | ---
在 `trixie` 發佈後 | codename = `trixie` | codename = `forky` | codename = `sid`
在 `forky` 發佈後 | codename = `forky` | codename = `duke` | codename = `sid`

代號的歷史參見 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` 檔案庫的內容完全相同。

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

- 損壞的軟體包被上傳到檔案庫（多見於 `unstable` ）

- 延遲接受新的軟體包到檔案庫（多見於 `unstable` )

- 檔案庫時間同步問題（ `testing` 和 `unstable` ）

- 手動干預檔案庫，例如移除軟體包（多見於 `testing` ）等。

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

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

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

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

- 部分

- "優先順序"

- "基本系統"

- "極重要的軟體包"

### 2.1.6. Debian 是100% 的自由軟體

Debian 是100%的自由軟體，因為：

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

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

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

- 在 `main` 中的軟體包，沒有依賴或推薦在 `non-free` 或 `non-free-firmware` 或 `contrib` 中的軟體包。

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

- “ Debian 將始終是 100% 的自由軟體”。（ Debian 社群契約中的第一條）

- Debian 伺服器上有一些 `non-free-firmware`、`non-free` 和 `contrib` 軟體包。

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

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

- Debian 系統之外的軟體包位於 Debian 伺服器的 `non-free`、 `non-free-firmware`和 `contrib` 區域。

在 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-free` 、`non-free-firmware`和 `contrib` 中的軟體包所需要冒的風險：

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

- 失去 Debian 對軟體包的支援（這些軟體包無法存取原始碼，Debian 不能進行完全的支援。）

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

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

典型的 `non-free`、 `non-free-firmware`和 `contrib` 軟體包包含了下列型別的自由分發的軟體包：

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

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

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

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

### 2.1.7. 軟體包依賴關係

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

- “依賴”

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

- "預依賴"

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

- "推薦"

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

- "建議"

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

- "增強"

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

- "破損"

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

- "衝突"

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

- "替代"

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

- "提供"

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

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

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

### 2.1.8. 包管理的事件流

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

- 更新（“`apt update`”、“`aptitude update`” 或 “`apt-get update`”）：

  1. 從遠端檔案庫獲得檔案庫元資料

  2. 重建和更新 APT 使用的本地元資料

- 升級（“`apt upgrade`” 和 “`apt full-upgrade`”，或 “`aptitude safe-upgrade`” 和 “`aptitude full-upgrade`”，或 “`apt-get upgrade`” 和 “`apt-get dist-upgrade`”）：

  1. 選擇候選版本，它所安裝的軟體包通常都是最新的可用版本（例外參見 節 2.7.7, “使用 apt-pinning 調整獲選版本” ）

  2. 解決軟體包依賴關係

  3. 如果候選版本與已安裝的版本不同，會從遠端檔案庫獲得所選擇的二進位制軟體包

  4. 解包所獲得的二進位制軟體包

  5. 執行 preinst 指令碼

  6. 安裝二進位制檔案

  7. 執行 postinst 指令碼

- 安裝（“`apt install ...`”、“`aptitude install ...`" 或者 "`apt-get install …`” ）：

  1. 選擇命令列中列出的包

  2. 解決軟體包依賴關係

  3. 從遠端伺服器獲得已選二進位制包

  4. 解包所獲得的二進位制軟體包

  5. 執行 preinst 指令碼

  6. 安裝二進位制檔案

  7. 執行 postinst 指令碼

- 移除 （"`apt remove …`", “`aptitude remove …`” 或 “`apt-get remove …`”）：

  1. 選擇命令列中列出的包

  2. 解決軟體包依賴關係

  3. 執行 prerm 指令碼

  4. 移除已安裝的檔案，除了組態檔案

  5. 執行 postrm 指令碼

- 清除 （"`apt purge`",“`aptitude purge …`” 或 “`apt-get purge …`”）：

  1. 選擇命令列中列出的包

  2. 解決軟體包依賴關係

  3. 執行 prerm 指令碼

  4. 移除已安裝的檔案，包含組態檔案

  5. 執行 postrm 指令碼

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

### 2.1.9. 對包管理問題的第一個迴應

你應該閱讀優良的官方文件。第一個閱讀的文件是 Debian 特定的 “`/usr/share/doc/package_name/README.Debian`”。同時也應該查詢 “`/usr/share/doc/package_name/`” 中的其它文件。如果你設定 shell 為節 1.4.2, “定製bash”，輸入下列指令。

    $ cd package_name
    $ pager README.Debian
    $ mc

你可能需要安裝以 “`-doc`” 字尾命名的對應文件軟體包來獲得詳細的資訊。

如果你在使用一個特定的軟體包時出現了問題，一定要首先檢查 Debian bug 跟蹤系統（BTS） 網站。

表格 2.5. 解決特定軟體包問題的主要網站

網站 | 指令
--- | ---
Debian bug tracking system (BTS) 主頁 | `sensible-browser "https://bugs.debian.org/"`
已經知道軟體包名稱的 bug 報告 | `sensible-browser "https://bugs.debian.org/package_name"`
知道 bug 編號的 bug 報告 | `sensible-browser "https://bugs.debian.org/bug_number"`

使用 Google 搜尋，在關鍵字中包含 “`site:debian.org`”，“`site:wiki.debian.org`”，“`site:lists.debian.org`” 等等。

當你要傳送一份 bug 報告時，請使用 reportbug(1) 指令。

### 2.1.10. 如何挑選 Debian 軟體包

當遇到2個以上的類似的軟體包時，先前沒有經過反覆的嘗試，你不知道安裝哪一個的時候，應該用常識來判斷。我認為以下幾點是首選的軟體包應該具有的特徵。

- 重要性：是 > 否

- 型別：main > contrib > non-free

- 優先順序：需要 > 重要 > 標準 > 可選 > 額外

- 任務：在任務下有軟體包的列表資訊，例如 “桌面環境”

- 軟體包是被與之有依賴關係的軟體包所選擇的（例如 `gcc` 依賴 `gcc-16`）

- 流行度：在投票或者安裝指數上有著更高的分數

- 更新日誌：維護者經常的更新

- BTS (缺陷跟蹤系統):沒有 RC 級別的缺陷（沒有危險、重大嚴重的缺陷）

- BTS (缺陷跟蹤系統):有維護者對缺陷報告反饋

- BTS (缺陷跟蹤系統): 有著更多的近期修復的 bug 數目

- BTS (缺陷跟蹤系統):遺留的非嚴重（non-wishlist）缺陷數量較少

Debian 是一個使用分散式開發模式的志願專案，它的檔案庫包含了許多不同關注點和不同質量的軟體包。你必須做出自己的選擇。

### 2.1.11. 怎樣和不一致的要求協作

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

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

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

- 使用相應的沙盒化的上游二進位制軟體包來安裝這樣的程式（參見 節 7.7, “沙盒”）。

  - 許多常見的 GUI（圖形使用者介面）程式，比如 LibreOffice 和 GNOME 應用，會有 Flatpak、Snap 或 AppImage 軟體包存在。

- 建立一個 chroot 或類似的環境來在裡面執行這樣的程式（參見節 9.11, “虛擬化系統”）。

  - CLI 命令能夠在和它相容的 chroot 下輕鬆執行（參見 節 9.11.4, “Chroot 系統”）。

  - 不重啟機器，能夠輕鬆的嘗試多個完整的桌面環境（參見 節 9.11.5, “多桌面系統”）。

- 自己構建需要的二進位制軟體包版本，和你目前 Debian 系統相容。

  - 這是一個 不輕鬆的任務 (參見 節 2.7.13, “移植一個軟體包到 stable 系統”)。

## 2.2. 基礎軟體包管理操作

在 Debian 系統中有許多基於 APT 的軟體包管理工具可以在 Debian 系統上進行基於倉庫的軟體包管理操作。在這裡，我們將介紹兩種基本的軟體包管理工具：`apt`、`apt-get` / `apt-cache` 和 `aptitude` 。

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

### 2.2.1. `apt` vs. `apt-get` / `apt-cache` vs. `aptitude`

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

- 不建議在新版本釋出後在 `stable` Debian 系統上使用 `aptitude` 指令來進行跨版本的系統升級。

  - 建議使用"`apt full-upgrade`"或“`apt-get dist-upgrade`” 來進行這個操作。參見 Bug #411280。

- `aptitude`指令有時候會為了`testing` 或 `unstable` Debian 系統升級清除大量軟體包。

  - 這個情況嚇壞了許多的系統管理員。請不要驚慌。

  - 這似乎大多數是由元軟體包的依賴或推薦的軟體包版本偏差造成的，例如 `gnome-core`。

  - 要解決這個問題，可以在 `aptitude` 命令選單中選擇 “取消待執行的動作” ，退出 `aptitude`，並使用 “`apt full-upgrade`”。

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

- `apt-get` 和 `apt-cache` 只提供指令列使用者介面。

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

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

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

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

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

`apt`指令是一個高階的命令列介面用於套件管理。基本上，它是`apt-get`、`apt-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`，這會十分直觀。

### 2.2.2. 指令列中的基礎軟體包管理操作

下面是使用 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 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 的軟體包不必安裝的原因
`apt list --manual-installed` | `aptitude search '~i!~M'` | `apt-mark showmanual` | 列出手動安裝的軟體包

`apt` / `apt-get` 和 `aptitude` 能夠混用，沒有大問題。

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

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

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

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

表格 2.7. aptitude(8) 中重要的指令選項

指令選項 | 說明
--- | ---
`-s` | 模擬指令的結果
`-d` | 僅下載，不進行安裝/更新
`-D` | 在自動安裝和刪除前，顯示簡要的說明

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

### 2.2.3. aptitude 的互動式使用

要使用互動式的軟體包管理，你可以像下面那樣以互動模式啟動 `aptitude` 。

    $ sudo aptitude -u
    Password:

這將更新檔案庫資訊的本地副本，並以選單的形式全螢幕顯示軟體包列表。 aptitude 將它的調配放在 “`~/.aptitude/config`”。

| 提示
如果你想用 root 的調配而非使用者的，可以在上面的例子中使用 “`sudo -H aptitude …`” 代替 “`sudo aptitude …`” 。

| 提示
當 `aptitude` 以互動模式啟動時，會自動設定待執行的動作。如果您不喜歡，您可以通過選單：“動作” → “取消待執行的動作” 來取消它。

### 2.2.4. aptitude 的按鍵繫結

在全螢幕模式下瀏覽軟體包狀態和設定動作的按鍵如下。

表格 2.8. aptitude 的按鍵繫結

快捷鍵 | 鍵綁定功能
--- | ---
`F10` 或 `Ctrl-t` | 選單
`?` | 顯示按鍵幫助（更加完整的清單）
`F10` → 幫助 → 使用者手冊 | 顯示使用者手冊
`u` | 更新軟體包檔案庫資訊
`+` | 標記該軟體包以便升級或安裝
`-` | 標記該軟體包以便移除（保留組態檔案）
`_` | 標記該軟體包以便清除（移除組態檔案）
`=` | 將軟體包設為保持狀態
`U` | 標記所有可升級包（動作如同 full-upgrade）
`g` | 開始 下載 並 安裝 所選擇包
`q` | 退出該介面並儲存變更
`x` | 退出該介面並清除變更
`Enter` | 檢視軟體包的資訊
`C` | 檢視軟體包的變更記錄
`l` | 變更軟體包的顯示限制
`/` | 搜尋匹配的第一個軟體包
`\` | 重複上一個搜尋

可以通過命令列指定檔名稱，也可以通過按 “`l`” 或 “`/`” 之後在選單提示下輸入下列所述的 aptitude 正規表示式。aptitude 正規表示式可以使用 “`~n`” 開頭後接軟體包名稱的字串來精確匹配軟體包名稱。

| 提示
你需要在視覺化介面中按下 “`U`” 鍵讓所有的已安裝軟體包升級到可用版本 。否則只有選中的軟體包和一些與之有依賴關係的軟體包才能被升級到可用版本。

### 2.2.5. aptitude 軟體包檢視

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

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

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

- “狀態”標籤 （第一個字母）

- “動作”標籤（第二個字母）

- “自動”標籤（第三個字母）

- 軟體包名稱

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

- 軟體包當前版本

- 軟體包可用版本

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

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

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

表格 2.9. aptitude 檢視

檢視 | 檢視描述
--- | ---
`Package View` | 參見 表格 2.10, “標準軟體包檢視的分類” (預設)
`Audit Recommendations` | 列出推薦安裝但還沒有安裝的軟體包
`Flat Package List` | 不分類地列出軟體包 (用於正規表達式)
`Debtags Browser` | 列出由 debtags 進行分類的軟體包
`Source Package View` | 列出由原始碼軟體包分組的軟體包

| 注意
請幫助我們改進用 debtags 標記的軟體包！

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

表格 2.10. 標準軟體包檢視的分類

分類 | 檢視描述
--- | ---
`Upgradable Packages` | 按照 `section` → `area` → `軟體包` 的順序顯示列出軟體包
`New Packages` | 同上
`Installed Packages` | 同上
`Not Installed Packages` | 同上
`Obsolete and Locally Created Packages` | 同上
`Virtual Packages` | 列出同樣功能的軟體包
`Tasks` | 列出一個特定任務所需的不同功能的軟體包

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

### 2.2.6. aptitude 搜尋方式選項

aptitude 提供了幾個可以使用正規表達式來搜尋軟體包的選項。

- shell 指令列：

  - “`aptitude search 'aptitude_regex'`” 列出安裝狀態、軟體包名稱和匹配軟體包的剪短描述

  - “`aptitude show 'package_name'`” 列出軟體包的詳細描述

- 全螢幕互動模式:

  - "`l`" 可以限制匹配軟體包的檢視

  - "`/`" 搜尋匹配的軟體包

  - "`\`" 向後搜尋匹配的軟體包

  - "`n`" 查詢下一個

  - "`N`" 查詢上一個

| 提示
字串 package_name 被看作軟體包名稱的精確字串匹配，除非它是以 "`~`" 開頭的正規表達式。

### 2.2.7. aptitude 正規表達式

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{trixie,forky,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`”。現在空格字元 “`` ” 被認為是除了波浪字元 “`~`” 外的另一個正規表達式終止字元。新的長格式語法參見 “使用者手冊”。

### 2.2.8. aptitude 的依賴解決

如果通過選單 “`F10` → 選項 → 首選項 → 正在處理依賴關係” 進行相應的設定，則在 `aptitude` 中選擇一個軟體包時，不僅會將其 “`Depends:`” 列表中的軟體包選上，“`Recommends:`” 列表中的軟體包也會被選上。在 `aptitude` 下，這些自動安裝的軟體包在不再需要時會自動移除。

`aptitude` 指令中控制 “自動安裝” 行為的標籤也可以通過 `apt` 軟體包中的 apt-mark(8) 指令來設定。

### 2.2.9. 軟體包活動日誌

你可以在日誌檔案裡查詢到軟體包活動歷史。

表格 2.12. 軟體包活動日誌檔案

檔案 | 內容
--- | ---
`/var/log/dpkg.log` | `dpkg` 級的軟體包活動日誌
`/var/log/apt/term.log` | 通用 APT 活動日誌
`/var/log/aptitude` | `aptitude` 指令活動日誌

事實上，很難從這些日誌上快速獲得有用的資訊。較簡便的方法參見 節 9.3.9, “記錄組態檔案的變更” 。

## 2.3. aptitude 操作範例

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

### 2.3.1. 查詢感興趣的軟體包

你可以根據 `aptitude` 這個包管理工具中的軟體包描述或者是任務面板下的列表資訊，來查詢你所需要的軟體包。

### 2.3.2. 通過正規表達式匹配軟體包名稱來列出軟體包

下面的指令列出了通過正規表達式匹配軟體包名稱來列出軟體包。

    $ aptitude search '~n(pam|nss).*ldap'
    p libnss-ldap - NSS module for using LDAP as a naming service
    p libpam-ldap - Pluggable Authentication Module allowing LDAP interfaces

這種方式查詢精確的軟體包名稱很方便。

### 2.3.3. 使用正規表達式匹配瀏覽

在"新扁平軟體包列表" 中使用 "`l`" 提示檢視，正規表達式 "`~dipv6`" 可以限制性地匹配軟體描述，並互動式地展示資訊。

### 2.3.4. 完整地清理已刪除軟體包

您能清除所有已移除軟體包的剩餘組態檔案。

檢查以下指令的結果。

    # aptitude search '~c'

如果您確認所列出的軟體包應當被完整刪除，請執行以下指令。

    # aptitude purge '~c'

您可能想要在互動模式中做類似的操作進行細粒度的控制。

在 "新軟體包檢視" 使用 "`l`" 提示並輸入正則匹配式 "`~c`" ，這將僅匹配軟體包，比如， "移除但不清空調配" 。所有符合匹配的軟體包可以在頂層標題上使用 "`[`" 顯示。

當您在頂層標題如 “未安裝的包” 中輸入 “`_`”，當前標題下的軟體包只有匹配正則式才會被清除。您還可以使用“`=`” 來互動式地排除軟體包以避免刪除它們。

這種技術方便易用且適用於許多其他的指令鍵。

### 2.3.5. 調整自動/手動安裝狀態

下面是調整軟體包的自動/手動安裝狀態的方法（在使用非 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`" 指令是一個可選的操作，目的就是為了防止大量軟體包被解除安裝的情況出現。

### 2.3.6. 全面的系統升級

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

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

在 `trixie`-作為-`stable` 釋出迴圈中, 從 `stable` 升級到 `testing` 或者 `unstable`，你應該用 "`forky`" 或者 "`sid`" 替換源列表 檔案裡的 "`trixie`"示例，參考 節 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. 試著一步步的升級： `oldstable` → `stable` → `testing` → `unstable`.

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, “預防軟體包故障”。

## 2.4. 高階軟體包管理操作

### 2.4.1. 指令列中的高階軟體包管理操作

下面列出了一些其它的軟體包管理操作，這些操作對於 `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 URL for dsc file` | （從其它檔案庫）下載原始碼軟體包
`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)）只適用於高手。沒有完全理解它們的效果卻使用它們會破壞你的整個系統。

請注意以下幾點。

- 所有的系統調配和安裝指令都需要以 root 執行。

- 不同於使用正規表達式的 `aptitude` （參見 節 1.6.2, “正規表達式”），其它的軟體包管理指令使用類似於 shell glob 的萬用字元（參見 節 1.5.6, “Shell 萬用字元”）。

- apt-file(1) 由 `apt-file` 軟體包提供，並且需要先執行 “`apt-file update`”。

- configure-debian(8) 由 `configure-debian` 軟體包提供，它執行 dpkg-reconfigure(8) 作為後端。

- dpkg-reconfigure(8) 使用 debconf(1) 作為後端來執行軟體包指令碼。

- "`apt-get build-dep`" 、"`apt-get source`" 和 "`apt-cache showsrc`" 命令需要 源列表中存在 "`deb-src`" 條目。

- dget(1) 、debuild(1) 和 debi(1) 需要 `devscripts` 軟體包。

- 參見 節 2.7.13, “移植一個軟體包到 stable 系統” 裡使用 "`apt-get source`" 的打包（重打包）過程。

- `make-kpkg` 指令需要 `kernel-package` 軟體包（參見 節 9.10, “核心”）。

- 通用打包參見 節 12.9, “製作 Debian 套件”.

### 2.4.2. 驗證安裝的軟體包檔案

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

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

### 2.4.3. 預防軟體包故障

許多使用者更想使用 Debian 系統的 testing （或 unstable）版本，因為它有新的功能和軟體包。但這會使得系統更容易遇到嚴重的軟體包問題。

安裝軟體包 `apt-list bugs` 可以避免您的系統遭遇嚴重 bugs，在通過 APT 系統升級時，它會自動檢查 Debian BTS 裡的嚴重 bug。

安裝 `apt-listchanges` 軟體包，在使用 APT 系統升級時它會在 “`NEWS.Debian`” 中提供重要新聞。

### 2.4.4. 搜尋軟體包元資料

儘管近來瀏覽 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) 。

## 2.5. Debian 軟體包內部管理

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

### 2.5.1. 檔案庫元資料

每個發行版的元資料檔案都儲存在 Debian 映象站的 “`dist/codename`” 下面，例如 “`http://deb.debian.org/debian/`”。檔案庫的結構可以通過網路瀏覽器來瀏覽。其中有 6 種關鍵的元資料。

表格 2.14. Debian 檔案庫元資料的內容

檔案 | 位置 | 內容
--- | --- | ---
`Release` | 發行版的頂層 | 檔案庫描述和完整性資訊
`Release.gpg` | 發行版的頂層 | "`Release`" 檔案的簽名檔案，使用檔案庫金鑰簽名
`Contents-architecture` | 發行版的頂層 | 列出在相關架構中所有軟體包的全部檔案
`Release` | 每個發行版/區域/架構組合的頂部 | 歸檔描述使用 `apt_preferences`( 5 ) 的規則
`Packages` | 每個發行版/區域/二進位制架構組合的頂部 | 連線 `debian/control` 獲得二進位制包
`Sources` | 每個 發行版/區域/原始碼 組合的頂部 | 連線 `debian/control` 獲得原始碼包

為了減少網路流量，在最近的檔案庫中，這些元資料儲存為壓縮了的差分檔案。

### 2.5.2. 頂層“Release”檔案及真實性

| 提示
頂層“`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 檔案庫公鑰。

### 2.5.3. 檔案庫層的“Release”檔案

| 提示
檔案庫層的“`Release`”檔案將用作apt_preferences(5)的規則。

歸檔層次的 "`Release`" 檔案，其全部歸檔位置在 源列表 中指定，如以下的 "`http://deb.debian.org/debian/dists/unstable/main/binary-amd64/Release`" 或 "`http://deb.debian.org/debian/dists/sid/main/binary-amd64/Release`"。

    Archive: unstable
    Origin: Debian
    Label: Debian
    Component: main
    Architecture: amd64

| 注意
對於"`Archive:`" 章節，系列名稱("`stable`"，"`testing`"，"`unstable`", …) 用於 Debian archive ，而代號("`trusty`", "`xenial`", "`artful`", …) 用於 Ubuntu archive。

對於部分檔案庫,比如說 `experimental` 和 `trixie-backports`, 它們包含的軟體包不會被自動安裝，這是因為有額外的行，例如在 "`http://deb.debian.org/debian/dists/experimental/main/binary-amd64/Release`" 裡面有如下額外的一行。

    Archive: experimental
    Origin: Debian
    Label: Debian
    NotAutomatic: yes
    Component: main
    Architecture: amd64

請注意，普通的檔案庫沒有 "`NotAutomatic: yes`", 預設的 Pin-Priority 值是 500, 而對於有 "`NotAutomatic: yes`"的特殊檔案庫, 預設的 Pin-Priority 值是 1 (參見 apt_preferences(5) 和 節 2.7.7, “使用 apt-pinning 調整獲選版本”).

### 2.5.4. 獲得用於軟體包的元資料

當使用 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`"檔案的本地拷貝預設也使用不同的位置。)

### 2.5.5. APT 的軟體包狀態

除了遠端獲得元資料，`lenny` 之後的 APT 工具還會將它在本地產生的安裝狀態資訊儲存在 “`/var/lib/apt/extended_states`” 中，APT 會使用它們來追蹤自動安裝的所有軟體包。

### 2.5.6. aptitude 的軟體包狀態

除了遠端獲得元資料，`aptitude` 指令還會將它在本地產生的安裝狀態資訊儲存在 “`/var/lib/aptitude/pkgstates`” 中，這些資訊只能被 aptitude 使用。

### 2.5.7. 獲得的軟體包的本地副本

所有通過 APT 機制遠端獲得的軟體包都被儲存在 “`/var/cache/apt/archives`” 中，直到它們被清除。

`aptitude` 的這個快取檔案清理策略，能夠在"`Options`" → "`Preferences`"下設定，也可以通過它的選單，"`Actions`"下的"`Clean package cache`" 或 "`Clean obsolete files`" 來執行強制清理。

### 2.5.8. Debian 軟體包檔名稱

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

表格 2.15. Debian 軟體包的名稱結構

軟體包型別 | 名稱結構
--- | ---
二進位制軟體包（亦稱 `deb`） | `package-name_upstream-version-debian.revision_architecture.deb`
用於 debian-installer 的二進位制軟體包（亦稱 `udeb`） | `package-name_upstream-version-debian.revision_architecture.udeb`
原始碼軟體包（上游原始碼） | `package-name_upstream-version-debian.revision.orig.tar.gz`
`1.0` 原始碼軟體包(Debian 改變) | `package-name_upstream-version-debian.revision.diff.gz`
`3.0 (quilt 補丁管理工具)` 原始碼軟體包(Debian 改變) | `package-name_upstream-version-debian.revision.debian.tar.gz`
原始碼軟體包（說明） | `package-name_upstream-version-debian.revision.dsc`

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

表格 2.16. Debian 軟體包名稱中每一個元件可以使用的字元

名稱元件 | 可用的字元（正規表示式） | 存在狀態
--- | --- | ---
`package-name` | `[a-z0-9][-a-z0-9.+]+` | 必需
`epoch:` | `[0-9]+:` | 可選
`upstream-version` | `[-a-zA-Z0-9.+:]+` | 必需
`debian.revision` | `[a-zA-Z0-9.+~]+` | 可選

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

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

### 2.5.9. dpkg 指令

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）支援的標準化使用者互動。

表格 2.17. `dpkg` 建立的重要檔案

檔案 | 內容說明
--- | ---
`/var/lib/dpkg/info/package_name.conffiles` | 列出組態檔案。（使用者可修改的）
`/var/lib/dpkg/info/package_name.list` | 列出軟體包安裝的所有檔案和目錄
`/var/lib/dpkg/info/package_name.md5sums` | 列出軟體包安裝的檔案的 MD5 雜湊值
`/var/lib/dpkg/info/package_name.preinst` | 軟體包安裝之前執行的軟體包指令碼
`/var/lib/dpkg/info/package_name.postinst` | 軟體包安裝之後執行的軟體包指令碼
`/var/lib/dpkg/info/package_name.prerm` | 軟體包移除之前執行的軟體包指令碼
`/var/lib/dpkg/info/package_name.postrm` | 軟體包移除之後執行的軟體包指令碼
`/var/lib/dpkg/info/package_name.config` | 用於 `debconf` 系統的軟體包指令碼
`/var/lib/dpkg/alternatives/package_name` | `update-alternatives` 指令使用的替代資訊
`/var/lib/dpkg/available` | 所有軟體包的可用性資訊
`/var/lib/dpkg/diversions` | dpkg(1) 使用的檔案移動資訊，由 dpkg-divert(8) 設定
`/var/lib/dpkg/statoverride` | dpkg(1) 使用的檔案狀態改變資訊，由 dpkg-statoverride(8) 設定
`/var/lib/dpkg/status` | 所有軟體包的狀態資訊
`/var/lib/dpkg/status-old` | “`var/lib/dpkg/status`” 檔案的第一代備份
`/var/backups/dpkg.status*` | 第二代備份，以及“`var/lib/dpkg/status`”檔案更舊的備份

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

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

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

### 2.5.10. update-alternatives 指令

Debian 系統使用 update-alternatives(1) 讓使用者可以不受干擾地安裝多種重疊的程式。例如，如果同時安裝了 `vim` 和 `nvi` 軟體包，你可以使 `vi` 指令選擇執行 `vim`。

    $ ls -l $(type -p vi)
    lrwxrwxrwx 1 root root 20 2007-03-24 19:05 /usr/bin/vi -> /etc/alternatives/vi
    $ sudo update-alternatives --display vi
    ...
    $ sudo update-alternatives --config vi
      Selection    Command
     ----------------------------------------------
          1        /usr/bin/vim
    *+    2        /usr/bin/nvi

    Enter to keep the default[*], or type selection number: 1

Debian 選擇系統在 "`/etc/alternatives/`" 目錄裡通過符號連結來維持它的選擇。選擇程序使用"`/var/lib/dpkg/alternatives/`"目錄裡面的相應檔案。

### 2.5.11. dpkg-statoverride 指令

當安裝一個軟體包時，由 dpkg-statoverride(8) 指令提供的 狀態修改，是告訴dpkg(1) 對 檔案 使用不同的屬主或許可權的一個方法。如果使用了 "`--update`" 選項，並且檔案存在，則該檔案會被立即設定為新的屬主和模式。

| 注意
系統管理員使用 `chmod` 或 `chown` 指令直接修改某個軟體包檔案的屬主或許可權，將會在下次軟體包升級時，被重置。

| 注意
本人在此使用了檔案 一詞，但事實上也可用於`dpkg` 所處理的任何檔案系統物件，包括目錄，裝置等。

### 2.5.12. dpkg-divert 指令

dpkg-divert(8) 指令提供的檔案轉移，是迫使 dpkg(1) 將檔案不安裝到其預設位置，而是安裝到轉移 的位置。`dpkg-divert` 是軟體包維護指令碼。不建議系統管理員使用這個指令。

## 2.6. 從損壞的系統中恢復

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

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

### 2.6.1. 不相容舊的使用者調配

如果一個桌面 GUI 程式在重要的上游版本升級後變得不穩定，你應該懷疑這是舊的本地配置檔案（由它建立的）所導致的。如果它在新建的使用者賬號下執行穩定，那麼這個假設就得到了證實。（這是一個打包的 bug 並且打包者通常會避免它。）

為了恢復穩定，你應該移除相應的本地組態檔案並重新啟動 GUI 程式。你可能需要閱讀舊的組態檔案內容以便之後恢復調配資訊。（別將它們刪得太快了。）

### 2.6.2. 軟體包資料快取錯誤

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

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

### 2.6.3. 使用 dpkg 指令進行救援

因 `dpkg` 是非常底層的軟體包工具，它能夠在沒有網路連線時執行。

讓我們假設 `foo` 軟體包損壞了，需要被修復。

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

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

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

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

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

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

### 2.6.4. 缺少依賴導致的安裝失敗

如果你通過"`sudo dpkg -i ...`"強制安裝一個軟體包到系統，而不安裝它所依賴的所有軟體包，這個軟體包將作為“部分安裝”而失敗。

你應當安裝所有依賴的軟體包，重複使用 "`sudo dpkg -i ...`" 或通過使用：

    # apt --fix-broken install

然後，使用下列命令來配置所有部分安裝的軟體包。

    # dpkg --configure -a

### 2.6.5. 具有相同檔案的不同軟體包

文件級的軟體包管理系統，比如說 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

### 2.6.6. 修復損壞的軟體包指令碼

當軟體包指令碼中的一個指令由於某些原因回傳錯誤，指令碼也將由於錯誤而退出，軟體包管理系統忽略它們的行為，並導致部分安裝的軟體包。當一個軟體包在它的刪除指令碼中有錯誤時，該軟體包將會成為不可能刪除的軟體包，處理這些問題，都會變得相當棘手。

對於 “`package_name`” 的軟體包指令碼問題，你應該檢視下列的軟體包指令碼。

- "`/var/lib/dpkg/info/package_name.preinst`"

- "`/var/lib/dpkg/info/package_name.postinst`"

- "`/var/lib/dpkg/info/package_name.prerm`"

- "`/var/lib/dpkg/info/package_name.postrm`"

使用下列的方法，以 root 編輯損壞的軟體包指令碼。

- 在行首新增 “`#`” 可以禁用出錯的行

- 在出錯行的行尾新增 “`|| true`” 可以強制回傳成功

然後，使用下列命令來配置所有部分安裝的軟體包。

    # dpkg --configure -a

### 2.6.7. 恢復軟體包選擇資料

如果 “`/var/lib/dpkg/status`” 因為某種原因出現錯誤，Debian 系統會丟失軟體包選擇資料並受到嚴重影響。尋找位於 “`/var/lib/dpkg/status-old`” 或 “`/var/backups/dpkg.status.*`” 中舊的 “`/var/lib/dpkg/status`” 檔案。

給 “`/var/backups/`” 分配一個單獨的分割槽是一個好習慣，因為這個目錄包含了許多重要的系統資料。

對於嚴重的損壞，我建議備份系統後重新安裝。即使失去 “`/var/`” 中的所有資料，你依舊可以從 “`/usr/share/doc/`” 目錄恢復一些資訊來引導你進行新的安裝。

重新安裝最小（桌面）系統。

    # mkdir -p /path/to/old/system

將舊系統掛載到 “`/path/to/old/system/`”。

    # cd /path/to/old/system/usr/share/doc
    # ls -1 >~/ls1.txt
    # cd /usr/share/doc
    # ls -1 >>~/ls1.txt
    # cd
    # sort ls1.txt | uniq | less

然後你就可以根據軟體包名稱來進行安裝了。（可能會有一些非軟體包名稱，例如 “`texmf`”。）

## 2.7. 軟體包管理技巧

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

### 2.7.1. 上傳軟體包的是誰？

儘管 “`/var/lib/dpkg/available`” 和 “`/usr/share/doc/package_name/changelog`” 中列出的維護者姓名提供了關於“軟體包運作的幕後者是誰”這一問題的一些資訊，但軟體包的實際上傳者依舊不明。`devscripts` 軟體包中的 who-uploads(1) 可以識別 Debian 源軟體包的實際上傳者。

### 2.7.2. 限制 APT 的下載頻寬

如果你想限制 APT 的下載頻寬到 800Kib/sec（=100KiB/sec），你應該像下面那樣設定 APT 的調配參數。

    APT::Acquire::http::Dl-Limit "800";

### 2.7.3. 自動下載和升級軟體包

`apt` 軟體包有自己的 cron 指令碼 “`/etc/cron.daily/apt`” ，它支援自動下載軟體包。可以安裝 `unattended-upgrades` 軟體包來增強這個指令碼，使它能夠自動升級軟體包。可以通過 “`/etc/apt/apt.conf.d/02backup`” 和 “`/etc/apt/apt.conf.d/50unattended-upgrades`” 中的參數來進行自定義，相關說明位於 “`/usr/share/doc/unattended-upgrades/README`” 中。

`unattended-upgrades` 軟體包主要用於 `stable` 系統的安全更新。如果自動升級損壞 `stable` 系統的風險小於被入侵者利用已被安全更新修復的安全漏洞，你應該考慮使用自動更新，調配引數如下。

    APT::Periodic::Update-Package-Lists "1";
    APT::Periodic::Download-Upgradeable-Packages "1";
    APT::Periodic::Unattended-Upgrade "1";

如果你執行的是 `testing` 或 `unstable` 系統，你應該不會想要使用自動更新，因為它肯定會在某天損壞系統。即使位於這樣的 `testing` 或`unstable` 情況下，你可能依舊想提前下載軟體包以節省互動式升級的時間，其配置引數如下。

    APT::Periodic::Update-Package-Lists "1";
    APT::Periodic::Download-Upgradeable-Packages "1";
    APT::Periodic::Unattended-Upgrade "0";

### 2.7.4. 更新和向後移植

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

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

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

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

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

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

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

    $ sudo apt-get install -t trixie-backports package-name

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

### 2.7.5. 外部軟體包檔案庫

| 警告
你應當小心，外部軟體包獲取你係統的 root 許可權。你應當只使用可信賴的外部軟體包檔案庫。替代方案參見 節 2.1.11, “怎樣和不一致的要求協作”。

你能夠使用安全 APT 來使用 Debian 相容的外部軟體包檔案庫，將它加入到 源列表，並把它的檔案庫金鑰放入"`/etc/apt/trusted.gpg.d/`" 目錄。參見 sources.list(5)、apt-secure(8) 和 apt-key(8)。

### 2.7.6. 不使用 apt-pinning 的混合源檔案庫軟體包

| 注意
從混合源檔案庫中安裝軟體包是不被 Debian 官方發行版所支援的，除了官方支援的檔案庫的特殊組合以外，例如 `stable` 的 security updates 和 stable-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 不會確保軟體之間的相容性，所以你必須自己去解決相容性問題。如果軟體之間存在不相容性，系統可能會損壞。你必須能夠判斷這些操作所需的技術要求。使用任意混合的檔案源是完全可選的操作，我並不鼓勵你去使用它。

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

- 非二進位制軟體包 ("`Architecture: all`") 的安裝是更保險的。

  - 文件軟體包：沒有特別的要求

  - 解釋程式的軟體包：相容的直譯器必須是可用的

- 二進位制軟體包 (non "`Architecture: all`")通常會面臨很多障礙，它的安裝不保險的。

  - 庫檔案版本的相容性（包括 "`libc`"）

  - 與之相關的有用的程式版本的相容性

  - 核心 ABI 的相容性

  - C++ ABI 的相容性

  - …

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

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

### 2.7.7. 使用 apt-pinning 調整獲選版本

| 警告
新手用 apt-pinning 命令肯定會造成比較大的問題。你必須避免使用這個技術，除非確實需要它。參見 節 2.1.11, “怎樣和不一致的要求協作” 用於替代方案。

沒有 "`/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.3, “使用 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" 條目中定義或者是使用它的預設值。

表格 2.18. 用於 apt-pinning 技術的值得注意的 Pin-Priority 值列表。

Pin-Priority | apt-pinning 對軟體包的影響
--- | ---
1001 | 安裝該軟體包，即使是一個降級軟體包的指令
990 | 用作目標發行版檔案庫的預設值
500 | 用作常規檔案庫的預設值
100 | 用於 NotAutomatic 和 ButAutomaticUpgrades 檔案庫的預設值
100 | 用於已安裝軟體包
1 | 用於 NotAutomatic 檔案庫的預設值
-1 | 即使被推薦，也絕不安裝這個軟體包

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

NotAutomatic 和 ButAutomaticUpgrades 的檔案是由檔案庫伺服器上檔案層級的 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/ trixie-backports/main Packages`".

### 2.7.8. 阻止推薦的軟體包的安裝

| 警告
新手用 apt-pinning 命令肯定會造成比較大的問題。你必須避免使用這個技術，除非確實需要它。參見 節 2.1.11, “怎樣和不一致的要求協作” 用於替代方案。

如果不想要引入推薦的特定軟體包，你必須建立 "`/etc/apt/preferences`" 檔案並且像如下所示的那樣在檔案的頂部明確列出這些軟體包。

    Package: package-1
    Pin: version *
    Pin-Priority: -1

    Package: package-2
    Pin: version *
    Pin-Priority: -1

### 2.7.9. 使用帶有 `unstable` 軟體包的 `testing` 版本

| 警告
新手用 apt-pinning 命令肯定會造成比較大的問題。你必須避免使用這個技術，除非確實需要它。參見 節 2.1.11, “怎樣和不一致的要求協作” 用於替代方案。

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

### 2.7.10. 使用帶有 `experimental` 軟體包的 `unstable` 版本

| 警告
新手用 apt-pinning 命令肯定會造成比較大的問題。你必須避免使用這個技術，除非確實需要它。參見 節 2.1.11, “怎樣和不一致的要求協作” 用於替代方案。

這是使用apt-pinning 的另一個示例，該示例主要使用`unstable`源，但包含了`experimental`源, 該源可用於安裝上游更新的軟體包 . 需要包含在"`/etc/apt/sources.list`" 檔案中的列表如下:

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

由於`experimental`源是 非自動（NotAutomatic）的源 (參見 節 2.5.3, “檔案庫層的“Release”檔案”)，其預設的Pin-Priority值 被設定為1 (<<100) . 並不需要在"`/etc/apt/preferences`"檔案中設定Pin-Priority值，只需要指定 `experimental` 源，除非你需要在下次更新時自動升級時更新特定軟體包.

### 2.7.11. 緊急降級

| 警告
新手用 apt-pinning 命令肯定會造成比較大的問題。你必須避免使用這個技術，除非確實需要它。參見 節 2.1.11, “怎樣和不一致的要求協作” 用於替代方案。

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

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

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

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

使用下面的行替換它，從而改為使用 `testing`。

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

### 2.7.12. equivs 軟體包

如果你從原始碼編譯了一個程式來代替 Debian 軟體包，最好將它做成一個真正的本地 Debian 軟體包（`*.deb`）並使用私人檔案庫。

如果你選擇從原始碼編譯一個程式並將它安裝到 “`/usr/local`”，你可能需要使用 `equivs` 作為最後步驟來滿足缺失的軟體包依賴。

    Package: equivs
    Priority: optional
    Section: admin
    Description: Circumventing Debian package dependencies
     This package provides a tool to create trivial Debian packages.
     Typically these packages contain only dependency information, but they
     can also include normal installed files like other packages do.
     .
     One use for this is to create a metapackage: a package whose sole
     purpose is to declare dependencies and conflicts on other packages so
     that these will be automatically installed, upgraded, or removed.
     .
     Another use is to circumvent dependency checking: by letting dpkg
     think a particular package name and version is installed when it
     isn't, you can work around bugs in other packages' dependencies.
     (Please do still file such bugs, though.)

### 2.7.13. 移植一個軟體包到 stable 系統

| 注意
由於系統差異，不能夠保證這裡描述的過程能夠工作，而不需要額外的手工處理。

對於部分升級的 `stable` 系統，使用源軟體包在執行環境中重新構建一個軟體包是不錯的選擇。這可以避免因為依賴關係導致大量軟體包升級。

在 `stable` 系統的 “`/etc/apt/sources.list`” 檔案中新增下列條目。

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

如下安裝編譯所需的軟體包並下載源軟體包。

    # apt-get update
    # apt-get dist-upgrade
    # apt-get install fakeroot devscripts build-essential
    # apt-get build-dep foo
    $ apt-get source foo
    $ cd foo*

如果需要向後移植，可以從 backport 的軟體包中更新一些工具鏈軟體包，例如 `dpkg` 和 `debhelper`。

執行下列指令。

    $ dch -i

更新軟體包版本，例如在 “`debian/changelog`” 中附加一個 “`+bp1`”

像下面那樣構建軟體包並將它們安裝到系統中。

    $ debuild
    $ cd ..
    # debi foo*.changes

### 2.7.14. 用於 APT 的代理伺服器

因為映象整個 Debian 檔案庫的子區會浪費硬碟和網路頻寬，當你管理許多 LAN 上的系統時，為 APT 部署一個本地代理伺服器是個好主意。APT 可以通過調配來使用通用 web（http）代理伺服器，例如 `squid`（參見 節 6.5, “其它網路應用服務”），細節參見 apt.conf(5) 和 “`/usr/share/doc/apt/examples/configure-index.gz`”。環境變數 “`$http_proxy` 會覆蓋 “`/etc/apt/apt.conf`” 檔案中設定的代理伺服器。

這裡有一些 Debian 檔案庫的專用代理工具。你應該在使用它們之前檢查 BTS。

表格 2.19. Debian 檔案庫的專用代理工具

軟體包 | 流行度 | 大小 | 說明
--- | --- | --- | ---
`apt-cacher` | V:0.31, I:0.35 | 265 | 為 Debian 軟體包和原始碼檔案進行快取代理（Perl 程式）
`apt-cacher-ng` | V:4.2, I:4.3 | 2063 | 分發軟體包的快取代理（C++ 編譯的程式）

| 注意
當 Debian 重構它的檔案庫結構時，這些專用的代理工具往往需要軟體包維護者重寫程式碼，並可能在一段時間內無法使用。另一方面，通用 web （http） 代理伺服器更強健並且更容易應對這種改變。

### 2.7.15. 更多關於軟體包管理的文件

你可以從下面的文件中瞭解軟體包管理的更多資訊。

- 軟體包管理的主要文件：

  - aptitude(8), dpkg(1), tasksel(8), apt(8), apt-get(8), apt-config(8), apt-secure(8), sources.list(5), apt.conf(5), and apt_preferences(5);

  - 來自 `apt-doc` 軟體包的 “`/usr/share/doc/apt-doc/guide.html/index.html`” 和 “`/usr/share/doc/apt-doc/offline.html/index.html`”；

  - 來自 `aptitude-doc-en` 軟體包的 “`/usr/share/doc/aptitude/html/en/index.html`”。

- Debian 檔案庫的官方詳細文件：

  - "Debian Policy Manual Chapter 2 - The Debian Archive"，

  - "Debian Developer's Reference, Chapter 4 - Resources for Debian Developers 4.6 The Debian archive"，

  - "The Debian GNU/Linux FAQ, Chapter 6 - The Debian FTP archives"。

- 為 Debian 使用者構建一個 Debian 軟體包的教學：

  - “Debian 維護者指南”。

章 1. GNU/Linux 教學 |  | 章 3. 系統初始化