モジュールユーティリティは、モジュールを使用するために必要な一連
のプログラムです。この文書を書いている時点での最新版モジュールユー
ティリティは modules-2.0.0.tar.gz
です。最新版の情報は
http://www.pi.se/blox
にあります。
この情報は、/usr/src/linux/Documentation/modules.txt
内
の、Jacques Gelinas 氏 (jacques@solucorp.qc.ca
) と
Björn Ekwall 氏 (bj0rn@blox.se
) の記述をもとに作成され
ました。
linux/README
に書いてあるように、まずカーネルをコンパイ
ルしなければなりません。ふつう次のようにします。
make config
中で、カーネルに内蔵させる機能とローダブルモジュー
ルにする機能を選択します。ブートするために必要な、最小限のカーネルに内蔵
すべき機能は次のものです。
モジュールの種類は徐々に増えています。現在のカーネルでモジュール化できる
機能は、make config
中で m
というオプションで選択できます。[訳
注:チェック欄が < > になっているものはモジュール化できます。[ ] になっ
ているものはモジュール化できません。]
また、カーネルのバージョンに依存しないモジュールを作ることもできます。
make config
中で CONFIG_MODVERSIONS
を有効にすれば可能です。こ
れは/安定版/のカーネル 1.2 シリーズと 2.0 シリーズで有用です。もし公
式のカーネルソースに含まれていないソースから作ったモジュールを持っている
なら、きっとこのオプションを好きになるでしょう…。
カーネルを作る際にモジュールを生成するには、次のようにします。
make modules
これを実行すると、すべてのモジュールをコンパイルし、ディレクトリ
linux/modules
を更新します。このディレクトリには、カーネルツリー
内の様々なオブジェクトファイルへのシンボリックリンクが存在します。
すべてのモジュールを生成したら、次のようにしなければなりません。
make modules_install
この操作は、新しく作成されたモジュールを、
/lib/modules/kernel_release
内のサブディレクトリにコピーします。
ここで kernel_release
というのは 2.0.1 のような現在のカーネルバージョ
ンです。
新しいカーネルでリブートしたら、insmod
と rmmod
というユー
ティリティを使って、すぐにモジュールをインストール(組み込み)したりリムー
ブ(取り外し)したりできます。insmod
のマニュアルを読めば、
insmod
する時にモジュールを設定するのがどんなに簡単かわかるでしょう
(ヒント:symbol=value)。
modprobe
と depmod
modprobe
と depmod
という 2 つのユーティリティも使うことができ
ます。modprobe
は insmod
のラッパー(もしくは拡張)です。こ
れらのユーティリティは、現在のカーネルが利用できるモジュールすべて
(/lib/modules
以下)と、それらの相互依存関係を記述したファイル群
を使用(もしくは管理)します。
modprobe ユーティリティを使えば、次のようにしてモジュールをロードでき ます。
/sbin/modprobe module
この方法をつかうと、動作しているカーネルが何であるか気にしなくてもよ く、また、そのモジュールが依存している他のモジュールが何なのかも気にしな くてもよくなります。
modprobe の設定ファイルである /etc/conf.modules
を使えば、
modprobe の動作を色々と調整することができます。各モジュール用の insmod
オプションの自動設定をすることもできます。ん〜、その方法は マニュア
ル にすべて書いてあります…。
modprobe をうまく使うには、/etc/rc.d.rc.S
スクリプトに次のよう
なコマンドを書いておくのが普通です[訳注:Slackware の場合。Sysvinit を使っ
ているパッケージ(RedHat、Debian 等)では、/sbin/init.d/modules 等を作り、
/sbin/rc.d/rc?.d/S???modules -> /sbin/init.d/pcmcia などとします。詳しく
は sysvinit のマニュアルを参照]。(モジュールユーティリティ
modules-x.y.z.tar.gz
の rc.hints
ファイルにさらなる情報が書い
てあります。)
/sbin/depmod -a
上記のコマンドは、モジュール間の依存関係を調べます。手動で行うには、 下の例を参考にしてください。
/sbin/modprobe umsdos
umsdos
モジュールは msdos
モジュール上で動くため、この例では、
msdos
モジュールと umsdos
モジュールが両方とも自動的にロー
ドされます。
さて、ここまで読んできて、もう十分に感動したことでしょう…。それではここ で、ローダブルモジュールのインストールとリムーブをすっかり忘れる方法を教 えましょう。
kerneld デーモンを使えば、これらの面倒なことを自動的にやってくれます。
make config
時に CONFIG_KERNELD に「Y」と答え、できるかぎりブート直
後に /sbin/kerneld
を実行します。現在のカーネル用に
/sbin/depmod -a
されていなければなりません。(モジュールユーティ
リティにさらなる情報が書いてあります。)
あるプログラムが、ローダブルモジュールでしか提供されていないカーネル の機能を要求すると、そのモジュールが既にロードされていなければ、カーネル は kerneld デーモンに良きにはからうように依頼します。
次のようなことが行われます。
/etc/conf.modules
内に alias 行があれば展開および認識される。/etc/conf.modules
の optoions
行に従って、各モジュールが設定される。これによって、kernel が使用するメモリの量はいつでも最小限に抑えられます。 使われていないコードに場所を喰わせておくよりも、もっと有効にメモリを活用 することができます。
実は、これは kerneld の真の利点のある一面でしかありません。最小 構成のカーネルを作りさえすればよいという利点もあります。最小構成のカーネ ルは、多少ともハードウェア設定に依存することが減ります。仮想的なカー ネルの状態は、マシンおよびカーネルの現在の使用状態と、設定ファイルによっ て制御されます。
これは、ディストリビューションの管理者や、複数のマシンの管理者には良 いニュースです。
あまり骨を折らずに kerneld を使うには、カーネルに対応した最新だ
と考えられる modprobe や、modprobe の設定ファイル
(/etc/conf.modules
) が必要です。
modprobe はほとんどのモジュールについて既にわかっているので、最小設定 のファイルは次のようになるでしょう。
alias scsi_hostadapter aha1542 # もしくは自分の SCSI アダプタ
alias eth0 3c509 # もしくは自分のネットワークアダプタ
# "options" 行が必要なアダプタもあるかもしれません:
options 3c509 io=0x300 irq=10
# "options" 行が必要なモジュールがあるかもしれません:
options cdu31a cdu31a_port=0x1f88 sony_pas_init=1
下のような行を加えてもよいですが、ただのおまじないです:[訳注: これをしておかないと、起動時に modprobe が「Can't locate module net-pf-4」 等と文句をいいます。逆に、文句を言われたらこのようにしてみましょう。]
alias net-pf-3 off # a25 モジュールはまだ未サポート
alias net-pf-4 off # ipx モジュールを使わないのなら
alias net-pf-5 off # appletalk module を使わないのなら
最後に、純正主義者へ。modprobe の設定ファイルは、
/etc/conf.modules
でも /etc/modules.conf
でもよいです。
modprobe はどちらの場合でも何をやるべきかわかっていますから…。