uname 破損: 現在実行中のカーネルを確認するには?

uname 破損: 現在実行中のカーネルを確認するには?
> 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

どんなアイデアがありますか?

答え1

libc(最も基本的なシステムライブラリ)をアップグレードしましたが、現在どのプログラムも実行できません。正確に言えば、プログラムは動的接続なしで動作できます。

場合によっては、再起動すると機能します。これでインストールされたlibcには最新のカーネルが必要になり、再起動すると取得できます。

実行中のシェルがある限り、通常は回復する方法がありますが、準備ができていない場合は回復が難しい場合があります。シェルがなければ、通常は再起動以外の解決策はありません。

再起動せずにここから回復することはできませんが、少なくともどのカーネルが実行されているかを簡単に確認できます。/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/... では 1 つ以上をインストールします。busybox-static(シェルを含むデフォルトのLinuxコマンドラインツールバー)ウエストバンド(いくつかの追加の組み込み機能を備えたシェル)、zsh - 静的(ただシェルですが便利なツールがたくさん組み込まれています)。

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

答え2

これは、ライブラリがサポートするようにコンパイルされたカーネルより古いカーネルで実行されている場合、glibcで発生するエラーのようです。DL_SYSDEP_OSCHECK(FATAL)マクロのエラーメッセージsysdeps/unix/sysv/linux/dl-osinfo.h

持つコンパイル時オプションそのために:

--enable-kernel=version
このオプションは現在GNU / Linuxシステムでのみ利用可能です。バージョンパラメータは、生成されたライブラリがサポートすることが期待されるLinuxカーネルの最小バージョンを記述するXYZ形式でなければなりません。バージョン番号が高いほど、互換性コードが少なくなり、コードを迅速に取得できます。

したがって、何らかの理由で古いカーネルを使用するシステムを実行しているようですが、インストールされている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)

関連情報