他のカーネル用にコンパイルされたカーネルモジュールのロードに失敗しました。

他のカーネル用にコンパイルされたカーネルモジュールのロードに失敗しました。

組み込みLinuxを実行している組み込みデバイスにカーネルip_gre.koモジュールをロードして、gre.koデバイスがGREプロトコルをサポートしたいと思います。組み込みLinuxデバイスのカーネルを変更したくないので、次のことを試してください。ジムデバイスカーネルを再インストールする代わりに、カーネルモジュールを使用してください。

幸いにも、デバイス用のカーネルソースコードがあり、コンパイルしてモジュールip_gre.kogre.koできます。ただし、insmod次のメッセージでデバイスでロードモジュールを使用すると失敗します。

$ insmod gre.ko
insmod: can't insert 'gre.ko': Resource temporarily unavailable
$ insmod ip_gre.ko
ip_gre: Unknown symbol gre_del_protocol
ip_gre: Unknown symbol gre_add_protocol
insmod: can't insert 'ip_gre.ko': unknown symbol in module, or unknown parameter
$ dmesg
GRE over IPv4 demultiplexor drvier
gre: can't add protocol
ip_gre: Unknown symbol gre_del_protocol
ip_gre: Unknown symbol gre_add_protocol

私のデバイスにはモジュールをロードするのに十分なメモリがあります(free190700/239760が無料で表示されます)。

これが起こる理由と考えられる解決策を教えてください。

修正する:

これは.config、デバイスで実行されているカーネルと上記の2つのモジュール用にコンパイルされたカーネルとの違いです。

$ diff config_for_running_kernel config_for_kernel_compiled_for_modules
299c299, 301
< # CONFIG_NET_IPGRE_DEMUX is not set
---
> CONFIG_NET_IPGRE_DEMUX=m
> CONFIG_NET_IPGRE=m
> CONFIG_NET_IPGRE_BROADCAST=y
963c965
< CONFIG_PPTP=y
---
> CONFIG_PPTP=m

CONFIG_PPTP依存関係のため、CONFIG_NET_IPGRE_DEMUXエラーメッセージなしでカーネルをモジュールにコンパイルする必要があります。

これらの違いにより、上記のエラーメッセージが発生する可能性がありますか?それでは解決策を教えてください。 (これらの問題や解決策を教えてくれる他の参考資料があれば、非常に感謝します。)

ベストアンサー1

カーネルモジュールを分析して修正することでこの問題を解決しました。カーネルモジュールのソースコードを分析した結果、Gillesが述べたように、カーネルモジュールをロードするには互換性のあるカーネルオプションに集中する必要があることがわかります。gre既存のモジュールがプロトコルIDと同じpptpプロトコルIDを使用していたため、カーネルモジュールをロードすると問題が発生しました。モジュールが有効になっていないカーネルはプロトコルIDとして使用されます。IPGRE_PROTOgregreIPGRE_PROTOpptp

おすすめ記事