第 24章カーネルモジュール

Linuxカーネルはモジュール形式で設計されています。起動時に、最小限度の常駐カーネルがメモリにロードされます。その後、ユーザーが常駐カーネルに存在しない機能を要求すると、カーネルモジュールは動的にメモリにロードされます。一定時間使用されない場合、モジュールはメモリから取り除かれることがあります。

モジュールの動的なロードをサポートするメカニズムは、kmodコマンドと呼ばれるカーネルスレッドです。モジュールは、必要になったときに初めてロードされます。カーネルがモジュールを要求すると、それと依存関係にあるすべてのモジュールがロードされます。

Red Hat Linuxには、10分ごとにすべての未使用のモジュールを取り除くcronタスクも含まれています。cronタスクは、/etc/cron.d/kmodファイルにあります。cronタスクの詳細についてはcron項第22章を参照してください。

インストールプログラムは、Red Hat Linuxをインストールする際、システムにあるハードウェアを調べます。一方、ユーザーは、システムの通常の使用形態と必ずロードすべきプログラムに関する情報を入力します。インストールプログラムは、この調査結果と入力された情報に基づいて、起動時にロードする必要のあるモジュールを決定します。そして、ユーザーには見えない形で動的ロードメカニズムが機能するようにセットアップします。カスタムカーネルを構築する場合は、それらのすべてを自分自身で決定することができます。

インストール後に、カーネルモジュールによるサポートを必要とするようなハードウェアを新規に追加する場合は、動的ロードメカニズムをセットアップする必要があります。通常、新しいハードウェアは、Kudzuが検出します。また、新しいドライバはモジュール設定ファイル/etc/modules.confを編集して組み込むこともできます。

たとえば、インストール時に、SMC EtherPower 10 PCIネットワークアダプタを組み込んだ場合には、モジュール設定ファイルには次の行があるはずです。

alias eth0 tulip

インストール後に、同じネットワークアダプタをもう一枚インストールする場合は、/etc/modules.confファイルに次の行を追加します。

alias eth1 tulip

カーネルモジュールとモジュール化可能なハードウェアの一覧(アルファベット順)は、オフィシャル Red Hat Linuxリファレンスガイドにあります。

カーネルモジュールユーティリティ

一連のコマンドを使用して、カーネルモジュールの一覧表示、ロード、アンロードのどれかができます。別のモジュールを試してみたい場合、あるいはモジュールが正常にロードされているかどうか知りたい場合にこれらのコマンドは適しています。

/sbin/lsmodコマンドを実行すると、現在ロードされているモジュールの一覧が表示されます。

例 24-1. lsmodの出力例

Module                  Size  Used by
sr_mod                 15264   0 (autoclean)
mga                    95984   1
agpgart                23392   3
nfs                    79008   1 (autoclean)
lockd                  52464   1 (autoclean) [nfs]
sunrpc                 61328   1 (autoclean) [nfs lockd]
autofs                 11264   4 (autoclean)
3c59x                  25344   1 (autoclean)
ipchains               38976   0 (unused)
ide-scsi                8352   0
scsi_mod               95104   2 [sr_mod ide-scsi]
ide-cd                 26848   0
cdrom                  27232   0 [sr_mod ide-cd]
usb-uhci               20720   0 (unused)
usbcore                49664   1 [usb-uhci]

例24-1で見ることができるように、lsmodは、現在ロードされている各モジュールのサイズ、使用カウント、参照モジュールなどを表示します。

カーネルモジュールをロードするには、/sbin/insmodコマンドを入力し、続いてカーネルモジュール名を入力します。デフォルトでは、insmod/lib/modules/<kernel-version>/kernel/driversサブディレクトリからモジュールのロードが行われます。各タイプのモジュールにサブディレクトリがあります。たとえば、ネットワークインターフェイスドライバにはnetサブディレクトリがあります。カーネルモジュールの中には、モジュールに依存するものがあります—このようなカーネルモジュールがロードするには、最初に他のモジュールをロードする必要があります。このような依存性を解決するために、まずモジュールに依存するものをロードしてから希望のモジュールをロードするか、あるいは、コマンド/sbin/modprobeを入力し、続いてモジュール名を使用してモジュールをそれに依存するものと共にロードします。

たとえば、コマンド

/sbin/modprobe tulip

は、tulipネットワークインターフェイスモジュールをロードします。

カーネルモジュールをアンロードするには、/sbin/rmmodコマンドを実行し、続いてモジュール名を入力します。rmmodユーティリティは、現在使用されておらず、使用中の他のモジュールと依存関係にないモジュールのみアンロードします。

たとえば、コマンド

/sbin/rmmod tulip

は、tulipネットワークインターフェイスモジュールをアンロードします。

もう1つの便利なカーネルモジュールユーティリティはmodinfoです。/sbin/modinfoコマンドを使用して、カーネルモジュールに関する情報を表示できます。一般的な構文は次のようになります。

/sbin/modinfo [options] <module>

オプションとして、モジュールの簡単な説明を表示する-dと、モジュールがサポートするパラメータを一覧表示する-pがあります。オプションの完全な一覧については、modinfo man page(man modinfo)を参照してください。