执行“do-release-upgrade”后,我的笔记本电脑(Thinkpad T460)无法正常启动。启动时鼠标出现,但无法移动。当 Kubuntu 的登录屏幕出现时,我无法登录,因为按键不被接受(看起来好像根本没有键盘)。我可以启动恢复系统,但那里没有网络(即使从友好的控制台启动它也是如此)。
启动后,外部键盘和鼠标不工作,但在恢复模式下其工作方式与内置键盘类似。
经过两天的恢复工作后,我终于找到了问题所在。
某些组件正在寻找 libffi.so.6,但它已被 libffi.so.7.1.0 取代。设置指向 v7 的符号链接为我修复了损坏的笔记本电脑,现在它运行正常。
我如何才能找出哪个程序引用了这个旧库?当我尝试在恢复中启动网络管理器时,我在日志中找到了引用,但我无法确定哪个程序真正失败了。
答案1
当我从 20.04 升级到 22.04 时遇到了同样的问题,并且再次出现 libffi。
以下是我采取的一些步骤,希望对其他人有所帮助。如果不小心,最终可能会毁掉你的系统,因此提前备份是个好习惯(尽管没有网络可能会很麻烦)。
当系统在启动过程中停止并显示失败的服务(例如热守护进程、网络管理器或其他服务)时。
启动恢复内核(在启动徽标/BIOS 消息后按住 Shift),选择“启动选项”,然后选择列表中的第二行,即新内核的恢复。这通常可以得到一个菜单,您可以在其中启动 root shell。
检查您的 init ram 磁盘。我曾经遇到过这样的问题:从 18.04 到 20.04,我的桌面上的 initrd 是空的(0 字节)。您会在这里找到很多提示,教您如何重建它以适合您的安装。
检查/var/log/syslog
指向失败的动态库的条目grep "error while loading
/usr/lib
如果是这种情况,请在或中查找类似命名的库,/lib
其中cd /lib;find . -iname "*libxxx*" -print
xxx 是缺失库的名称
从现有库到缺失库建立符号链接。在我这里是ln -s libffi.so.8.1.0 libffi.so.6
。我仍然需要建议,你认为这里更好的方法是什么。所描述的链接是新的链接,用于旧的链接,或者从网络获取旧的库并将其与新的库一起复制。
如果有多个,请重复,然后重新启动
您的系统现在应该可以正常启动了。然后我遇到了 Plasma 崩溃的问题,很多程序无法启动,但抱怨共享库中缺少符号。这是库的版本不匹配,程序加载了过时的库,无法找到它正在寻找的符号。当然,所有其他提示,如和,也sudo apt install --fix-broken
应该sudo dpkg --configure -a
考虑。
我现在使用 libpango 作为示例,请检查您的错误消息。
我尝试开始filezilla
错误信息如下/lib/x86_64-linux-gnu/libpango-1.0.so.0: undefined symbol: g_memdup2
该符号并非在 libpango 中缺失,而是在 libpango 尝试加载的库中缺失。你的朋友在ldd
这里。
进入ldd /lib/x86_64-linux-gnu/libpango-1.0.so.0
在以下列表中查找 中的库/usr/local/lib
,这对我来说已经存在好几次了。将这些 usr-local-libs 移开。在我的例子中,有一个过时的 glib(不知道它来自哪里)sudo mv libglib-2.0.so* /tmp/oldlibs
。
对每个发生的错误重复此操作。
我不知道我是否特别不走运,但这是由于 libffi 而导致的第二次升级失败......有什么提示吗?