次のカーネルをインストールしています。
[root@localhost ~]# uname -r
2.6.32-573.el6.x86_64
そして、次のカーネルソース:
linux-2.6.32-573.1.1.el6.x86_64
自分のカーネル用に、そのカーネルソースを使用してカーネルモジュールをコンパイルしようとしています。
カーネルソースのMakefileで、EXTRAVERSION設定を編集しました。
[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# cat Makefile | grep "EXTRAVERSION ="
EXTRAVERSION = 2.6.32-573.el6.x86_64
そして、次のコマンドを使用してモジュールをコンパイルしました。
[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# make M=~/hw/
LD /root/hw/built-in.o
CC [M] /root/hw/hello_world.o
Building modules, stage 2.
MODPOST 1 modules
CC /root/hw/hello_world.mod.o
LD [M] /root/hw/hello_world.ko.unsigned
NO SIGN [M] /root/hw/hello_world.ko
しかし、インストールしようとすると、次のエラーが発生します。
[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# insmod ~/hw/hello_world.ko
insmod: error inserting '/root/hw/hello_world.ko': -1 Invalid module format
そしてmodinfoの出力は:
[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# modinfo ~/hw/hello_world.ko
filename: /root/hw/hello_world.ko
license: GPL
srcversion: A8BB878B88F36D3A046026C
depends:
vermagic: 2.6.32-573.el6.x86_64 SMP mod_unload modversions
カーネルソースをインストールしなくても、現在のカーネル用にモジュールをコンパイルできますか?
追加情報:
OS:CentOS6.7最小。配布バイナリ。
このガイドに従った: http://wiki.centos.org/HowTos/I_need_the_Kernel_Source
linux-2.6.32-573.1.1.el6.x86_64のソースをここからダウンロードしました。
http://vault.centos.org/6.7/updates/Source/SPackages
特定のカーネルのソースをダウンロードするだけでよいことはわかっていますが、最終的には、ソースが見つからないカーネルバージョン(まだ2.6.32)のモジュールをビルドしたいので、それが必要な理由です。このようにするために。
実際、ここで気にすることが2つあります。
実行中のカーネルバージョンは、使用しているソースと同じですか。以前にコンパイルされたカーネルは、最新バージョンで使用される可能性のあるすべての依存関係を持っていない可能性がありますが、最新のカーネルソースを使用した外部モジュールのコンパイルは、最新バージョンにのみ存在するコードの任意の部分に依存する可能性があります。したがって、外部モジュールを使用している最新バージョンのカーネルを使用することをお勧めします。
次に、カーネルコンパイル用の.configファイルファイルシステムの/ boot/config(current-version)*からカーネルソースのトップディレクトリの.configにコピーできます。現在のバージョンは、uname -rから取得できます。
したがって、実行中のバージョン(コマンドuname -rで確認)がダウンロードしたソースと等しくない場合の手順は、新しいカーネルをコンパイルして使用するか、実行中のカーネルと同じバージョンのカーネルをダウンロードする必要があります。カーネルのコンパイルには、ブートディレクトリにある設定ファイルを使用し、上記のようにコピーします。
次に、外部モジュールをコンパイルする通常の方法に進み、実行中のカーネルで問題なくロードできます。