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


13
> uname -r
FATAL: kernel too old
> cat /proc/cmdline
FATAL: kernel too old

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

请注意,我在具有最小外壳的有限环境中运行。我也尝试过:

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

有什么想法吗?


重启。如果安装了GRUB,也许您可​​以选择解决您的问题。或使用现场CD或USB ...
jcm69

2
我很好奇,你是怎么启动的呢?还有,这是什么?似乎缺少一些关键信息。这是救援壳吗?您能否提供更多详细信息?
Lizardx

如果您安装了铬,请参阅:chrome://system/
GAD3R

是的,这是救援壳。我正在升级许多软件包,包括glibc。运行救援Shell的守护程序仍然存在,并且正在侦听端口,因此我能够进入该端口。
William Pursell '17

1
看来机器已经硬启动(例如,有人按下按钮),这已经成为一个学术问题。这是一个有趣的状态,我希望获得一些硬性数据以寻找所需信息,但是我想得出的结论是:在升级glibc之前,先升级内核并重启。
William Pursell '17

Answers:


19

您已经升级了libc(最基本的系统库),现在没有程序可用。确切地说,没有动态链接的程序起作用。

在您的特定情况下,重新启动应该可以工作。现在安装的libc需要更新的内核,如果重新启动,则应获取该更新的内核。

只要您仍然有一个运行中的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-static(基本的Linux命令行工具的集合,包括一个shell),sash(带有一些额外内置函数的shell),zsh-static(仅一个shell,但是内置了许多方便的工具)。

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

如果重新启动,则应该获得该较新的内核。或黑屏,这似乎更有可能

分配LD_LIBRARY_PATH是一个很好的建议。不幸的是,救援外壳没有内部读取功能,不允许重定向,甚至不允许分配环境变量!我正在提交一个错误,以将env分配到外壳中。
William Pursell '17

6

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

一个编译时间选项

--enable-kernel=version
该选项当前仅在GNU / Linux系统上有用。version参数的格式应为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与我检查的所有二进制文件中的版本相同,因此,不太可能遇到内核版本问题。


5

试试这个:

cat /proc/version

> cat /proc/version FATAL: kernel too old
William Pursell '17

这是一个好主意,但是与不兼容的glibc cat不可用。
William Pursell '17

我同样担心,但是值得一试...
Sven

仅仅是因为猫不可用吗?为什么不使用vim或nano / proc / version呢?
jesse_b

如何:head /proc/version|| tail /proc/version|| sed '1q;d' /proc/version
jesse_b

0

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

strings vmlinuz | grep version

样本输出:

4.9.0-6-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516
(Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.82-1+deb9u3 (2018-03-02)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.