尝试升级后,Mono出现故障,无法使用apt。

我在我的Ubuntu Server 18.10上已经安装了mono-complete和mono-devel几个月了,以便运行一些依赖于它的应用程序。我正在使用Mono 5.18.0.225版本。在出现问题之前,我进行了标准的sudo apt update,看到许多需要升级的mono软件包,然后执行了sudo apt upgrade。大部分安装过程都正常进行,但终端不断输出错误信息。无论我尝试做什么,这些几乎无休止的错误信息都会一遍又一遍地打印出来,持续几秒钟。
sudo apt upgrade
sudo apt --fix-broken install
sudo apt remove mono-complete mono-devel
sudo apt autoremove

无法升级或移除软件。如果无法进行升级,我尝试了移除并重新安装,但移除也失败了。
错误信息中提到找不到gdb或lldb。于是我尝试手动编译和安装gdb,因为我无法使用apt... 尝试这样做会要求你运行sudo apt --fix-broken install,结果还是出现了相同的错误。安装gdb-8.2成功了。打印出来的错误信息有些变化,包含了对gdb的引用(因为现在已经安装了),但仍然没有取得任何进展。
  • 首先,为什么mono会出现问题?
  • 为什么尝试移除软件包会产生错误?
  • 应该采取什么措施来修复这个情况?我不想重新安装Ubuntu Server并重新设置所有内容。

关于错误打印出来的内容(在安装gdb之前):

Aborted (core dumped)
E: installing Assembly /usr/share/cli-common/policies.d/libgtk2.0-cil/policy.2.8.gtk-sharp.dll failed
E: Installation of policy.2.8.gtk-sharp with /usr/share/cli-common/runtimes.d/mono failed
* Installing 1 assembly from policy.2.8.pango-sharp into Mono
Stacktrace:

/proc/self/maps:
41308000-41338000 rwxp 00000000 00:00 0
55b153398000-55b1537e1000 r-xp 00000000 08:02 3159129                    /usr/bin/mono-sgen

... cutting some of this out ...

7fb557c3b000-7fb557c88000 r--p 00000000 08:02 3160431                    /usr/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll
Memory around native instruction pointer (0x7fb5556e2c8f):
0x7fb5556e2c7f  20 48 09 d6 41 0f b6 53 05 48 c1 e2 28 48 09 f2   H..A..S.H..(H..
0x7fb5556e2c8f  66 41 0f 38 32 4b 06 66 0f 6f 05 b2 82 49 00 66  fA.82K.f.o...I.f
0x7fb5556e2c9f  0f 38 00 c8 66 48 0f 7e c8 66 48 0f 3a 16 ce 01  .8..fH.~.fH.:...
0x7fb5556e2caf  48 09 c6 48 09 d6 41 0f b6 c2 41 0f b6 53 09 48  H..H..A...A..S.H

Native stacktrace:

    /usr/bin/mono(+0x129f8d) [0x55b1534c1f8d]
    /usr/bin/mono(+0x12a295) [0x55b1534c2295]
    /usr/bin/mono(+0xbfd2f) [0x55b153457d2f]
    /usr/bin/mono(+0x414e8) [0x55b1533d94e8]
    /lib/x86_64-linux-gnu/libpthread.so.0(+0x12dd0) [0x7fb558343dd0]
    /usr/lib/mono/aot-cache/amd64/mscorlib.dll.so(+0x123c8f) [0x7fb5556e2c8f]

Waiting for dumping threads to resume


Debug info from gdb:

mono_gdb_render_native_backtraces not supported on this platform, unable to find gdb or lldb

=================================================================
Got a SIGILL while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries
used by your application.
=================================================================

Aborted (core dumped)
E: installing Assembly /usr/share/cli-common/policies.d/libgtk2.0-cil/policy.2.8.pango-sharp.dll failed
E: Installation of policy.2.8.pango-sharp with /usr/share/cli-common/runtimes.d/mono failed
^[[1mdpkg:^[[0m error processing package mono-gac (--configure):
installed mono-gac package post-installation script subprocess returned error exit status 29
8个回答

我不能百分之百确定这些命令按照这个顺序每次都能解决问题,但这就是发生的事情,我成功地重新安装了Mono,使依赖于它的应用程序再次运行。
sudo apt remove mono-complete mono-devel

有些软件包应该被删除(大约达到15-25%)之前,错误开始出现并且无法再次运行此操作。
sudo apt autoremove

一些软件包在错误开始出现之前应该被移除,否则你将无法再次运行此程序。
sudo apt remove mono-gac mono-runtime-common

在错误开始出现之前,应该删除一些软件包,以免无法再次运行。

sudo apt autoremove

其余的Mono软件包这次应该完全无错误地删除。
之前的命令中肯定有某些软件包是错误的原因,一旦它被删除,错误就停止发生,剩下的可以顺利删除。
最后,重新安装Mono。

1但是我无法运行apt remove,因为它显示dpkg被中断了,我必须手动运行sudo dpkg --configure -a,但是这个命令只会导致上述错误。 - Aaron Franke
对我来说非常重要(在18.04.1-Ubuntu上)的是sudo dpkg --force-all -P ca-certificates-mono,因为sudo apt --fix-broken install和其他任何“修复”方法都没有起作用,所以我以同样的方式删除了所有的mono。特别是像sudo dpkg --force-all -P mono-common mono-develsudo dpkg --force-all -P mono-4.0-gac mono-gac这样的东西,在更新、升级以及使用'--fix-broken install'和'autoremove'进行修复后,清理了剩下的部分。最终得分:$ mono --version Mono JIT编译器版本6.0.0.319(tarball Fri Aug 9 16:23:57 UTC 2019).... - user309383

好的,如果你已经绝望到几乎尝试了所有方法,除了那个似乎是一个常见但可悲的解决方案——清除硬盘并重新安装操作系统...
我不确定是如何修复我的电脑的,也不确定为什么会修复成功,但以下是我最后尝试的几个事情,不知何故产生了积极的结果:
sudo dpkg --remove --force-remove-reinstreq mono-complete  

它迅速返回到命令提示符,没有任何消息。它是否真正执行了任何操作呢?谁知道。¯\(ツ)/¯
sudo dpkg --remove --force-remove-reinstreq mono-devel  

它很快就返回到命令提示符,没有任何消息。它真的做了什么吗?谁知道呢。¯\_(ツ)_/¯
sudo dpkg --remove --force-remove-reinstreq mono-gac  

它说由于依赖关系无法移除它。
sudo dpkg --remove --force-remove-reinstreq mono-runtime-common  

它说由于依赖关系无法移除它。

然后我尝试使用Synaptic软件包管理器来移除mono-devel。它被标记为未安装(见上文),但提供了完全移除选项。选择并应用该选项。结果产生了一大堆熟悉的dpkg错误并且失败了。

我尝试使用它来移除mono-runtime-common,同样也产生了一大堆熟悉的dpkg错误并且失败了。

然后我运行了以下命令:

sudo apt-get purge mono-gac  

这次不知为何,它有点儿、有些地起了作用。它卸载了很多东西,但在很多事情上出现了错误。哎呀,至少它取得了某种程度的进展。
sudo apt-get update  
sudo apt-get upgrade  

现在只显示了三个我之前无法升级的项目,因为Mono崩溃了。现在我成功地将它们升级了。
然后,我按照Ubuntu 18.04上的Mono安装说明进行操作,链接如下: https://www.mono-project.com/download/stable/#download-lin
然而,在第2步时,我安装的是mono-complete而不是mono-devel。
安装过程没有出现错误,并且预编译了一些内容。重启后,我的3个基于Mono的应用程序中有2个恢复正常运行。第三个应用程序我只需要进行原地重新安装,也在重启后恢复正常。
我真诚地希望你能从上述胡言乱语中找到一些帮助,并祝愿你度过愉快的假期,新年快乐以及其他美好的事情。 :)

apt policy mono-complete mono-devel 的结果显示我在 18.04 上都已经安装好了,并且 mono 在 18.04 上也正常工作,所以我怀疑问题出在包管理方面。mono-complete 和 mono-devel 包仍然可以在 18.10 和 19.04 的默认软件仓库中找到。 - karel
感谢您的回复,但我不确定在尝试了昨晚的方法后是否能够尝试这些建议。我想要记录一下,当我最初运行sudo apt remove mono-complete mono-develsudo apt autoremove时,一些软件包在出现错误之前已经被删除了。昨晚我运行了sudo apt remove mono-gac mono-runtime-common,然后更多的软件包被删除了,然后令人惊讶的是,当我之后运行了sudo apt autoremove,没有出现任何错误,其余的软件包都被删除了,我认为mono已经成功完全卸载了。 - Matthew Wright
然而,重新安装Mono是下一步,我希望它能顺利进行,以便我可以再次运行这些应用程序。 - Matthew Wright
我不确定是一个还是多个软件包引起了问题,但在第二次apt remove之前删除的任何内容都必须修复了这个问题。知道具体是哪个软件包引起的问题会很方便,以便将来再次修复。然而,我不知道这个问题有多容易重现。 - Matthew Wright
是的,重新安装 Mono 成功了,我的应用程序现在正常运行! - Matthew Wright
太好听到这个消息了,马特。圣诞快乐! :D - gorT

我在我的Linux Mint Box 18.3 Sylvia上遇到了同样的问题。不得不使用Timeshift重新安装系统。到目前为止,我所做的只是从存储库中删除mono ppa,并且暂时可以更新/升级软件包。 我等待新的mono修复以重新激活存储库。我知道这不是问题的解决方法,但至少它是一种应对问题的方式,等待真正的极客们来解决。

谢谢你的回复!我之前没有听说过或使用过timeshift,但我会去看一下。我昨晚成功地从我的系统中卸载了mono。这是你所指的工具吗? 不过这是服务器版本,只能通过命令行使用。我不确定是否可以通过命令行界面来使用它。 - Matthew Wright

我遇到了类似的问题。在我的情况下,mono-devel 依赖于 mono-roslyn,而出于某种原因,mono-roslyn 又依赖于 mono-devel。所以单独删除这些软件包并不能解决问题,但是以下方法可以:
sudo dpkg --remove --force-remove-reinstreq mono-roslyn mono-devel

当你遇到这些sgen错误时,你可以尝试重新构建“提前编译”缓存。它将重新编译本地架构的库版本。对我来说效果很好。
# as root
mono --aot /usr/lib/mono/4.5/mscorlib.dll
for i in /usr/lib/mono/gac/*/*/*.dll; do mono --aot $i; done

这是对我有效的方法。我从我的Bash历史记录中整理出来,所以可能不完整。
首先,我删除了软件包列表。
sudo rm /etc/apt/sources.list.d/mono-official-vs.list
sudo rm /etc/apt/sources.list.d/mono-official-vs.list.save 

之后,我运行了以下内容:
sudo dpkg --configure -a

这会输出一份有问题的单个依赖项列表,最后附带一条类似于以下消息的信息(您看到的包可能会有所不同):
Errors were encountered while processing:
 mono-runtime
 libmono-i18n4.0-cil
 libmono-i18n-west4.0-cil
 libmono-corlib4.5-cil

接下来,我使用sudo dpkg --purge --force-all (packages...)命令将它们移除。
sudo dpkg --purge --force-all mono-runtime libmono-i18n4.0-cil  libmono-i18n-west4.0-cil libmono-corlib4.5-cil

然后我运行了以下内容:
sudo apt-get autoremove

这个命令会输出一个包含大量与mono相关的依赖项问题的列表。
我继续运行sudo dpkg --purge --force-all (packages...),然后再次运行sudo apt-get autoremove,会出现更多有错误的包。我一直重复这个过程,直到sudo apt-get autoremove没有更多错误为止。
之后,我运行了sudo apt clean

对于任何新来的人,当你来到这里发现什么都不起作用时,这个方法对我很有帮助。
dpkg --list|grep mono|awk '{ print $2 }'|xargs sudo dpkg --force-all -P 
apt --fix-broken install

在升级Ubuntu 21.10上的Mono后,我遇到了类似的情况,当我尝试安装和使用Pinta(一款图像处理应用程序)时。
从Mono 6.8更新到最新的6.12后,我无法进行apt update、apt install、apt autoremove或apt --fix-broken install。
以下的删除命令帮助我移除了所有与Mono相关的软件包:
sudo apt remove mono-runtime ca-certificates-mono mono* libmono* libglib2.0-cil libgtk2.0-cil

请小心移除最后两个库 - 到目前为止,我没有遇到任何问题,但我不知道是否会有任何副作用。

  • 相关问题