我昨天遇到了这个问题,因为有人在操作系统版本升级期间重新启动了。由于混乱的规模非常大(约1500个软件包),上述的任何方法都无法解决。
为了恢复,我进入了/var/log/apt/history.log,并查看了最后一条记录,其中包含了三个非常长的列表,描述了在操作系统升级失败时正在尝试的操作。它由三个列表组成:“升级:”、“安装:”、“删除:”,格式如下:
Upgrade: package1:arch (old, new), package2:arch (old, new),
...
把这三个列表带到你最喜欢的正则表达式兼容编辑器中,用换行符替换括号到逗号之间的内容。对于“Remove:”部分,在末尾添加一个“-”,这样你就得到了类似以下的列表:
Install:
speech-dispatcher-espeak-ng:amd64
fdisk:amd64
libgoa-backend-1.0-1:amd64
...
Upgrade:
speech-dispatcher-audio-plugins:amd64
ubuntu-settings:amd64
libmpc3:amd64
...
Remove:
qtdeclarative5-ubuntu-ui-toolkit-plugin:amd64-
python-sip:amd64-
gstreamer1.0-plugins-ugly-amr:amd64-
...
"-" 是一个关键的教训,因为除非你告诉它同时安装和移除,否则你将无法解决许多依赖循环的问题。
保留这个文件的副本以供以后参考,但是制作一份新副本并整理它:删除文件中的所有额外行,只保留
package:arch
行。
使用生成的文件 packages.txt 运行 apt 命令,如下所示。
xargs -a packages.txt sudo apt install
这个命令将包含系统在出现故障之前打算执行的所有添加/删除操作,并应该代表一个一致的集合。
假设它完成了,你可以使用
sudo apt install -f
和
sudo apt dist-upgrade
来完成任何被忽略的内容。
最后,通过创建一个只包含“Install:”列表的新列表,将它们传递给
apt-mark auto
来将这些软件包标记为自动安装(升级选择了它们,而不是你)。
xargs -a installed.txt sudo apt-mark auto
希望这能帮助到其他有人觉得整个系统都出问题的人。