从 Debian 10 升级到 11 后无法恢复 systemd:“未定义符号:seccomp_api_get”

从 Debian 10 升级到 11 后无法恢复 systemd:“未定义符号:seccomp_api_get”

我一周前从 Debian 10 升级到 11。

重复出现的错误是:

symbol lookup error: /lib/systemd/libsystemd-shared-247.so: undefined symbol: seccomp_api_get

它在启动系统时导致内核恐慌。

我不得不切换到 systemv 作为 init 系统。

现在,当我尝试恢复时systemd,出现以下错误:

root@nas:~# apt install systemd
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
systemd is already the newest version (247.3-6).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
1 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] 
Setting up systemd (247.3-6) ...
systemd-machine-id-setup: symbol lookup error: /lib/systemd/libsystemd-shared-247.so: undefined symbol: seccomp_api_get
dpkg: error processing package systemd (--configure):
 installed systemd package post-installation script subprocess returned error exit status 127
Errors were encountered while processing:
 systemd
needrestart is being skipped since dpkg has failed
E: Sub-process /usr/bin/dpkg returned an error code (1)

我的版本:

root@nas:~# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:    11
Codename:   bullseye
root@nas:~# uname -a
Linux nas 5.10.0-9-amd64 #1 SMP Debian 5.10.70-1 (2021-09-30) x86_64 GNU/Linux

答案1

我找到了解决方案这里

我有同样的问题。原因是 /lib/x86_64-linux-gnu 中的一些旧库,尤其是 libseccomp。它们不受包管理(即它们不属于任何包)。 […]

新的 libseccomp2 软件包将新的二进制文件发送到 /usr/lib/x86_64-linux-gnu,但运行时加载程序在 /lib/x86_64-linux-gnu 中加载旧版本。 […]

如果我从 /lib/x86_64-linux-gnu 中删除旧的库,问题就会消失

所以我删除了这些文件:

rm /lib/x86_64-linux-gnu/libseccomp.so.2*

我能够切换回 Systemd。

如何检查

您可以使用dpkg --search它会判断文件或目录是否是孤立的:

dpkg --search /lib/x86_64-linux-gnu/libseccomp.so.2
dpkg-query: no path found matching pattern /lib/x86_64-linux-gnu/libseccomp.so.2

您可以使用以下命令查找没有相应包的文件cruft-ng如何查找不属于任何包的文件?


更新

有一个/lib/x86_64-linux-gnu/和之间的符号链接/usr/lib/x86_64-linux-gnu/,因此在决定删除某些内容之前先在两个目录中进行搜索。

我运行它dpkg --search /usr/lib/terminfo/,它返回了一个警告,所以我删除了该目录,它破坏了 CLI,因为它实际上是ncurses-base.

搜索/usr/lib//lib/给出拥有该目录的包。

dpkg --search /usr/lib/terminfo/ /lib/terminfo/
dpkg-query: no path found matching pattern /usr/lib/terminfo/
ncurses-base: /lib/terminfo

因此,我们不能依赖一次搜索来dpkg --search决定删除数据是否安全。

相关内容