如何解决更新问题(Ubuntu 20.04)

我已经完成了对Ubuntu 20.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:   
gdb gir1.2-peas-1.0 libpeas-1.0-0 libsmbclient libwbclient0 samba-libs 
0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded.

我尝试运行了多个命令来清除损坏的软件包/依赖项,包括:
sudo apt clean
sudo apt autoclean
sudo apt autoremove

似乎什么都不起作用(甚至dist-upgrade也没有任何效果),当我尝试手动更新软件包时,出现了以下消息:
sudo apt-get install gdb

The following packages have unmet dependencies:
 gdb : Depends: libpython3.8 (>= 3.8.0~a1) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

我尝试了很多其他方法,但都没有任何结果,所以我想知道我的选择是什么。
运行apt cache policy gbd libpython3.8会产生以下输出:
gdb:
  Installed: 8.1-0ubuntu3.2
  Candidate: 9.1-0ubuntu1
  Version table:
     9.1-0ubuntu1 500
        500 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages
 *** 8.1-0ubuntu3.2 100
        100 /var/lib/dpkg/status
libpython3.8:
  Installed: (none)
  Candidate: 3.8.2-1ubuntu1
  Version table:
     3.8.2-1ubuntu1 500
        500 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages

1请在问题中添加apt-cache policy gdb libpython3.8的输出。 - N0rbert
这个答案解决了我的问题 - 在我升级到20.04之后,类似的情况是使用deadsnakes:https://stackoverflow.com/a/61703923/1773904 - Ian Clark
5个回答

我也遇到了这个问题,以下是我解决的方法:
首先,请记住以下两点:
- 在完成所有步骤之前,请不要重新启动您的计算机。 - 在重新启动之前,请不要忘记通过执行以下命令更新您的grub: `sudo update-grub2`
问题出在升级Ubuntu从18.04到20.04时,系统没有替换每个实例的bionic为focal:它没有将libpython3.8-stdlib(3.8.2-1+bionic1)替换为libpython3.8-stdlib(= 3.8.2-1ubuntu1.1)。 因此,解决方案是手动替换它 :) 具体步骤如下:
1. 将依赖于该库的软件包名称保存在一个文本文件中,以便稍后重新安装它们。 运行命令:`sudo apt-get autoremove libpython3.8-stdlib` 会显示一条消息,列出所有这些软件包的名称:
(( `apg apparmor apport apport-gtk ...xserver-xorg-video-vmware xwayland yelp yelp-xsl` ))
将它们复制到一个文本文件中,然后点击“是”来卸载bionic版本的libpython3.8-stdlib。
2- 通过以下方式安装focal版本:
sudo apt-get install libpython3.8-stdlib

3- 现在逐个安装保存在文本文件中的软件包:您可以创建一个脚本文件,如下所示:

sudo apt-get install gir1.2-gck-1
sudo apt-get install gir1.2-gcr-3
sudo apt-get install gir1.2-gdm-1.0
sudo apt-get install gir1.2-geoclue-2.0
sudo apt-get install gir1.2-gnomebluetooth-1.0

... ))

别忘了安装ubuntu-desktop,如果它不在软件包文本文件中 sudo apt-get install ubuntu-desktop(非必需)

4- 更新你的grub,运行: sudo update-grub2

5- 最后重新启动你的电脑

就这些 :)


谢谢,我在将18.04 Bionic升级到20.04 Focal后遇到了类似的问题。之前我从deadsnakes PPA安装了适用于Bionic的libpython3.8,而这个步骤帮助我修复了系统。 - ogrisel
谢谢,我遇到了与gcc和build-essential类似的问题。我必须手动从/var/lib/apt/status中删除带有ubuntu1~18.04的软件包。注意:如果你这样做,请不要忘记备份文件。 - ahmy
有用户报告说这在20.04版本上导致他们的互联网无法工作,但我没有更多的细节。如果在特定情况下使用可能会有害的话,也许可以在答案中添加更详细的警告信息。 - Zanna
第三步可以简化,因为apt可以处理一个包的列表:sudo apt-get install package-x package-y。详见https://askubuntu.com/questions/874611/installing-multiple-packages-at-the-same-time。 - nevrome

我也因为使用了deadsnakes ppa而遇到了这个问题,但是通过几个简单的步骤解决了它:
# sudo apt list --upgradable
  Listing... Done
  gdb/focal-updates 9.2-0ubuntu1~20.04 amd64 [upgradable from: 8.1.1-0ubuntu1]
  gir1.2-peas-1.0/focal,focal 1.26.0-2 amd64 [upgradable from: 1.22.0-2]
  libpeas-1.0-0/focal,focal 1.26.0-2 amd64 [upgradable from: 1.22.0-2]
  libsmbclient/focal-updates,focal-security 2:4.11.6+dfsg-0ubuntu1.6 amd64 [upgradable from: 2:4.7.6+dfsg~ubuntu-0ubuntu2.21]
  libwbclient0/focal-updates,focal-security 2:4.11.6+dfsg-0ubuntu1.6 amd64 [upgradable from: 2:4.7.6+dfsg~ubuntu-0ubuntu2.21]
  samba-libs/focal-updates,focal-security 2:4.11.6+dfsg-0ubuntu1.6 amd64 [upgradable from: 2:4.7.6+dfsg~ubuntu-0ubuntu2.21]

# python3 --version
  Python 3.8.8

# sudo apt list | grep python3.8
  ==> few entries were pointing to bionic

# sudo rm -f /etc/apt/sources.list.d/deadsnakes-ubuntu-ppa*

# sudo apt-get install gdb/focal gir1.2-peas-1.0/focal libpeas-1.0-0/focal python3.8/focal python3.8-minimal/focal libpython3.8/focal libpython3.8-minimal/focal libpython3.8-stdlib/focal

# sudo apt update

# sudo apt list --upgradable

# sudo apt upgrade

# sudo apt upgrade samba-libs

# sudo apt list --upgradable 
  Listing... Done
# sudo apt update
  Reading package lists... Done
  Building dependency tree       
  Reading state information... Done
  All packages are up to date.

# sudo apt list | grep python3.8
  ==> all entries should point to focal

我最终陷入了类似的情况,因为我在18.04中安装了来自deadsnakes PPA的Python 3.8,所以系统的Python 3.8软件包被阻止更新。我不得不运行以下命令:
sudo apt-get purge libpython3*

为了摆脱deadsnakes软件包。

注意!正如穆罕默德·阿里警告的那样,这将删除大部分Ubuntu软件包并使您的系统无法使用。在重新安装系统之前,请不要重新启动。

然后我用以下方式重新安装了系统

sudo apt install ubuntu-desktop

一切都在重新开始后顺利运行。

只是提醒一下,包裹被拦截的另一个可能原因是手动拦截:
使用sudo apt-mark hold (package)可以拦截一个软件包:它会阻止任何原因导致其升级。如果你想要安装某个软件包的旧版本,可以使用dpkg命令,但通常一旦你运行更新,它会被更新到最新版本;apt-mark hold会阻止这种情况发生,但在Ubuntu升级时也会阻止其升级,除非先移除这些拦截。
使用apt-mark showholds可以列出所有当前的拦截。
使用apt-mark unhold (package)取消拦截一个软件包:系统可以再次更新这些软件包。
我已经使用过这个两次;一次是为了在我的Ubuntu 20.04系统上重新安装和保留Squid 3.xx,因为Squid 4.xx对我的使用情况不起作用。在一个ARM Chromebook上,它配备了很好的NVIDIA驱动程序,甚至支持CUDA,只要你保留其定制的Linux内核和Ubuntu 16.04时代的X服务器..;我升级到18.04时,保留了大约十几个与X相关的软件包...嘭!完全更新的Ubuntu 18.04,带有Ubuntu 16.04的X组件,所以NVIDIA驱动程序继续运行,甚至还有CUDA。如果需要的话,保留功能非常方便。

我今天成功升级了一个系统,并在过程中注意到了一些事情,我想分享一下...
我将一个从18.04升级到20.04的系统进行了几次(大约5次)更新和升级。在最后两次更新中,我收到通知说还有更多的更新以及文件上传的指示,这是我之前所做的更新之外的内容。在终端中执行最后一条"sudo apt upgrade"命令时,我收到了大量升级的通知。它没有明确指出这些升级是针对20.04的,但事实证明它们确实是。为了使这个过程顺利进行,需要将更新设置为"适用于任何版本"。这台机器现在运行正常!
至于第二台电脑,我选择了清除所有数据。我只备份了数据到另一个磁盘,并插入了一个启动盘,按照指示进行操作。在遇到多次错误消息提示存在损坏的软件包和缺失的文件后,我决定采取这种方式来结束挫败感。
第三台机器是一台旧机器。这台笔记本已经从14.04升级到16.04,再到18.04(都是LTS版本)。有很多遗留的东西,包括一些i386文件和程序。这台机器无法升级!随机出现的错误信息包括一个文件未升级;7个文件未升级;12个文件未升级;只能从最新支持的版本升级到开发版本;进入软件更新器(GUI)时,我会收到要加载的额外文件的通知,有时是3个,有时是6个,以及介于两者之间的任何数字;还会收到关于我的互联网连接或服务器有问题的通知;等等。其中很多步骤与我在第一台电脑上经历的过程相同。
而且,这是我的猜测... 20.04版本是如此新,有如此多的人下载它,以至于服务器无法处理这么多流量(我尝试了其他服务器,结果相同)。更新和升级是逐步传输到我的电脑的。以下是我所做的: - 在终端中 - sudo update && upgrade,然后sudo do-release-upgrade -d - 在更新器(GUI)中 - 点击设置,然后点击更新,交替将更新设置为“...任何新版本”,然后设置为“...长期支持版本”;也尝试使用不同的服务器。

这真是让人感到沮丧,但我想我们能做的唯一事情就是继续与计算机合作,输入相同的命令;交替使用终端和更新程序(图形用户界面),直到最终达到圣杯...然后升级!


我们不应该猜测... - mook765
你应该感激有人在维护你使用的软件。 - Lucas Bustamante
猜测并非一个好主意。 20.04版本非常新,很多人正在下载,服务器无法应对如此多的流量。 这并不是一个明智的推断。 - rodude123