我有 Debian Jessie 並添加了向後移植(根據這些說明):
echo "deb http://http.debian.net/debian jessie-backports main contrib non-free" | sudo tee /etc/apt/sources.list.d/backports.list
(我這樣做是為了獲得更新的內核,因為我需要它,用於我的筆記型電腦中的某些硬體。)
說明說不會發生任何事情,除非我明確要求向後移植的包包。例如apt-get -t jessie-backports install "package"
。
然而,我現在似乎從向後移植中獲得了系統的全部負載,並且一個軟體包已被卸載,因為它取決於更新到向後移植的某些內容的確切版本。
所以我的問題是:
- 我如何先停止它,以便不再安裝向後移植?
- 如何刪除現有的向後移植?
注意:這會取得來自向後移植的已安裝軟體包的清單(並且採用可以傳遞到的格式apt-get install
,由於某種原因,sudo apt-get install
在管道末尾放置 echo 不起作用):
cat /var/log/dpkg.log.1 |grep -v linux | grep -v xserver | grep -v firmware | grep "status installed" | grep bpo | cut -d" " -f 5 | cut -d: -f 1 | xargs -i{} -n1 bash -c "dpkg-query -s {} >/dev/null && echo {}" | sed -r -e "s~.*~\0/jessie~" | xargs echo
警告:
有些軟體包是自動安裝的,因此如果您重新安裝所有軟體包,那麼這些自動安裝的軟體包將被標記為手動安裝。因此在不需要時不會被移除。
有人對如何解決這個問題有任何想法嗎?
答案1
嘗試將以下內容新增至以下任一
/etc/apt/apt.conf
文件/etc/apt/apt.conf.d
:APT::Default-Release "jessie";
要刪除現有的向後移植,您需要取得已安裝的向後移植以及它們替換的版本的清單。幸運的是,這些資訊可以很容易地從
/var/log/dpkg.log
例如grep ' upgrade ' /var/log/dpkg.log
會給你很多像下面這樣的行:
2016-02-15 11:06:32 upgrade python-numpy:amd64 1:1.11.0~b2-1 1:1.11.0~b3-1
這表示在 2 月 15 日上午 11:06,我將 python-numpy 從版本 1:1.11.0~b2-1 升級到版本 1:1.11.0~b3-1
如果我想降級到以前的版本,那麼我會運行:
apt-get install python-numpy=1:1.11.0~b2-1
注意:在這種特殊情況下,它可能不起作用,因為我運行 debian sid
aka unstable
,所以舊版本可能不再在 deb 儲存庫中可用。如果您正在運行jessie
並重新安裝 jessie 版本的軟體包作為降級到 jessie-backports 版本,它將按預期工作。
同樣,如果某個套件已被刪除,您可以透過 grep for remove
in找到它及其確切版本/var/log/dpkg.log
。
awk
使用和等標準工具可以很大程度上自動化許多軟體包的批量降級grep
。例如,如果您知道您安裝的 jessie-backports 升級都是在特定日期(例如 2016-02-15)完成的,那麼您可以使用以下命令降級到先前的版本:
apt-get -d -u install $(awk '/2016-02-15 ..:..:.. upgrade / {print $4 "=" $5}'
/var/log/dpkg.log)
(新增換行和縮排以避免水平捲軸)
-d
注意( ) 選項的使用--download-only
。在驗證該命令apt-get install
將執行您想要的操作並且僅執行您想要的操作後,重新執行該命令並刪除該選項。
我還建議awk
首先僅運行該命令本身的一部分,以便您可以準確地看到將重新安裝哪些軟體包和版本的清單。
答案2
聽起來你沒有正確設定/etc/apt/preferences
。以下內容將阻止從 jessie-backports 安裝任何需要安裝的內容(例如向後移植的核心)。如果指定的軟體包需要來自未列出的向後移植的其他軟體包,您仍然會遇到問題。
Package: *
Pin: release n=jessie-backports
Pin-Priority: -1
Package: *
Pin: release n=jessie
Pin-Priority: 1000
# this will allow you to not have to use '-t jessie-backports install'
Package: linux-doc linux-headers-amd64 linux-image-amd64 linux-source
Pin: release n=jessie-backports
Pin-Priority: 1000
如果您希望獲得已安裝的向後移植軟體包的列表,您可以使用以下腳本(或其部分):
chmod a+x name_of_script ./name_of_script > name_of_output_file
#!/bin/bash
RELEASES="jessie-backports"
echo "Searching for installed packages from" >&2
echo $RELEASES | sed s/^/" * "/ | sed s/\|/"\n * "/g >&2
for package in $(dpkg -l | grep -i ^ii | awk '{print $2}')
do
check=$( apt-cache policy $package 2>&1 | grep -i -A 1 "[*]" | egrep $RELEASES )
if [ "$check" == "" ] ; then
echo -ne "." >&2
else
echo -ne "#" >&2
echo
apt-cache policy $package
fi
done
echo >&2
echo
如果您想降級上述腳本列出的任何軟體包,請將以下內容附加到/etc/apt/preferences
:
Package: package1 package2 package3
Pin: release n=jessie
Pin-Priority: 1000
然後運行:
sudo apt-get upgrade
答案3
檢查 /etc/apt/preferences 和 /etc/apt/preferences.d/ 中 apt 的固定配置
您是否有可能添加了自訂固定配置並忘記了它?這是我能想到的唯一能讓 apt 更喜歡向後移植的方法,就像它對你所做的那樣。否則,它只是拉取依賴項 - 您指定的套件需要這些依賴項。
在向後移植儲存庫中的向後移植軟體包發布文件中,官方向後移植已經固定為低於 jessie (100)。你不需要做任何 apt 配置來讓 apt 更喜歡 jessie 而不是 jessie-backports。