包裹为何被扣留?

包裹为何被扣留?

我刚刚为 GIMP 的开发版本添加了一个 PPA 存储库,但出现此错误:

$ apt-get update && apt-get upgrade
...
The following packages have been kept back:
  gimp gimp-data libgegl-0.0-0 libgimp2.0

为什么?我该如何解决这个问题,以便我可以使用最新版本而不是现在的版本?

答案1

根据debian-administration.org 上的一篇文章

如果您安装的某个软件包的依赖项发生了变化,从而必须安装新的软件包才能执行升级,那么该软件包将被列为“保留”。

(请注意,这不是您看到“包裹已被扣留”消息的唯一原因。另一个原因是可以启用分阶段更新,并且尚未为您的机器发布更新。)

谨慎解决方案1:

帕布罗的回答,您可以运行sudo apt-get --with-new-pkgs upgrade <list of packages kept back>,它将安装保留的软件包。

这样做的好处是不会将保留的包标记为“手动安装”,这可能会迫使更多用户干预(参见评论)。

如果 Pablo 的解决方案对您有用,请点赞。如果不行,请评论哪里出了问题。

谨慎解决方案2:

谨慎的解决方案是运行sudo apt-get install <list of packages kept back>。在大多数情况下,这将为保留的软件包提供成功升级所需的内容。

积极的解决方案:

更积极的解决方案是运行sudo apt-get dist-upgrade,这将强制安装这些新的依赖项。

dist-upgrade 可能相当危险与升级不同它可能消除软件包来解决复杂的依赖关系情况。与您不同,APT 并不总是足够聪明,无法知道这些添加和删除是否会造成严重破坏。

因此,如果你发现“谨慎的解决方案”不起作用,dist-upgrade 可能工作...但您最好多学习一些有关 APT 的知识,并通过逐个安装和删除软件包来“手动”解决依赖问题。

想象一下修理汽车……如果你有时间并且擅长使用扳手,那么通过阅读相关知识并自己进行修理,你会感到安心。如果你觉得自己很幸运,你可以把车交给你的表妹,dist-upgrade希望她知道该怎么做。

答案2

每当你收到来自命令的apt-get upgrade消息

The following packages have been kept back:

然后要升级一个或所有保留的软件包,而不进行分发升级(dist-upgrade如果我没记错的话,这就是所做的)是发出以下命令:

apt-get install <list of packages kept back>

这将解决保留的问题并会要求安装其他软件包等,正如其他答案所解释的那样。

也可以看看为什么使用 apt-get upgrade 而不是 apt-get dist-upgrade?

答案3

我回答过类似的问题这里,进一步解释该问题背后的原因。


尝试这个 Unix SE 答案

sudo apt-get --with-new-pkgs upgrade

这允许安装新的软件包。它将让您知道要安装哪些软件包,并在实际安装之前提示您。

apt命令友好的替代方案apt-get) 分享此选项。

使用apt install <pkg>将标记 pkg 为“手动安装”!!要将其再次标记为“自动安装”,请使用apt-mark auto <pkg>(另请参阅子命令showmanual)。更多信息关于这个答案

答案4

我添加这个答案是因为我对其他答案的处理方式不满意为什么问题的一部分来了解正在发生的事情并选择适当的行动方案。

希望这可以帮助人们避免盲目apt dist-upgrade绝望地奔跑!

包裹为何被扣留?

据我所知,包裹在海关扣留期间有三类原因apt upgrade

1)被标记为保留

apt-mark做这个

sudo apt-mark hold <package>

hold 用于将软件包标记为保留,这将阻止软件包被自动安装、升级或删除。

要列出所有标记为暂停的包裹或查明包裹是否被暂停,请使用:

apt-mark showhold
apt-mark showhold <package>

要取消对软件包的保留并允许其升级:

sudo apt-mark unhold <package>

2)apt检测依赖项变化

最好的权威信息来源我发现这个被标记为过时的,但它说:

[保留] 表示这些软件包有新版本,但由于某种原因无法安装。可能的原因是依赖关系中断(所依赖的软件包没有可供下载的版本)或新的依赖关系(自上一个版本以来,该软件包开始依赖于新软件包)

这将告诉您该软件包的当前版本和候选升级版本:

$ apt list <package>

# example output:
vim/bionic-updates,bionic-security 2:8.0.1453-1ubuntu1.4 amd64 [upgradable from: 2:8.0.1453-1ubuntu1.3]
N: There are 2 additional versions. Please use the '-a' switch to see them.

使用当前版本(例如2:8.0.1453-1ubuntu1.3)和新版本(例如2:8.0.1453-1ubuntu1.4),我们可以使用以下方法找出已更改的依赖项apt show

apt show <package>=<old version> <package>=<new version>

# example:
apt show vim=2:8.0.1453-1ubuntu1.3 vim=2:8.0.1453-1ubuntu1.4

(或者直接用来apt show -a查看所有版本,但我认为这会使版本比较变得更加困难)

重点是DependsRecommends软件包列表。如果保留的软件包的新版本中有这些列表中的新软件包,apt 将不会自动升级它。

此时,有两种方法可以升级保留的软件包。请注意,以下两种解决方案都有适当的参数,可以避免错误地将软件包从“自动安装”更改为“手动安装”。

  1. 要升级软件包并安装任何新的“推荐”软件包(即,就像新安装的一样apt install <package>,使用--with-new-pkgs

    sudo apt upgrade --with-new-pkgs <package>
    

    (提示:--dry-run在执行操作之前先添加以查看会发生什么)

  2. 升级包无需安装任何新添加的“推荐”软件包, 使用--only-upgrade

    sudo apt install --only-upgrade <package>
    

3)分阶段更新

分阶段更新

一旦更新发布到 -updates,更新就会分阶段进行,以便逐步向不断扩大的 Ubuntu 用户子集提供更新。此过程使我们能够自动监控回归问题,并在发现任何问题时停止更新过程。

您可以使用以下方式检查分阶段更新:

sudo apt -o APT::Get::Always-Include-Phased-Updates=true upgrade --dry-run

这里有更多信息:什么是分阶段更新?为什么 Ubuntu 使用它们?

案例研究:升级docker-ce软件包

升级docker-ceUbuntu 18.04 上的软件包是我最初来到这里的原因,所以我认为有一个完整具体的例子会很有趣。

$ sudo apt upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
  docker-ce
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

$ apt list docker-ce
Listing... Done
docker-ce/bionic 5:20.10.3~3-0~ubuntu-bionic amd64 [upgradable from: 5:19.03.12~3-0~ubuntu-bionic]
N: There are 34 additional versions. Please use the '-a' switch to see them.

好吧,让我们看看是什么阻碍了它docker-ce

$ apt show docker-ce=5:19.03.12~3-0~ubuntu-bionic docker-ce=5:20.10.3~3-0~ubuntu-bionic
Package: docker-ce
Version: 5:19.03.12~3-0~ubuntu-bionic
Priority: optional
Section: admin
Maintainer: Docker <[email protected]>
Installed-Size: 107 MB
Depends: docker-ce-cli, containerd.io (>= 1.2.2-3), iptables, libseccomp2 (>= 2.3.0), libc6 (>= 2.8), libdevmapper1.02.1 (>= 2:1.02.97), libsystemd0
Recommends: aufs-tools, ca-certificates, cgroupfs-mount | cgroup-lite, git, pigz, xz-utils, libltdl7, apparmor
Conflicts: docker (<< 1.5~), docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package
Replaces: docker-engine
Homepage: https://www.docker.com
Download-Size: 22.5 MB
APT-Manual-Installed: yes
APT-Sources: https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
Description: Docker: the open-source application container engine
 Docker is a product for you to build, ship and run any application as a
 lightweight container
 .
 Docker containers are both hardware-agnostic and platform-agnostic. This means
 they can run anywhere, from your laptop to the largest cloud compute instance and
 everything in between - and they don't require you to use a particular
 language, framework or packaging system. That makes them great building blocks
 for deploying and scaling web apps, databases, and backend services without
 depending on a particular stack or provider.

Package: docker-ce
Version: 5:20.10.3~3-0~ubuntu-bionic
Priority: optional
Section: admin
Maintainer: Docker <[email protected]>
Installed-Size: 121 MB
Depends: containerd.io (>= 1.4.1), docker-ce-cli, iptables, libseccomp2 (>= 2.3.0), libc6 (>= 2.8), libdevmapper1.02.1 (>= 2:1.02.97), libsystemd0
Recommends: apparmor, ca-certificates, docker-ce-rootless-extras, git, libltdl7, pigz, xz-utils
Suggests: aufs-tools, cgroupfs-mount | cgroup-lite
Conflicts: docker (<< 1.5~), docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package
Replaces: docker-engine
Homepage: https://www.docker.com
Download-Size: 24.8 MB
APT-Sources: https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
Description: Docker: the open-source application container engine
 Docker is a product for you to build, ship and run any application as a
 lightweight container
 .
 Docker containers are both hardware-agnostic and platform-agnostic. This means
 they can run anywhere, from your laptop to the largest cloud compute instance and
 everything in between - and they don't require you to use a particular
 language, framework or packaging system. That makes them great building blocks
 for deploying and scaling web apps, databases, and backend services without
 depending on a particular stack or provider.

版本5:20.10.3~3-0~ubuntu-bionic已添加docker-ce-rootless-extras为新的推荐依赖项。我希望 apt 能更有帮助,并简单地建议安装它或其他东西,而不是留给我旧版本...无论如何,这里有 2 个可能的修复方法(用于--dry-run说明目的):

$ sudo apt upgrade --with-new-pkgs --dry-run docker-ce
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  docker-ce
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Inst docker-ce [5:19.03.12~3-0~ubuntu-bionic] (5:20.10.3~3-0~ubuntu-bionic Docker CE:bionic [amd64])
Conf docker-ce (5:20.10.3~3-0~ubuntu-bionic Docker CE:bionic [amd64])

$ sudo apt install --only-upgrade --dry-run docker-ce
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  docker-ce-rootless-extras
Recommended packages:
  slirp4netns
The following NEW packages will be installed:
  docker-ce-rootless-extras
The following packages will be upgraded:
  docker-ce
1 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Inst docker-ce [5:19.03.12~3-0~ubuntu-bionic] (5:20.10.3~3-0~ubuntu-bionic Docker CE:bionic [amd64])
Inst docker-ce-rootless-extras (5:20.10.3~3-0~ubuntu-bionic Docker CE:bionic [amd64])
Conf docker-ce (5:20.10.3~3-0~ubuntu-bionic Docker CE:bionic [amd64])
Conf docker-ce-rootless-extras (5:20.10.3~3-0~ubuntu-bionic Docker CE:bionic [amd64])

相关内容