uname 已损坏:如何确定当前正在运行的内核?

Wil*_*ell 13 linux glibc

> uname -r
FATAL: kernel too old
> cat /proc/cmdline
FATAL: kernel too old
Run Code Online (Sandbox Code Playgroud)

/boot 中有 3 个 *.vmlinuz-linux 文件。如何确定当前正在运行哪个内核?

请注意,我在有限的环境中运行,使用的外壳最少。我也试过:

> sh -c 'read l < /proc/version; echo $l'
FATAL: kernel too old
> dd if=/proc/version
FATAL: kernel too old
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

Gil*_*il' 19

您已经升级了 libc(最基本的系统库),现在没有程序可以运行。准确地说,没有动态链接的程序有效。

在您的特定情况下,重新启动应该有效。现在安装的 libc 需要更新的内核,如果您重新启动,您应该获得更新的内核。

只要您还有一个正在运行的 shell,通常就有一种方法可以恢复,但如果您没有计划,这可能会很棘手。如果您没有外壳,那么通常除了重新启动之外没有其他解决方案。

在这里,您可能无法在不重新启动的情况下恢复,但您至少可以轻松找出正在运行的内核。只需使用一种/proc/version不需要外部命令的读取方式即可。

read v </proc/version; echo $v
echo $(</proc/version)               # in zsh/bash/ksh
Run Code Online (Sandbox Code Playgroud)

如果您仍然有旧 libc 的副本,您可以使用它运行程序。例如,如果旧的 libc 在,/old/lib并且您有与旧的 libc 一起使用的可执行文件/old/bin,您可以运行

LD_LIBRARY_PATH=/old/lib /old/lib/ld-linux.so.2 /old/bin/uname
Run Code Online (Sandbox Code Playgroud)

如果您有一些静态链接的二进制文件,它们仍然可以工作。我建议为此类问题安装统计链接的系统实用程序(但您必须在问题开始之前执行此操作)。例如,在 Debian/Ubuntu/Mint/... 上,安装一个或多个busybox-static(基本 Linux 命令行工具的集合,包括一个 shell)、sash(带有一些额外内置函数的 shell)、zsh-static(只是一个 shell,但是内置了很多方便的工具)。

busybox-static uname
sash -c '-cat /proc/version'
zsh-static -c '</proc/version'
Run Code Online (Sandbox Code Playgroud)


ilk*_*chu 6

如果 glibc 运行在比编译库支持的内核旧的内核上,这似乎是 glibc 抛出的错误。错误信息在DL_SYSDEP_OSCHECK(FATAL)宏中sysdeps/unix/sysv/linux/dl-osinfo.h

一个编译时选项

--enable-kernel=version
此选项目前仅在 GNU/Linux 系统上有用。版本参数应采用 XYZ 形式,并描述生成的库预期支持的 Linux 内核的最小版本。版本号越高,添加的兼容性代码越少,代码运行速度越快。

因此,似乎出于某种原因,您运行的系统带有旧内核,但已安装的 glibc 不再支持旧内核。如果没有关于它是什么系统的信息,很难说你是如​​何得到它的,但人们可能会认为如果库更新但内核没有更新,这可能会发生。

file 似乎显示了可执行文件或库所需的最低版本(但当然您需要一个工作库来运行它):

/lib/x86_64-linux-gnu/libc-2.23.so: ELF 64-bit LSB shared object, x86-64, ..., for GNU/Linux 2.6.32, stripped
Run Code Online (Sandbox Code Playgroud)

在我的半最新 Debian 系统上,所需的内核版本2.6.32与我检查过的所有二进制文件中的一样,这使得内核版本不太可能出现问题。


Sve*_*ven 5

试试这个:

cat /proc/version
Run Code Online (Sandbox Code Playgroud)