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

uname 损坏:如何确定当前运行的内核?
> uname -r
FATAL: kernel too old
> cat /proc/cmdline
FATAL: kernel too old

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

请注意,我正在使用最小 shell 的有限环境中运行。我也尝试过:

> sh -c 'read l < /proc/version; echo $l'
FATAL: kernel too old
> dd if=/proc/version
FATAL: kernel too old

有什么想法吗?

答案1

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

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

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

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

read v </proc/version; echo $v
echo $(</proc/version)               # in zsh/bash/ksh

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

LD_LIBRARY_PATH=/old/lib /old/lib/ld-linux.so.2 /old/bin/uname

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

busybox-static uname
sash -c '-cat /proc/version'
zsh-static -c '</proc/version'

答案2

如果 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

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

答案3

尝试用这个:

cat /proc/version

答案4

使用strings命令从文件中提取可打印信息vmlinuz

strings vmlinuz | grep version

示例输出:

4.9.0-6-amd64 ([email protected]) (gcc version 6.3.0 20170516
(Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.82-1+deb9u3 (2018-03-02)

相关内容