次のページ 前のページ 目次へ

2. モジュールユーティリティ

モジュールユーティリティは、モジュールを使用するために必要な一連 のプログラムです。この文書を書いている時点での最新版モジュールユー ティリティは 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) の記述をもとに作成され ました。

2.1 モジュールの作成

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 のような現在のカーネルバージョ ンです。

新しいカーネルでリブートしたら、insmodrmmod というユー ティリティを使って、すぐにモジュールをインストール(組み込み)したりリムー ブ(取り外し)したりできます。insmod のマニュアルを読めば、 insmod する時にモジュールを設定するのがどんなに簡単かわかるでしょう (ヒント:symbol=value)。

2.2 拡張ユーティリティ modprobedepmod

modprobedepmod という 2 つのユーティリティも使うことができ ます。modprobeinsmodラッパー(もしくは拡張)です。こ れらのユーティリティは、現在のカーネルが利用できるモジュールすべて (/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.gzrc.hints ファイルにさらなる情報が書い てあります。)

/sbin/depmod -a

上記のコマンドは、モジュール間の依存関係を調べます。手動で行うには、 下の例を参考にしてください。

/sbin/modprobe umsdos
umsdos モジュールは msdos モジュール上で動くため、この例では、 msdos モジュールと umsdos モジュールが両方とも自動的にロー ドされます。

2.3 究極のユーティリティ

さて、ここまで読んできて、もう十分に感動したことでしょう…。それではここ で、ローダブルモジュールのインストールとリムーブをすっかり忘れる方法を教 えましょう。

kerneld デーモンを使えば、これらの面倒なことを自動的にやってくれます。 make config 時に CONFIG_KERNELD に「Y」と答え、できるかぎりブート直 後に /sbin/kerneld を実行します。現在のカーネル用に /sbin/depmod -a されていなければなりません。(モジュールユーティ リティにさらなる情報が書いてあります。)

あるプログラムが、ローダブルモジュールでしか提供されていないカーネル の機能を要求すると、そのモジュールが既にロードされていなければ、カーネル は kerneld デーモンに良きにはからうように依頼します。

次のようなことが行われます。

さらにちょと嬉しいおまけも付いてきます。インストールされたモジュールが、 ある期間使用されずにいると(ふつうは 1 分)、自動的にカーネルから外されま す。

これによって、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 はどちらの場合でも何をやるべきかわかっていますから…。


次のページ 前のページ 目次へ