Debian Jessie 安装了太多向后移植

Debian Jessie 安装了太多向后移植

我有 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

  1. 尝试将以下内容添加到以下任一/etc/apt/apt.conf文件中/etc/apt/apt.conf.d

    APT::Default-Release "jessie";

  2. 要删除现有的向后移植,您需要获取已安装的向后移植的列表以及它们替换的版本。幸运的是,这些信息可以很容易地从/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 sidaka unstable,所以旧版本可能不再在 deb 存储库中可用。如果您正在运行jessie并重新安装 jessie 版本的软件包作为降级到 jessie-backports 版本,它将按预期工作。

同样,如果某个包已被删除,您可以通过 grep for removein找到它及其确切版本/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。

相关内容