> 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)
如果 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与我检查过的所有二进制文件中的一样,这使得内核版本不太可能出现问题。
| 归档时间: |
|
| 查看次数: |
1907 次 |
| 最近记录: |