web-dev-qa-db-ja.com

異なるカーネルバージョンのカーネルモジュールをコンパイルする方法

次のカーネルをインストールしています。

[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)のモジュールをビルドしたいので、それが必要な理由です。このようにするために。

3
Kenci

実際、ここで気にすることが2つあります。

実行中のカーネルバージョンは、使用しているソースと同じですか。以前にコンパイルされたカーネルは、最新バージョンで使用される可能性のあるすべての依存関係を持っていない可能性がありますが、最新のカーネルソースを使用した外部モジュールのコンパイルは、最新バージョンにのみ存在するコードの任意の部分に依存する可能性があります。したがって、外部モジュールを使用している最新バージョンのカーネルを使用することをお勧めします。

次に、カーネルコンパイル用の.configファイルファイルシステムの/ boot/config(current-version)*からカーネルソースのトップディレクトリの.configにコピーできます。現在のバージョンは、una​​me -rから取得できます。

したがって、実行中のバージョン(コマンドuname -rで確認)がダウンロードしたソースと等しくない場合の手順は、新しいカーネルをコンパイルして使用するか、実行中のカーネルと同じバージョンのカーネルをダウンロードする必要があります。カーネルのコンパイルには、ブートディレクトリにある設定ファイルを使用し、上記のようにコピーします。

次に、外部モジュールをコンパイルする通常の方法に進み、実行中のカーネルで問題なくロードできます。

1
Samrat Das