このファイルでは Linux カーネルにおける実行時ロードモジュールの考え方 について説明します。内容はモジュールの中身などの技術的なものではなく、 主にモジュールのコンパイルの仕方と使い方についてです。 注意:お使いのモジュール用プログラム(modules-X.Y.Z.tar.gz)が最新のもの であることを確認してください。"X.Y.Z" の部分は、モジュール用プログラム がリリースされた時点でのカーネルのバージョンに対応しています。古いバー ジョンのモジュール用プログラムでは新しいカーネルがサポートしている機能 のいくつかが使えないことがあります(不確かならばモジュール用プログラム をメンテナンスしている "Bjorn Ekwall" の URL を ./linux/CREDITS から見 つけて、最新のバージョンを入手してください)。 まず手始めに ------------- linux/README に書いてあるように、最初の一歩はカーネルをコンパイルする ところから始まります。通常は以下のように行います: make config make dep make clean make zImage or make zlilo "make config" すると、どの機能をカーネルに組みこみ、どの機能をロード可 能モジュールにするかを指定できます。通常、以下に示すブートに必要な最小 限の機能を組みこみます。 ルートパーティションのファイルシステム SCSI ドライバ(SCSI モジュールについては後述) ハードディスクドライバ ネットワーク機能(CONFIG_NET) TCP/IP 機能(CONFIG_INET)、ただしドライバは不要 以上に加えて、あなたに必須の機能を組みこんでください。 モジュール化されたドライバは日夜増えています。最新のカーネルがロード可 能モジュールとして提供しているドライバを使うには "make config" の際の オプションで "m" を選びます。 カーネルのバージョンにそれほど依存しないモジュールを作ることも可能です。 そのためには "make config" の際に CONFIG_MODVERSIONS で 'y' を指定しま す。この機能は 1.2 や 2.0 といった安定版のカーネルで特に有効です。公式 のカーネルソースには含まれていないコードから作ったモジュールを使う場合、 このオプションが役に立つでしょう。 カーネルのソースコードに含まれているモジュールを紹介します。 ほとんどのファイルシステム: minix, xiafs, msdos, umsdos, sysv, isofs, hpfs, smbfs, nfs 中レベルの SCSI 機能(より上位のドライバと下位のハードウェアレベル のドライバを結びつける部分) ほどんどのハードウェアレベルの SCSI ドライバ(aha1542, in2000 など) 全ての高レベルの SCSI ドライバ:disk, tape, cdrom, generic ほとんどのイーサネットドライバ(リストを書くには多すぎるので、 Documentation/networking/net-modules.txt を御覧ください) ほとんどの CDROM ドライバ: aztcd: Aztech,Orchid,Okano,Wearnes cm206: Philips/LMS CM206 gscd: Goldstar GCDR-420 mcd, mcdx: Mitsumi LU005, FX001 optcd: Optics Storage Dolphin 8000AT sjcd: Sanyo CDR-H94A sbpcd: Matsushita/Panasonic CR52x, CR56x, CD200, Longshine LCS-7260, TEAC CD-55A sonycd535: Sony CDU-531/535, CDU-510/515 その他各種ドライバ、例えば、 lp : ラインプリンタ用ドライバ binfmt_elf: ELF バイナリローダー binfmt_java: JAVA バイナリローダー isp16 : cdrom インターフェイス serial : シリアル(tty)インターフェイス カーネルをコンパイルする時、以下のようにモジュールもコンパイルします。 make modules これで全てのモジュールをコンパイルして linux/modules ディレクトリが更 新されるはずです。このディレクトリにはカーネルのソースツリーのあちこち にあるさまざまなオブジェクトファイルを指すシンボリックリンクが集められ ています。モジュールのコンパイルが終れば、モジュールをインストールしま しょう。 make modules_install このコマンドで新しくコンパイルしたモジュールを "/lib/modules/kernel_release/" 以下のディレクトリに移動します。ここで、 "kernel_release" の部分は 2.0.1 のような最新のカーネルのバージョン番号 になります。 新しくコンパイルしたカーネルで起動すれば、"insmod" や "rmmod" を使って、 自由にモジュールを組みこんだり外したりできます。insmod のマニュアルを 読めば "insmod" する際にモジュールの設定も簡単にできることが分るでしょ う(ヒント: symbol=value)。 素敵な機能 ---------- 上記以外にも "modprobe" と "depmod" という 2 種類のプログラムがありま す。"modprobe" は "insmod" のラッパー(あるいは機能拡張)です。これらの プログラムは現在使っているカーネルで使用可能な /lib/modules 以下にある モジュールについて、相互関係を記述しているファイルを操作(と保守)します。 modprobe を使えば、あらゆるモジュールを以下のような形でロードできます: /sbin/modprobe module 今使っているカーネルのバージョンやこのモジュールが必要とする下位のモジュー ルについて気にする必要はありません。 modprobe の設定ファイル "/etc/conf.module" を設定すれば modprobe の働 きをさまざまに調整することが可能で、それぞれのモジュールごとに insmod でロードする際の設定を自動化することも可能です。これらの機能にもマニュ アルが用意されています。 modprobe が正しく働くためには、通常、以下のコマンドを /etc/rc.d/rc.S スクリプトで走らせる必要があります(より詳しくは "modules-x.y.z.tar.gz パッケージに入っている "rc.hints" ファイルを御覧ください) /sbin/depmod -a このコマンドはさまざまなモジュールの依存関係を調べるためのものです。こ うしておけば、例えば、 /sbin/modprobe umsdos とすると、msdos モジュールと umsdos モジュールの「双方が」自動的にロー ドされます。なぜなら、umsdos は msdos 上で機能するため、 msdos モジュー ルを必要とするからです。 「究極の」ユーティリティ ----------------------- ここまで読んできた人は、もう十分満足したと思いますが、、、次にモジュー ルをインストールしたり外したりすることを、すっかり忘れてしまってもいい、 という話をしましょう。 kerneld デーモンを使えば、今までに説明したようなことは全て、自動的にやっ てくれます。kerneld を使うには "make config" の際に CONFIG_KERNELD に "Y" と答えて、起動後できるだけ早く /sbin/kerneld を起動するようにし、 "/sbin/depmod -a" も新しいカーネルで実行するようにします(モジュール用 プログラムのパッケージにより詳細な説明があります)。 このようにしておけば、モジュールとしてのみ提供されているカーネルの機能 をユーザープログラムが使おうとした際、そのモジュールがまだロードされて いなければ、カーネルは kerneld デーモンに頼んで必要なモジュールをロー ドしてもらいます。 もう少し詳しく説明すると: - カーネルはリクエストされた機能が組みこまれていないことに気づくと、 - kerneld に必要な機能を要求するメッセージを送り、 - kerneld はカーネルから要求された機能を果すモジュールをロードでき るかどうかを modprobe などに尋ね、 - modprobe は内部の「エイリアス」テーブルからその機能を満すモジュー ルを探します。このテーブルは "/etc/conf.modules" に "alias" 行を 加えることで修正や拡張ができます。 - 次に、modprobe が見つけたカーネルが必要とするモジュールを insmod に依頼してロードします。"/etc/conf.modules" の "option" 行で指定 することで、モジュールにさまざまな設定を行うことが可能です。 - modprobe が終了すると、kerneld はカーネルにうまくいった(あるいは 失敗した)旨を伝え - カーネルは新たにロードしたモジュールの機能をあたかも始めから組み こまれているかのように利用して、プログラムからの要求に答えます。 すばらしいことに、このように自動的に組みこまれたモジュールはしばらくの 間(通常 1 分間)使われないと、自動的に削除されます。 この機能のおかげで、カーネルは常に必要最小限のメモリしか使わずに済み、 使用頻度の低いコードが使っているメモリをより生産的に利用することができ ます。 実際のところ、この機能は kerneld の与えてくれる本当の利益の副作用のよ うなものです:kerneld を使えば、実際に必要なハードウェアの設定から独立 した最小限のカーネルを作ることができます。「仮想」カーネルは、実際のマ シンやその上で動くカーネルの使い方にあわせて設定ファイルで設定すること ができます。これは複数のマシンの管理者や配布パッケージの作成者にとって は朗報でしょう。 kerneld を最小限の努力で使うためには、カーネルに対応した最新の modprobe と modprobe 用の設定ファイル("/etc/conf.modules")が必要です。 modprobe はあらかじめほとんどのモジュールについて知っているので、設定 ファイルで最低限設定すべき部分は以下の通りです。 alias scsi_hostadapter aha1542 # 実際の SCSI アダプタに合わせること alias eth0 3c509 # 実際のネットワークカードに合わせること # ネットワークカードに必要なオプションの指定 options 3c509 io=0x300 irq=10 # その他、オプションの必要なモジュール用の設定 options cdu31a cdu31a_port=0x1f88 sony_pas_init=1 このような設定を加えてみるのもいいかも知れません。 alias net-pf-3 off # ax25 はまだモジュール化されていない(現在のところ) alias net-pf-4 off # ipx モジュールが必要なければ alias net-pf-5 off # appletalk モジュールも必要なければ 最後に「純粋主義者」のために: modprobe の設定ファイルは "/etc/conf.modules" でも "/etc/modules.conf" でも構いません。modprobe は両方の名前を理解します。 この文章の作者: Jacques Gelinas Bjorn Ekwall 翻訳: こじまみつひろ