Red Hat などのLinuxディストリビューションでは、 7.2, 7.3, 8.0とバージョンがすすむにつれて、デバイスドライバのローダブルモジュール化も進んでいます。ローダブルモジュールの採用は、開発時に毎回コンパイルし直す必要がないというメリットもあるのですが、insmodによるロード時にバージョンの整合性検査があるので、開発時などでロードするモジュールのバージョン番号がカーネルと合わない場合には、コンパイルし直すか、'-f'の強制モードのオプションをつけてモジュールをロードするといった注意が必要です。
モジュールの再コンパイルは、組み込み系の開発等でクロス開発のホスト環境が手元に無い場合にコンパイルできないとか、開発ホストからのファイルの転送が面倒だという問題があります。またATAディスクドライバ等、デバイスメーカがバイナリ・イメージだけしか公開していないドライバを使用する場合には、ソースが無くてターゲット用のカーネルのバージョンでコンパイルできないという問題があります。
ブート時に必要なローダブルモジュールは、カーネルがブート時に展開するinitrd (Initial RamDisk)でロードする必要があります。この時にモジュールの再コンパイルをせずに、バージョン・ミスマッチのモジュールを組み込んで、initrdの中を修正して、'-f'の強制モードのロードをinitrdの中でやってしまうという方法です。たいしたことはして無いのですが、頻繁に参照するのでメモにしておきます。
一般的な方法でカーネルをコンパイル、リンクして、デフォルトのinitrdを作成します。
以下は、kernel-2.4.19の場合の操作例です。
# cd /usr/src/linux-2.4.19
# make mrproper
# make ?config #好きなCONFIG作成方法でconfigファイルを読み込んで設定します
# make dep
# make clean
# make bzImage
# make modules
# make modules_install
# cp -p System.map /boot/System.map-2.4.19
# cp -p arch/i386/bzImage /boot/vmlinuz-2.4.19
# mkinitrd /boot/initrd-2.4.19.img 2.4.19
以下は、前項の「カーネルコンパイル」手順が終った後での作業です。
# cd /boot # gzip -cd initrd-2.4.19.img > initrd-2.4.19new または、 # zcat initrd-2.4.19.img > initrd-2.4.19new
# mkdir /mnt/initrd # mount -o loop initrd-2.4.19new /mnt/initrd
# cd /mnt/initrd # cp -p /usr/src/linux-2.4.19/fs/ext3/ext3.o lib # cp -p /usr/src/linux-2.4.19/fs/jbd/jbd.o lib
# vi linuxrc <==== 編集内容ここから:insmodに'-f'オプションを付けます。(4行目と6行目)===> #!/bin/nash echo "Loading jbd module" insmod -f /lib/jbd.o echo "Loading ext3 module" insmod -f /lib/ext3.o echo Mounting /proc filesystem mount -t proc /proc /proc echo Creating block devices mkdevices /dev echo Creating root device mkrootdev /dev/root echo 0x0100 > /proc/sys/kernel/real-root-dev echo Mounting root filesystem mount -o defaults --ro -t ext3 /dev/root /sysroot pivot_root /sysroot /sysroot/initrd umount /initrd/proc <====ファイルは、ここまで====>
# cd /boot # umount /mnt/initrd # gzip -c initrd-2.4.19new > initrd-2.4.19new.img
ここでのポイントはlinuxrc内のinsmodに'-f'を付ける事です。簡単なことですが、セルフでモジュールコンパイルができない組み込みLinuxでの開発実験や、メーカからバイナリしか提供されないモジュールのロードに有効です。
組み込む前には、当然ながら組み込み先のカーネルで、モジュールが動作するかを手作業で組み込んで動作確認する必要があります。
Last editted on 10/25/2003
Copyright(c) 2003,2004 Device Drivers Limited 戻る→