Debian

使用 apt 安裝任意版本的軟體包的推薦方法是什麼?

  • November 6, 2017

問題:

我需要一種方法來在我的 Debian 系統上安裝某些軟體包的特定固定版本。snapshot.debian.org似乎提供了一種方法來執行此操作,但是即使在我的 apt-sources 中添加了快照後,我也無法apt-get install在該快照存檔中找到某些特定版本的軟體包。

問題:

從 Debian 快照存檔安裝特定軟體包版本的官方或“正確”方式是什麼?

背景和我嘗試過的:

讓我們使用 Debian8 Jessie 和 3.16.x 核心二進製文件作為我們的範例。在撰寫本文時,Jessie 發布的核心是 3.16.43-2+deb8u5。假設我要安裝 3.16.43-2+deb8u4。

我首先在 debian 快照檔案中搜尋我想要的版本 ( http://snapshot.debian.org/binary/linux-image-3.16.0-4-amd64/ ),然後點擊我想要的核心的確切版本我正在尋找,這讓我可以訪問 http://snapshot.debian.org/package/linux/3.16.43-2%2Bdeb8u4/#linux-image-3.16.0-4-amd64_3.16.43-2:2b: deb8u4

從那裡,我可以看到該包是“在 2017-09-20 22:12:21 在 debian-security 中看到”和“在 2017-10-08 16:31:52 在 debian 中看到”。我決定使用前者並選擇 debian-security snapshot 20170920T221221Z

按照snapshot.debian.org首頁上的說明,我將以下內容添加到我的 /etc/apt/sources.list 中:

deb http://snapshot.debian.org/archive/debian-security/20170920T221221Z/ jessie/updates main
deb src http://snapshot.debian.org/archive/debian-security/20170920T221221Z/ jessie/updates main

然後我執行apt-get -o Acquire::Check-Valid-Until=false update並看到更新(似乎)成功完成。

我認為這將允許我現在安裝所需的核心版本,但 apt 只知道兩個安裝候選者,3.16.43-2+deb8u2 和 3.16.43-2+deb8u5。沒有 +deb8u4 的跡象:

# apt-cache madison linux-image-3.16.0-4-amd64
linux-image-3.16.0-4-amd64 | 3.16.43-2+deb8u5 | http://security.debian.org/ jessie/updates/main amd64 Packages
linux-image-3.16.0-4-amd64 | 3.16.43-2+deb8u5 | http://snapshot.debian.org/archive/debian-security/20170920T221221Z/ jessie/updates/main amd64 Packages
linux-image-3.16.0-4-amd64 | 3.16.43-2+deb8u2 | http://cloudfront.debian.net/debian/ jessie/main amd64 Packages
linux-image-3.16.0-4-amd64 | 3.16.7-ckt25-2 | http://cloudfront.debian.net/debian/ jessie-updates/main amd64 Packages
    linux |  3.16.39-1 | http://cloudfront.debian.net/debian/ jessie-backports/main Sources

# apt-cache policy linux-image-3.16.0-4-amd64
linux-image-3.16.0-4-amd64:
 Installed: 3.16.43-2+deb8u5
 Candidate: 3.16.43-2+deb8u5
 Version table:
    3.16.43-2+deb8u5 0
       500 http://security.debian.org/ jessie/updates/main amd64 Packages
       500 http://snapshot.debian.org/archive/debian-security/20170920T221221Z/ jessie/updates/main amd64 Packages
*** 3.16.43-2+deb8u2 0
       500 http://cloudfront.debian.net/debian/ jessie/main amd64 Packages
       100 /var/lib/dpkg/status
    3.16.7-ckt25-2 0
       500 http://cloudfront.debian.net/debian/ jessie-updates/main amd64 Packages

此外,如果我嘗試指定並安裝我想要的版本,它會返回“未找到”:

# apt-get install linux-image-3.16.0-4-amd64=3.16.43-2+deb8u4
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Version '3.16.43-2+deb8u4' for 'linux-image-3.16.0-4-amd64' was not found

我已經設法通過下載 .deb 二進製文件並安裝它來解決這個問題,dpkg -i但我更喜歡使用 apt 而不是 curl’ing .debs 並安裝它們。任何人都可以解釋我需要做什麼才能apt-get install獲得特定的包裹,或者至少解釋為什麼這不能像我期望的那樣工作嗎?

這不是精確的科學,但這裡可能解釋了為什麼它不適用於這種特定情況(它通常有效,當你沒有跟隨目標變化太快時)。

給定的儲存庫通常僅引用 Packages 文件中的一個包版本,例如,這個. 這不是技術義務,例如deb https://dl.winehq.org/wine-builds/debian/ jessie main在其 Packages 文件中包含同一軟體包的多個版本,所有版本都可以通過 apt-get 檢索,=​​就像您一樣使用,但 Debian (TM) 不會在同一個 Packages 文件中保留對多個版本的引用.

如果您查看要查找的軟體包所在的實際目錄,您會看到兩個版本都可用:

linux-image-3.16.0-4-amd64_3.16.43-2+deb8u4_amd64.deb

linux-image-3.16.0-4-amd64_3.16.43-2+deb8u5_amd64.deb

當 deb8u5 出現時,之前對 deb8u4 的引用消失了。deb8u4 .deb 可能仍被其他儲存庫引用,或者根本沒有經歷一些“垃圾收集”。在快照導航中點擊“prev change”只會導致沒有 deb8u4 和 deb8u5 的 deb8u3。這意味著 deb8u4 和 deb8u5 之間的更改發生得太快,以至於 deb8u4 的 Packages 文件無法下載或 snapshot.debian.org 在 deb8u5 替換它之前保存此中間 Packages 文件。debian-security 中的這個引用(以及相應的校驗和,以及簽名的 Release 文件)失去了。

再次嘗試使用 debian(而不是 debian-security):

linux-image-3.16.0-4-amd64_3.16.43-2+deb8u4_amd64.deb

帶有相應的Packages.xz文件。這個只有 deb8u2 的條目……並且只會保留這個。較新的版本應該來自 debian-security 直到 8.10 發布,所以即使它們出現在池中,那隻是因為 snapshot.debian.org 使所有出現在同一個地方。

很抱歉,對於這個特定的軟體包版本,我沒有看到下載 deb8u4 的方法。即使可以從連結下載並dpkg -i安裝它,也無法驗證下載的內容,因此應避免使用。

注意:您的方法是正確的。您通常可以通過為某些特定軟體包固定特定快照來完成它,允許 apt-get 自動選擇它們(不需要=)並避免它們以後升級。那裡對此進行了解釋: https ://wiki.debian.org/AptPreferences 。持有它們也可以(dpkg --set-selectionsapt-mark hold)避免升級。

引用自:https://serverfault.com/questions/882133