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