为什么可升级的套餐没有进行升级呢?

执行sudo apt update命令结束时的结果是
Reading package lists... Done
Building dependency tree       
Reading state information... Done
2 packages can be upgraded. Run 'apt list --upgradable' to see them.

执行apt list --upgradable给了我以下结果
Listing... Done
onionshare/bionic,bionic 2.2.ppa1-1 all [upgradable from: 2.1-1]
ring-all/unknown 20190927.2.c2af011~dfsg1-1 amd64 [upgradable from: 20190629.2.c07ef23~dfsg1-1]

但是执行sudo apt upgrade命令并不能升级可升级的软件包:
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

为什么会这样?可能是未满足的依赖关系吗? 我可以手动升级列出的软件包吗?如果可以,应该如何操作?
更新:请查看此 pastebin以获取完整的记录。

2输出中有类似于“kept back”的内容吗? - Kulfy
不,基本上就是这样了。我在帖子中添加了一个链接,里面有完整的文字记录。 - marianoju
4如果你运行sudo apt full-upgrade会发生什么呢? - pomsky
@pomsky 和使用 sudo apt upgrade 一样。 - marianoju
我怀疑这里的问题是他们正在使用一个随机的夜间ppa (https://dl.jami.net/ring-nightly/ubuntu_19.04 ring InRelease)。如果你无法解决apt安装失败的问题,那么采取这种方法是非常危险的。我建议使用ppapurge来清除它,并找到一个稳定的ppa添加(如果你信任该来源,则可以从jami.net获取)。 - pbhj
@pbhj 我无法验证这个解释,因为时间已经过去,而且我已经继续前进了,但还是感谢你对“ring-all”软件包提供意见。升级“onionshare”失败是因为无法安装“python3-flask-httpauth”依赖项(这在GitHub上已经讨论过了,请参阅问题#1052)。 - marianoju
1@pbhj 我注意到你在这个问题上有一个有趣的旗标被拒绝了(不是我拒绝的)。我对你的旗标表示同情,因为这些回答似乎没有提供任何特别有价值的东西(尤其是得票最高的那个,我注意到在之前访问此页面时我曾经投反对票)。不过,我确实检查了匿名反馈,发现反馈都很积极,所以我觉得删除整个页面可能不太好。此外,更重要的是,你的评论暗示你有一个有用的见解,也许可以发展成一个答案? :) - Zanna
1marianoju,也许你可以进一步完善你的回答(顺便说一下,它已经收到了很多匿名用户的积极反馈,所以它应该是很好和有帮助的)。你可以具体谈谈这个问题,并从GitHub的问题中摘录一些总结和引用,因为这个问题并不容易理解。另外,你是否能够让问题,尤其是标题更加具体一些呢? - Zanna
5个回答

在这种情况下,“可升级的软件包”实际上是不可升级的,因为它们存在未满足的依赖关系。
复现方法:尝试更新相关软件包(参见如何在Ubuntu中更新特定软件包),执行命令sudo apt-get install --only-upgrade <packagename>。如果有任何软件包存在未满足的依赖关系,升级将因为以下原因失败: E: 无法纠正问题,您有损坏的软件包。 要升级这些软件包,需要解决未满足的依赖关系。有关详细信息,请参阅“添加PPA后如何解决未满足的依赖关系”“修复无法纠正问题,您有损坏的软件包”

1在GitHub上已经讨论了无法安装的依赖项python3-flask-httpauth的根本问题(请参见#1052)。 - marianoju
2可能有些情况是这样的,但对我来说不是。我运行了sudo apt full-upgradesudo apt-get dist-upgrade命令,两者都报告有5个软件包被保留,但当我运行sudo apt install并输入软件包名称时,它们都成功更新了,没有任何问题。 - iGEL
1我遇到了同样的问题,所以我手动运行了sudo apt install --only-upgrade <packagename>命令来逐个升级每个软件包,没有出现错误。我不明白为什么我可以手动升级软件包,但不能使用sudo apt upgrade命令... - Célestin Taramarcaz
在第一个可升级的软件包(r-base)上运行sudo apt-get install --only-upgrade <packagename>,这样apt upgrade就有了一些余地来递归修复其余的软件包,并且还会执行autoremove操作。谢谢。 - undefined

你可以运行以下命令行来升级所有可升级的软件包及其依赖项:
sudo apt-get dist-upgrade

9命令 sudo apt-get dist-upgrade 不会升级所有可升级的软件包及其依赖关系。对我来说,输出结果是:正在构建依赖关系树 正在读取状态信息... 完成 正在计算升级... 完成 以下软件包被保留: ring-all 0 个软件包已升级,0 个新安装,0 个要移除,1 个未升级。```(与 `sudo apt upgrade` 和 `sudo apt full-upgrade` 相同) - marianoju

在您的情况下,缺失的软件包名称不一定与此示例中的相同。但这展示了如何解决问题。无论您在输出中看到什么名称,这种技术都适用。因此,请将实际文件名(例如ubuntu-advantage-tools或libnfsidmap1)替换为您的计算机所需升级的内容。
所有这些命令都需要以root身份运行。我们可以通过使用sudo在终端中更改用户而无需实际登录为root来实现这一点。要做到这一点,请键入:
sudo su

...然后在提示时输入您的root密码。su部分将切换用户。当它后面没有其他内容时,默认切换到root用户。现在您有权限大幅度搞砸计算机,所以请小心使用'root'!

否则,您必须在每个命令前面键入sudo。一些Linux纯粹主义者认为sudo su是错误的,但我向您保证,这与为每个命令重复键入sudo完全相同。

运行:

apt update

然后

apt upgrade

...你可能会得到类似的输出:

1 upgraded, 0 newly installed, 0 to remove and 8 not upgraded.

...显示了8个未升级的软件包。

其他与更新相关的命令可能会提供类似的消息:

The following packages have been kept back: evolution evolution-common evolution-plugin-bogofilter evolution-plugin-pstimport evolution-plugins libevolution libnfsidmap1 ubuntu-advantage-tools

你需要修复这些列出的可能缺少依赖关系导致无法简单升级的软件包。没人想到在apt升级中加入子程序来自动处理这些问题。所以我们只能自己解决。
要列出这些软件包,你应该运行:
apt list --upgradable

你应该手动安装列出的那些软件包。
apt install evolution evolution-common evolution-plugin-bogofilter evolution-plugin-pstimport evolution-plugins libevolution libnfsidmap1

请注意,您可以只输入所有软件包的名称,并在它们之间用空格分隔,而不是逐个运行apt install命令。您可以直接从先前未升级的输出中将此列表复制到终端中。在处理终端中的内容时,您必须右键单击并选择“复制”或“粘贴”。Ctrl C和Ctrl V键盘命令无法在终端输出上起作用。
当然,这样做可能仍然无法修复所有问题。您可能会得到以下输出:
6 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.

或者

2 packages can be upgraded. Run 'apt list --upgradable' to see them.

你可以运行以下命令:
apt-get --with-new-pkgs upgrade

...显示剩余的包裹。这应该输出类似的内容
The following packages have been kept back: libnfsidmap1 ubuntu-advantage-tools

然后你只需要以某种不可思议的方式手动逐个安装它们。在我的情况下,我输入了:
apt install ubuntu-advantage-tools

并且

apt install libnfsidmap1

再次,这里安装的名称应该用您的计算机显示为未升级的名称进行替换。
这样做应该可以解决之前在列表命令中无法安装的剩余两个问题。 运行 apt update 然后 apt upgrade 应该会输出:
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

完成!

你可能还想运行:

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

然后

sudo apt autoremove

正如我在其他地方看到的建议一样。但仅凭这个还不能解决我的问题。

1某些不可思议的原因可能与最新版本的Ubuntu的阶段性更新有关。 - Artur Meinild
1我建议只需使用sudo来运行每个命令,而不是使用sudo su。无论如何,要使用的密码都是自己的密码,而不是root的密码。 - Zanna

在使用sudo apt update && sudo apt upgrade进行更新和升级后,这是一种始终有效的正确解决方案:

sudo apt install <list of packages kept back>

2这在大多数情况下可能有效,但当“可升级的软件包”实际上由于存在未满足的依赖关系而无法升级时,则不适用,请参见上文。没有“始终有效的正确解决方案”。 - marianoju

我建议运行以下命令:
sudo apt-get upgrade

这对我有用。它会告诉你有多少个软件包被升级,有多少个新的被安装,有多少个被删除,以及有多少个没有被升级(保留下来)。
我有一些被保留下来的软件包,所以在阅读了this post之后,该帖子提供了多种解决方案,我运行了以下命令来安装那些被保留下来的软件包:
sudo apt-get --with-new-pkgs upgrade

这还将包括哪些不再需要的软件包,并且可以被移除。根据输出的指示,我运行了以下命令来移除它们:
sudo apt autoremove

最后,我再次运行了第一段代码,只是为了确保一切都清晰,并获得输出结果"0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded."

没有任何软件包被拦截。请查看我在Oct 18 '19 at 18:08上的评论。升级失败是因为有损坏的软件包。 - marianoju
Michael Crenshaw列出的任何方法都无法解决潜在问题(即#1052)。 - marianoju