> 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)