升级到 Ubuntu 22.04 时发生了这个致命错误。
FATAL ERROR:
Both /bin/systemd-tmpfiles and /usr/bin/systemd-tmpfiles exist.
You can try correcting the errors reported and running again
/usr/lib/usrmerge/convert-usrmerge until it will complete without errors.
Do not install or update other Debian packages until the program
has been run successfully.
dpkg: error when processing package usrmerge (--configure):
subprocess of package usrmerge was installed script post-installation
returned error value 1 Errors found while processing: usrmerge
E: Sub-process /usr/bin/dpkg returned an error code (1)
答案1
关于 usrmerge 实现的一系列错误已被发现:
https://bugs.launchpad.net/ubuntu/+source/usrmerge/+bugs?field.status:list=NEW
usrmerge 存在的原因可以追溯到 20 世纪 70 年代的 unix 历史。例如https://lwn.net/Articles/477467/
usrmerge 包的 README 尝试解释一点(请做好准备,这一切都非常神秘......) https://salsa.debian.org/md/usrmerge/raw/master/debian/README.Debian
坏消息是,如果你打电话
sudo /usr/lib/usrmerge/convert-usrmerge
您必须手动逐步解决所显示的问题。
例如,我在 /bin/evince 和 /usr/bin/evince 中得到了重复的 evince - 比较了两者并删除了 /bin/evince
然后
FATAL ERROR:
Both /lib64/ld-linux-x86-64.so.2 and /usr/lib64/ld-linux-x86-64.so.2 exist.
You can try correcting the errors reported and running again
/usr/lib/usrmerge/convert-usrmerge until it will complete without errors.
Do not install or update other Debian packages until the program
has been run successfully.
注意不要删除 /lib64/ld-linux-x86-64.so.2 - 它将使你的系统无法使用,你将不得不使用 USB 启动盘等进行修复
我必须恢复这个符号链接:
root@my_computer:/lib64# ls -l
total 0
lrwxrwxrwx 1 root root 42 Jul 7 01:23 ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
我最终放弃了这个软件包,等待事情平息,开发人员齐心协力,用普通人能理解的语言来更好地描述如何修复问题:
sudo apt remove --purge usrmerge
答案2
问题不在于 usrmerge 本身,而是 usrmerge 试图解决的问题。当一个软件包在 /lib 中安装库,而另一个软件包在 /usr/lib 中安装同一个库时,就会出现问题。usrmerge 通过符号链接所有内容解决了这个问题,因此不再会对库的安装位置产生混淆。
除此之外,在我的例子中,有一个库具有“不可变”属性,这意味着 usrmerge(或 dpkg!)无法删除或替换该文件。这导致了另一个后果问题(下面的 2)。
这里有三类问题:
- 以上内容:无法修改的文件。您应该使用检查
lsattr
,然后使用删除a
和i
标志chattr -i -a /the/file
- usrmerge 在重组文件系统时会创建临时符号链接。这些文件很容易被
find / -name "*~usrmerge* -delete
- 最后,当出现重复项时,删除它们的方法是检查其中一个是否由管理
dpkg
。其中一个肯定不是,所以你应该删除它:
dpkg -S {/usr,}/lib/a
a:amd64: /usr/lib/a
dpkg-query: no path found matching pattern /lib/a
在这种情况下,/lib/a
可以删除,然后再次运行 convert-usrmerge。只需付出一点努力,您就可以将其转换为一个脚本,该脚本将解析 convert-usrmerge 的输出和上述 dpkg 命令,并反复修复所有问题,我也这样做了。
免责声明:很遗憾,由于其他问题,我需要回滚系统,不再有确切的命令和脚本,所以我凭空写下了上述内容。请谨慎处理此类事情。