単一のツリー内カーネルモジュールを構築するにはどうすればよいですか?


37

linux-source -...にはconfig /boot/config-3.4-trunk-686-paeで無効にされたモジュールがあり、linux-image -...の一部ではありません(これはDebianですが、ソリューションはUbuntuでも同じである必要がありますか?)、たとえば

# CONFIG_CAN_PEAK_USB is not set

分散カーネルで使用できるように、そのカーネルモジュールだけをどのようにコンパイルしますか?

それぞれのlinux-source -...パッケージはすでにインストールされ、圧縮されておらず、/ usr / src / linuxにリンクされています。/boot/config-3.4-trunk-686-paeは/usr/src/linux/.configにコピーされ、

CONFIG_CAN_PEAK_USB=m

make
make modules

カーネルとすべてのモジュールをコンパイルすることが可能です。しかし、その特定の単一モジュールのみをどのようにコンパイルしますか?

(注:また、カーネルは事前にコンパイルする必要があります。そうしないと、次のエラーが発生します。no symbol version for module_layout


14627の複製として閉じてください。ユーザー「Radu C」の回答が質問に回答します。
mab

depmod -a前に試しましたmodbrobeか?
ナディア

1
あまりにも、次の資料を検討してください。stackoverflow.com/questions/8744087/...
オレグKokorin

回答:


38

同じ問題がありました。.configをコピーするだけでなく、Module.symversもコピーする必要があると思います

モジュールft1000をコンパイルする手順(Debian Wheeze 7.1.0を実行、カーネル3.2.0-4-686-pae):

aptitude install linux-headers-3.2.0-4-686-pae
aptitude install linux-source-3.2
cd /usr/src/
tar xjf linux-source-3.2.tar.bz2
cd /usr/src/linux-source-3.2
cp ../linux-headers-3.2.0-4-686-pae/Module.symvers .
make oldconfig # it copies .config to ./
vi .config # enable ft1000 module: CONFIG_FT1000=m
make prepare # setup FT1000 as module
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
cp drivers/staging/ft1000/ft1000-usb/ft1000.ko /lib/modules/3.2.0-4-686-pae/kernel
/drivers/staging/
depmod
modprobe ft1000

4
SUBDIRSがまだ正しいかどうかはわかりません。私にとっては無視されました。kernel.org/doc/Documentation/kbuild/modules.txtを読んだ後、make M=/path/to/moduleどれが機能しているように見えるかを試してみました。
害14

Iamは別のモジュールを変更しようとしています(既存のモジュールにUSB IDを追加するだけです)コンパイルするとエラーは表示されませんが、挿入すると無効なモジュール形式が表示されます。
ジブリ

14

最上位のソースディレクトリ内から、単にモジュール名またはモジュールディレクトリへのパスを指定します。例:

make drivers/net/can/usb/peak_usb/

または、より簡単な例(Intel e1000イーサネットドライバー):

make drivers/net/ethernet/intel/e1000/e1000.ko

実行中:make drivers/net/can/usb/peak_usb/pcan_usb.kopcan_usb.oのみをビルドしました。やってmake drivers/net/can/usb/peak_usb/ && make drivers/net/can/usb/peak_usb/pcan_usb.koそれをコンパイルしますが、insmodのは文句Error: could not insert module drivers/net/can/usb/peak_usb/peak_usb.ko: Invalid module format。dmesg:peak_usb: no symbol version for module_layout
mab

その特定のカーネルを実行していて、カーネルを一度コンパイルしましたか?とmodprobeも試してみてください。
-ish

パッケージ化されたカーネルを実行しています。カーネル全体のコンパイルは機能します。しかし、私は完全なカーネルをコンパイルせず、特定のカーネルモジュールのみをコンパイルしようとしています。単一モジュールのコンパイルを「準備」するmakeターゲットはありますか?modprobeは同じエラーを表示します。
mab

6
stackoverflowによると、使用できるのはmake modules SUBDIRS=drivers/net/can/usb/peak_usb他のサブディレクトリだけです。ここで問題なく動作します。
トレヴィーニョ

0

(この例はft1000ドライバーを示していますが、インスタントではない場合でも数分しかかかりません)

cd /usr/src/kernel-sources
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
# Enable the ft1000 module: CONFIG_FT1000=m  on the config with 
make xconfig # or "make menuconfig" then save
make prepare
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules_install

あなたは、その後でモジュールをロードすることができmodprobeた後、depmod

注:モジュールの依存関係によっては、カーネルを完全に再構築する必要がある場合があります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.