
を使用しており、CentOS-6.5
デフォルトのカーネルはです2.6.32-431.11.2.el6.x86_64
。2.6.32
そのカーネルをダウンロードしてビルドしました(下/lib/modules/2.6.32
)。
私は簡単なプログラムのためのモジュールを書いたhello world
。このプログラムは、次のような状況で動作します。
Makefile:(/lib/modules/$(shell uname -r)/build
デフォルトカーネル)
$ sudo insmod hello.ko
$ dmesg
module inserted..
hello world..
次のような場合、私のプログラムは機能しません。
Makefile:(/lib/modules/3.2.32/build
新しいカーネル)
$ sudo insmod hello.ko
insmod: error inserting 'hello.ko': -1 Invalid module format
dmesg:
hello: disagrees about version of symbol module_layout
両方のシナリオを試しましたが、次のmodprobe
エラーが表示されます。
FATAL: Module hello not found.
カーネルを使って2.6.32
モジュールをコンパイルできますか?
答え1
Linuxカーネルに含まれるデータ構造のレイアウトは、バージョンごとに異なるだけでなく、コンパイルオプションによっても異なります。したがって、カーネルモジュールをコンパイルするときは、カーネルソースコードのヘッダファイルだけでなく、カーネルのコンパイル時に生成されたいくつかのヘッダファイルも必要です。単にカーネルソースコードを解くだけでは不十分です。
で構築されたカーネルの場合、バージョンCONFIG_MODVERSIONS
番号は異なる場合がありますが、データ構造のレイアウトは同じでなければなりません。このオプションはUbuntuカーネルで有効になります。このオプションを使用すると、ヘッダーに加えて正しいModule.symvers
ファイル用にモジュールをコンパイルする必要があります。ほとんどのディストリビューションと同様に、CentOSにはコンパイルされたカーネルヘッダーと同じパッケージにこのファイルが含まれています。 CentOSカーネルヘッダーパッケージは、kernel-headers
コンパイル中のカーネルと一致するバージョンをインストールする必要があります。また、見ることができますカーネルパッケージの概要CentOSドキュメントと完全なカーネルソースコードは不要wikiから。
ビルドされていないカーネルの場合CONFIG_MODVERSIONS
(自分のカーネルをコンパイルした場合かもしれません)、モジュールをロードするときに確認するのは簡単なバージョンチェックです。解凍されたカーネルソースコードを取得し、実行.config
中のカーネルのコンパイル中に使用されたカーネルソースコードをコピーしてから実行できますmake modules_prepare
。カーネルに適用されたパッチがバイナリ互換性に影響しないことを確認するのはユーザーの責任です。
答え2
2.6.32 カーネルをどこでダウンロードしましたか?
2.6.32-431.11.2.el6.x86_64
CentOSを使用している場合、RedHatはパッチ付きカーネルを使用するため、CentOSリポジトリからカーネルソースコードをインストールするだけです。また、構築したカーネルソースツリーの構成が、実行中のカーネルの構成と全く同じであることを確認してください。
config-*
通常、ディレクトリにファイルがあるか、または/boot/
からダウンロードできます/proc/config.gz
。
CentOSの公式HowToを参照することもできます。