“以下软件包已被保留:”为什么以及如何解决?


876

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

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

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


17
严格来讲,我想说的是警告,而不是错误。
卡扎尔克

Answers:


902

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

如果对已安装的某个软件包的依赖关系发生了更改,因此必须安装新的软件包才能执行升级,则该软件包将列为“保留”。

谨慎的解决方案1:

根据Pablo的回答,您可以运行sudo apt-get --with-new-pkgs upgrade,它将安装保留的软件包。

这样的好处是不会将保留的软件包标记为“手动安装”,这可能会迫使更多的用户干预(请参阅注释)。

如果Pablo的解决方案适合您,请对其进行投票。如果没有,请评论出了什么问题。

谨慎的解决方案2:

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

激进的解决方案:

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

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

因此,如果您发现自己在“谨慎解决方案”不起作用的地方,dist-upgrade 可能会起作用...但是您最好还是多了解一点有关APT的知识,并通过安装和删除“手动”解决依赖性问题根据具体情况打包。

可以把它想象成是修理汽车……如果您有时间并且用扳手得心应手,则可以通过阅读和自行进行修理来放心。如果您感到幸运,可以和表哥下车,dist-upgrade并希望她知道她的东西。


180
由于这是一个公认的答案,因此,确实需要更新以警告dist-upgrade在稳定的系统上使用,如以下其他许多答案所指出的那样。我个人认为有一个更简单/更安全的答案需要推广:apt-get install <pkgs列表>
2012年

7
Cas,我是否应该补充一点,在稳定的系统上运行dist升级可能很危险?为什么那样危险呢?(老实说我不太了解。)
迈克尔·克伦肖

17
有一个“ 服务器故障”答案可以更详细地说明dist-upgrade。我认为,有必要澄清一下(可能并不危险),它可能会升级整个系统,而这可能超出了用户的期望/期望,即在OP示例中,他们想知道为什么阻止了gimp。
2012年

19
请注意,这sudo apt-get dist-upgrade也可以删除软件包。因此,最好在运行时始终在同意更改之前检查更改列表sudo apt-get dist-upgrade
伊利亚·卡根

6
@EliahKagan我可以补充一点,甚至apt-get upgrade可以删除软件包吗?否则,如果存在版本冲突,它将始终这样做。考虑一下llvm3.6vs. llvm3.6v5(“ v5”表示它是使用编译的gcc 5)。这两个不能共存,只能将两者之一保留在系统上。因此,是的,dist-upgrade也可能会删除一些软件包,但这不仅dist-upgrade是要这样做。在某些情况下upgrade也是如此。
语法错误

500

每当您从命令中收到apt-get upgrade消息时

The following packages have been kept back:

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

apt-get install <list of packages kept back>

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


3
当以这种方式保留软件包并手动执行时apt-get upgrade <list of packages>,如果我重做apt-get upgrade,它将列出有问题的软件包,不再需要,可以apt autoremove用来删除它们,然后这样做,然后最后一个apt-get upgrade不再列出为退缩...很奇怪。有什么想法吗?
cram2208

是否apt-get install在必要时也删除软件包以解决过时的依赖性情况,还是您必须运行单独的apt-get remove命令来完成升级过程的那一部分?
Michael Crenshaw

@ cram2208我相信这是预期的行为。daccess-ods.un.org daccess-ods.un.org“自动安装且不再需要”的软件包是升级软件包的先前版本,现在不再需要。apt autoremove然后删除这些未使用的依赖项。
亚历克斯

3
如果升级需要安装新软件包,则该软件包将“保留”。首先考虑使用:sudo apt-get --with-new-pkgs upgrade这会不会有造成包的侧面影响到被标记为手动安装
升--marc升

@ mac9416是的。
jarno

174

apt-get dist-upgrade 对稳定的环境有害,

  1. 错误的source.list设置,最终导致ubuntu损坏。
  2. 您可能会将整个应用程序升级到不需要的版本。

用例:阻止内核升级,您只想升级内核,不想升级整个发行版。

处理不放回包裹的更好方法:

sudo aptitude

如果您保留了软件包,则应该在列表顶部看到可升级软件包。

  • 在该列表上按+
  • 打两次G
  • 如果询问,回答debconf的东西
  • 按返回继续
  • 按Q
  • 按是

您保留的软件包已安装。


34
apt-get dist-upgrade仅当您的存储库中有错误的存储库时,它才是危险的/etc/apt/sources.list*。很高兴知道可以dist-upgrade升级所有软件包,但是使用默认存储库就可以了。使用dist-upgrade可能会很危险,因为您可能会错过安全更新。
Flimm

6
apt-get dist-upgrade可以删除和添加软件包,但这并不危险。如果sources.list文件有问题,任何软件包安装命令都可能导致严重损坏!常规apt-get upgrade命令将从已启用的任何软件源安装任何软件包。dist-upgrade这样不是唯一的。此外,aptitude在未修正bug 831768apt-get dist-upgrade的发行版中,使用至少在amd64上执行任何操作比运行危险得多。
伊利亚·卡根

对我来说,(打开运行X的本地计算机)打开突触并强制进行软件包的升级比较容易。由于某种原因,它似乎根本没有出现在突触中所描述的位置。
djvs 2015年

3
sudo aptitude safe-upgrade
桑福德,

146

为什么不尝试这个Unix SE答案

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

这允许安装新软件包。它会告诉您要安装哪些软件包,并在实际执行安装之前提示您。

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

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


20
+1,因为它没有引起将软件包标记为手动安装的副作用。
ctrl-alt-delor

1
请注意曾经读过我的评论的人:不会有标记为手动安装的副作用是一件好事。我喜欢这个答案。
ctrl-alt-delor

1
是。apt-mark auto <pkg>仅应将软件包标记为已自动安装(此处为手册页)。
巴勃罗

11
由于某些原因,sudo apt-get --with-new-pkgs upgrade这些软件包仍显示为“保留”。没有错误讯息。
富兰克林于

2
只是想补充一下,对于许多最新的debian 9.6服务器实例,这是绝对安全的解决方案。谢谢您,Pablo,因为我很幸运地预先在登台环境中测试了其他选项,并且由于--with-new-pkgs包含在内,可以管理许多符合安全标准的服务器,从而为将来的常规软件包管理提供了更为清晰的结果。的确,应该对UNIX SE答案进行投票!
朱利叶斯

34

通常,有两个原因可能会导致您看到此消息。

如果通过升级程序sudo apt-get upgrade会导致添加或删除软件包,则该程序将被保留。sudo apt-get dist-upgrade在这种情况下,您可以使用,然后它将提供添加或删除其他程序的功能。

这很普遍,通常不是问题。有时候(尤其是在Ubuntu alpha中),a dist-upgrade会删除许多其他程序,在这种情况下,您可能想取消它。

如果程序依赖于不可用的软件包或版本,则该程序将被保留。在这种情况下,您实际上什么也不能做,只能等待,因为该软件包基本上是可卸载的。当软件包乱序添加到存储库,重命名软件包或软件包停止提供虚拟软件包时,可能会发生这种情况。


5
有没有一种方法可以确定所保存的软件包是否需要一个无法安装的依赖项,或者是否因为其他软件包所依赖而被保留。我有很多保留的软件包,我相信这两种情况都可能适用于我的系统。
杰克

谢谢,第二个原因是我的问题。甚至apt-get dist-upgrade拒绝安装它。明智地检查该软件包表明它取决于一个不可用的软件包。我想我得等。
jlh

23

您也可以尝试:

sudo aptitude safe-upgrade

它比full-upgrade(原名dist-upgrade)更安全,因为“除非未使用软件包,否则不会删除它们”。

来自man aptitude

安全升级

将已安装的软件包升级到最新版本。除非未使用已安装的软件包,否则不会删除已安装的软件包/.../除非提供--no-new-installs命令行选项,否则可以安装当前未安装的软件包来解决依赖性。


21

这些软件包很可能会被推迟,因为它们的安装会导致依赖性不一致。这可能是由于您正在使用活动开发ppas下的存档,或者是因为您使用的镜像未完全更新。

在最后一种情况下,只需等待,解决依赖关系后,将在下次安装它。

编辑:

还有另一种可能性,如果对它们进行固定或固定,则可能会将其保留下来。


在不知道他进行过apt-get升级或apt-get dist-upgrade(替代能力)的情况下,您将这种可能性基于什么?
andol 2010年

这是支持问题和错误中最常出现的问题
txwikinger 2010年

同意 您可能应该等待并检查apt_preferences。这通常是由于开发档案库引起的,这些档案中的可用软件包依赖关系和可用软件包的依赖关系变化非常快。等待他们安顿下来,您可能根本不需要dist-upgrade。如果您仍然愿意dist-upgrade,请在继续之前查看要安装的新软件包和要删除的软件包。
Umang

这是我的情况,因为我使用dist-upgrade收到了“保留”消息
Postadelmaga,2012年

如果此问题是由于apt偏好设置(固定)造成的,我发现重新安装保留的软件包对我有帮助:apt-get install --reinstall <packages>
tanius

9

这通常是因为程序包已添加依赖项,并且升级不想在未经许可的情况下为您添加依赖项。

如果您运行:

sudo apt-get install gimp gimp-data libgegl-0.0-0 libgimp2.0

然后,应将新版本及其新依赖项一起安装。


升级特定的程序包(及其依赖项),而无需进行dist-upgrade的承诺(风险)。
约翰·米

8

这对我有用

sudo aptitude full-upgrade

甚至aptitude upgrade为我工作。
Bibhas 2013年

Ubuntu 14.04我正在使用,但我没有aptitude命令行
艾哈迈德·哈姆迪(Ahmed Hamdy)2015年

apt-get dist-upgrade给了我同样的信息,但这为我解决了。我有一个正在中断另一个程序包升级的程序包。我不需要我安装的那个,所以aptitude full-upgrade给了我删除它的选项,以便它可以升级其他所有东西。
f.ardelian

6

我发现如果版本略有不同,aptitude在升级软件包方面会做得更好。我有这样的情况:

me@compy:/etc/apt$ apt-cache policy gzip
gzip:
  Installed: 1.3.5-15
  Candidate: 1.3.5-15+etch1
  Version table:
     1.3.5-15+etch1 0
        500 http://archive.debian.org etch/main Packages
 *** 1.3.5-15 0
        100 /var/lib/dpkg/status

这使得apt-get可以阻止更新,但是aptitude更新它就可以了。我不确定使用哪种算法来确定是否应更新软件包。我猜这两个有相同的版本,只是一个不同的“限定词”。但是无论如何,apt-get不会更新它,但是能力会更新。


4

在我看来,与Linux标头和内核相关的软件包被保留下来。我通过尝试解决在通知区域中带有红色感叹号且无法更新软件包的问题来解决此问题。

要解决它,我既不必使用dist-upgrade也不可以使用手册apt-get install xxx

我所做的和提供的帮助非常简单明了

sudo apt-get update
sudo apt-get autoremove
sudo apt-get autoclean
sudo apt-get upgrade

我必须手动确认Grub更新及其配置。

然后我只是在计算机上工作了一段时间,然后再次出现了标准更新对话框,最后包括带有内核及相关内容的“ Ubuntu base”部分。执行更新没有任何麻烦,我再也看不到任何保留的软件包。

另外,请务必记住,包括内核更新在内的那些* buntu更新对休眠非常敏感 -我已经多次遇到此问题,并且始终可以通过重新启动计算机并执行上述步骤来解决此问题。

所以也许这足够了?

(此处描述的情况与我2015年12月底的Xubuntu 15.10有关)


3

当发布新内核时,我遇到了这个问题。(可能是因为启用了不稳定的更新。)我发现最简单的安装方法是通过Ubuntu的图形安装程序(update-manager)。


2

我使用突触碰到了这个问题,因为它似乎挂起了,并尝试解决此问题,因此我重新启动并再次尝试。

然后,我在软件包中发现了一条提示性消​​息,其中包含一些安装后说明。

我必须点击“ 详细信息 ”,然后在阅读消息后单击“ q ”退出,然后一切正常进行。


2

这看起来像是重新安装保留软件包的正确方法:

apt-get install --reinstall libjpeg-progs

libjpeg-progs从Ubuntu 14.04升级到16.04后停滞不前,这至少对我有用。我确定您可以对其他任何保留的应用程序执行相同的操作,例如gimp

来源:https//ubuntuforums.org/showthread.php?t = 2321702&p = 13476183#post13476183


1
您也可以不使用它--reinstall
jarno

有趣的是,它删除了libjpeg-turbo-progs软件包。
jarno

1

实际上,您需要的开关是dselect-upgrade安装/删除涉及的特定软件包集的依赖项。


1

我已经阅读了所有帖子,发现有很多有趣的解释。我正在尝试所有这些,但没有完全完成任何结果。我无法升级mysql-utilities的问题。更新是由系统提出的。因此,我想展示一些步骤。当然,我会在某些时候重复上述所有帖子。这是我的错误,是的,我是通过已经存在的帖子找到的,但是接下来我该怎么办? 在此处输入图片说明

下一步是:

sudo apt-get --purge remove mysql-utilities

我们可以在下面的图像中看到的结果。我删除软件包并通过命令检查此内容:

sudo apt-get -f install

结果-好!后来我正确安装了此新版本的软件包。 在此处输入图片说明

这样,我认为可以为更多的新人提供帮助,因为有了其他软件包,我们可以执行相同的步骤。

一次,很抱歉,当我在某些地方重复其他帖子时。


5
请不要将屏幕截图用于终端文本,因为这样会使Google无法搜索,也无法被某些人读取。而是将终端文本粘贴到您的答案中,选择该文本,然后{}在编辑器中按按钮以正确设置其格式。
Chai T. Rex

@ ChaiT.Rex感谢您的发言,我将其视作未来。
Vasyl Lyashkevych

1

Ubuntu 18.04提供了更新的简化语法apt,可通过它代替apt-get

sudo apt full-upgrade

sudo apt upgrade用于从通过sources.list(5)配置的源安装系统上当前安装的所有软件包的可用升级。如果需要满足依赖关系,将安装新的软件包,但是永远不会删除现有的软件包。如果升级软件包需要删除已安装的软件包,则不会执行此软件包的升级。

sudo apt full-upgrade 执行升级功能,但如果需要升级整个系统,则将删除当前安装的软件包。

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.