使用 apt 安裝任意版本的軟體包的推薦方法是什麼?
問題:
我需要一種方法來在我的 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-selections
或apt-mark hold
)避免升級。