組み込みLinuxを実行している組み込みデバイスにカーネルip_gre.ko
モジュールをロードして、gre.ko
デバイスがGREプロトコルをサポートしたいと思います。組み込みLinuxデバイスのカーネルを変更したくないので、次のことを試してください。ジムデバイスカーネルを再インストールする代わりに、カーネルモジュールを使用してください。
幸いにも、デバイス用のカーネルソースコードがあり、コンパイルしてモジュールip_gre.ko
化gre.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
私のデバイスにはモジュールをロードするのに十分なメモリがあります(free
190700/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_PROTO
gre
gre
IPGRE_PROTO
pptp