Debian Jessie 安装了太多的向后移植

ctr*_*lor 9 debian apt backports

我有 Debian Jessie 并添加了向后移植(根据这些说明):

echo "deb http://http.debian.net/debian jessie-backports main contrib non-free" | sudo tee /etc/apt/sources.list.d/backports.list
Run Code Online (Sandbox Code Playgroud)

(我这样做是为了获得更新的内核,因为我需要它,用于笔记本电脑中的某些硬件。)

说明说什么都不应该发生,除非我明确要求反向移植包。例如apt-get -t jessie-backports install "package"

但是,我现在似乎从 backports 加载了我的整个系统,并且卸载了一个软件包,因为它取决于更新到 back-ports 的某些内容的确切版本。

所以我的问题:

  • 我如何首先停止它,以便不再安装 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
Run Code Online (Sandbox Code Playgroud)

警告:

一些包是自动安装的,所以如果你重新安装它们,那么这些自动安装的包将被标记为手动安装。因此在不需要时不会删除。

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

cas*_*cas 10

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

    APT::Default-Release "jessie";

  2. 要删除现有的向后移植,您需要获取安装了哪些向后移植以及它们替换了什么版本的列表。幸运的是,这些信息可以很容易地从/var/log/dpkg.log

eggrep ' 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
Run Code Online (Sandbox Code Playgroud)

这表示在 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
Run Code Online (Sandbox Code Playgroud)

注意:在这种特殊情况下,它可能无法工作,因为我运行 debian sidakaunstable所以旧版本可能不再在 deb 存储库中可用。如果您正在运行jessie并重新安装软件包的 jessie 版本作为降级到 jessie-backports 版本,它将按预期工作。

同样,如果一个包已被删除,您可以通过搜索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)
Run Code Online (Sandbox Code Playgroud)

(添加换行和缩进以避免水平滚动条)

注意-d( --download-only) 选项的使用。在您确认apt-get install将执行您想要的操作并且仅执行您想要的操作后,重新运行该命令并删除该选项。

我还建议先单独运行awk该命令的一部分,以便您可以查看将重新安装的确切软件包和版本的列表。