initrdにカーネル・バージョン非対応のドライバを組み込む

1.はじめに

Red Hat などのLinuxディストリビューションでは、 7.2, 7.3, 8.0とバージョンがすすむにつれて、デバイスドライバのローダブルモジュール化も進んでいます。ローダブルモジュールの採用は、開発時に毎回コンパイルし直す必要がないというメリットもあるのですが、insmodによるロード時にバージョンの整合性検査があるので、開発時などでロードするモジュールのバージョン番号がカーネルと合わない場合には、コンパイルし直すか、'-f'の強制モードのオプションをつけてモジュールをロードするといった注意が必要です。

モジュールの再コンパイルは、組み込み系の開発等でクロス開発のホスト環境が手元に無い場合にコンパイルできないとか、開発ホストからのファイルの転送が面倒だという問題があります。またATAディスクドライバ等、デバイスメーカがバイナリ・イメージだけしか公開していないドライバを使用する場合には、ソースが無くてターゲット用のカーネルのバージョンでコンパイルできないという問題があります。

ブート時に必要なローダブルモジュールは、カーネルがブート時に展開するinitrd (Initial RamDisk)でロードする必要があります。この時にモジュールの再コンパイルをせずに、バージョン・ミスマッチのモジュールを組み込んで、initrdの中を修正して、'-f'の強制モードのロードをinitrdの中でやってしまうという方法です。たいしたことはして無いのですが、頻繁に参照するのでメモにしておきます。

2.カーネルのコンパイルと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

3.INITRD RAMDISKの展開と修正、再作成

以下は、前項の「カーネルコンパイル」手順が終った後での作業です。

2.4.19用initrdを名前を変えて展開

# cd /boot
# gzip -cd initrd-2.4.19.img > initrd-2.4.19new

または、
# zcat initrd-2.4.19.img > initrd-2.4.19new

RAMDISKファイルのマウント

# mkdir /mnt/initrd
# mount -o loop initrd-2.4.19new /mnt/initrd

必要なローダブル・モジュールのコピー(ext3モジュールを組み込む例)

# 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

linuxrcファイルの編集例

# 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
<====ファイルは、ここまで====>

RAMDISKファイルのアンマウントと2.4.19用圧縮イメージの作成

# cd /boot
# umount /mnt/initrd
# gzip -c initrd-2.4.19new > initrd-2.4.19new.img

4.ポイント

ここでのポイントはlinuxrc内のinsmodに'-f'を付ける事です。簡単なことですが、セルフでモジュールコンパイルができない組み込みLinuxでの開発実験や、メーカからバイナリしか提供されないモジュールのロードに有効です。
組み込む前には、当然ながら組み込み先のカーネルで、モジュールが動作するかを手作業で組み込んで動作確認する必要があります。

Last editted on 10/25/2003
Copyright(c) 2003,2004 Device Drivers Limited 戻る→