Debian Jessie安装了太多反向端口


9

我有Debian Jessie并添加了backport(根据这些说明):

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"

但是,我现在似乎已经从backports加载了整个系统,并且已经卸载了一个软件包,因为它依赖于确切版本的更新到backports的某个软件包。

所以我的问题是:

  • 我如何首先停止它,以便不再安装任何反向端口?
  • 如何删除现有的反向端口?

注意:这会获取来自反向端口的已安装软件包的列表(以及可以传递给的格式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

警告:

其中一些软件包会自动安装,因此,如果重新安装所有软件包,则这些自动安装的软件包将标记为手动安装。因此在不需要时不删除。

有人对如何解决这个问题有任何想法吗?

Answers:


10
  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版本,它将按预期工作。

同样,如果已删除软件包,则可以通过grepping 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您首先仅单独运行该命令的一部分,以便您可以看到确切的列表,其中列出了将重新安装的软件包和版本。


1
所谓“高度自动化”,是指尽管它几乎可以毫无问题地运行,但它并非/将不会总是完美运行(取决于所涉及的确切软件包及其依赖/建议/冲突/等等)。有可能是你必须手动安装或卸载有一个或两个包apt-getdpkg。只要您不惊慌,就不必担心。包装系统的大多数问题是由于人们的恐慌和反应而造成的,而他们却没有思考....慢慢地思考,然后再采取行动。
cas

他不应该将新的内核程序包固定到backport @cas吗?
Rui F Ribeiro

这不会造成伤害,但不是必须的,并且固定不仅比设置Apt :: Default-Release复杂得多,而且很难正确设置。 apt-get除非您明确告知,否则不会降级已安装的软件包。@richard表示jessie,除非他明确指定,否则他希望默认情况下安装软件包jessie-backports-我认为愿望也适用于内核软件包。
cas

他说,他包括向后移植,以拥有一个可能与我一样的新内核,以便在jessie中具有内核4。
Rui F Ribeiro

1
我猜想,使用stable+的人stable-backports可能比我更关心固定,并且已经投入更多的努力来学习。我倾向于运行unstable并保持我的系统相当定期地与最新sid同步(偶尔会有来自的附加信息experimental),因此几乎不需要固定。我唯一一次使用它的时间是几年前,在过渡到gnome3时,当时我不希望替换自己的gnome2软件包-我记得维护不断变化的软件包列表是PITA。从那以后,我切换到xfce并清除了gnome。
cas

1

听起来您没有正确设置/etc/apt/preferences。以下内容将防止从jessie-backports安装任何东西,而不是告诉安装它的内容(例如backported内核)。如果指定的程序包需要来自未列出的反向端口的其他程序包,您仍然会遇到问题。

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

1

在/ etc / apt / preferences和/etc/apt/preferences.d/中检查固定配置以获取apt

是否有可能您添加了自定义固定配置并忘记了它?这是我能想到的唯一办法,因为它似乎会对您产生影响,因此更倾向于使用backport。否则,它只是拉依赖关系-您指定的程序包需要。

在backports仓库中,官方backports的固定位置(100)低于jessie,在backports软件包Release文件中。您不必进行任何apt配置,即可使apt更偏爱jessie而不是jessie-backports。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.