Linuxのカーネルモジュール

モノリシックカーネルは、カーネルが多くの機能を要求される場合、非常に大きなプログラムになる。
Linuxも例外ではなく、さらに用途の多用化や様々なアーキテクチャサポートなどにより多くの機能を持つため、全機能を実装する場合は非常に巨大なプログラムとなる。
その反面、旧式IAサーバから組込システムなど制約の多い環境下にインストールされることも多く、カーネルイメージの肥大化は問題となる。

Linuxでは、これらを解決するため、カーネルモジュールという仕組みを導入している。
カーネルモジュールは、実行時にカーネルの一部の機能をモジュール化したものであり、必要に応じてロードする。
これにより、特定のアーキテクチャでしか利用されない処理や不要なデバイスドライバなどの機能を取り外す事ができるため、
メモリの節約が行えると共に、起動時間の高速化を可能とする。
linux_linuxkernel_sum01.gif


呼び出しの流れ

(後日掲載)


設定・調整


カーネルモジュールの配置位置の確認

カーネルモジュールもカーネルイメージと同様、ファイルシステム上に配置される。

以下のOSでは、ブートイメージが3つ存在する。

# ls /boot/vmlinuz*
/boot/vmlinuz-2.6.21-1.3228.fc7  /boot/vmlinuz-2.6.23.17-88.fc7  /boot/vmlinuz-2.6.21-7.fc7xen

これらにそれぞれ対応するカーネルモジュールは、以下のディレクトリへそれぞれ配置されている。

# ls /lib/modules/
2.6.21-1.3228.fc7  2.6.21-7.fc7xen  2.6.23.17-88.fc7

実行中のシステムは、以下の通りである。

# uname -r
2.6.23.17-88.fc7

したがって、利用されるカーネルモジュールは、
ディレクトリ「/lib/modules/2.6.23.17-88.fc7」に配置されることが理解できる。

以下のようにコマンドを実行すると、カーネルモジュールの配置ディレクトリをより簡単に取得できる。

# echo /lib/modules/`uname -r`
/lib/modules/2.6.23.17-88.fc7

カーネルモジュールの一覧確認


・lsmodコマンド
サイズや利用されているモジュール数などを表示する。
# lsmod
Module                  Size  Used by
bridge                 47065  0
autofs4                20421  2
hidp                   21057  2
rfcomm                 36825  0
・・・(略)

・/proc/modulesの参照
システムディレクトリ「/proc」上のファイル「modules」を参照すると、
配置されているアドレスも表示される。

# cat /proc/modules
bridge 47065 0 - Live 0xccb9b000
autofs4 20421 2 - Live 0xccb85000
hidp 21057 2 - Live 0xccb59000
rfcomm 36825 0 - Live 0xccaf0000
・・・(略)

カーネルモジュールの詳細確認


・modinfoコマンド
以下のオプションにより情報を表示できるが、デフォルトでは全ての情報が表示される。
オプション 内容
-a 作者
-d 説明
-l ライセンス
-n ファイル名

# modinfo bridge
filename:       /lib/modules/2.6.23.17-88.fc7/kernel/net/bridge/bridge.ko
version:        2.3
license:        GPL
srcversion:     A340AEB25BACB2C610CA761
depends:
vermagic:       2.6.23.17-88.fc7 SMP mod_unload 686 4KSTACKS

カーネルモジュールのロード


・insmodコマンド
xfsのカーネルモジュールのロードを例に挙げる。
# insmod /lib/modules/`uname -r`/kernel/fs/xfs/xfs.ko

カーネルモジュールのアンロード


・rmmodコマンド
xfsのカーネルモジュールのアンロードを例に挙げる。
# rmmod /lib/modules/`uname -r`/kernel/fs/xfs/xfs.ko

カーネルモジュールの高度な操作(modprobe)

先述した依存関係は、カーネルモジュールの管理を非常に煩雑なものにしている。
これを課題を解決するものとして、コマンド「modprobe」がある。

・依存関係の設定
このコマンドはオプションにより先述の一覧表示からロード・アンロードなど殆どの操作を実現できる。
依存関係は、カーネルモジュールの配置されているディレクトリのルートに「modules.dep」という名称で置かれている。

# ls /lib/modules/`uname -r`/modules.dep
/lib/modules/2.6.23.17-88.fc7/modules.dep

設定ファイルの内容を少し解説する。
以下は、modules.depの最初の5行のみを出力したものである。

# head -5 /lib/modules/`uname -r`/modules.dep
/lib/modules/2.6.23.17-88.fc7/kernel/crypto/arc4.ko:
/lib/modules/2.6.23.17-88.fc7/kernel/crypto/cbc.ko: /lib/modules/2.6.23.17-88.fc7/kernel/crypto/blkcipher.ko
/lib/modules/2.6.23.17-88.fc7/kernel/crypto/blkcipher.ko:
/lib/modules/2.6.23.17-88.fc7/kernel/crypto/gf128mul.ko:
/lib/modules/2.6.23.17-88.fc7/kernel/crypto/fcrypt.ko:

制御文字「:」の前は、対象となるモジュール名を指している。
ここに記述が無い場合は、modprobeで参照が行えない。逆にここに記述しているからこそ、引数で渡すカーネルモジュールを、ファイル名でなくモジュール名で記述する事が可能となっている。
「:」より後は、依存するカーネルモジュールのファイル名を指しており、コマンド「modprobe」実行時に自動的にロードされる。

・コマンドの利用
パターンマッチによりロード可能な一覧を表示する。
ここでは、カーネルモジュール「xfs」を例に挙げる。

# modprobe -lt xfs
/lib/modules/2.6.23.17-88.fc7/kernel/fs/xfs/xfs.ko

このモジュールが他のどのようなモジュールと依存関係にあるかを表示する。
以下は1行のみであるため、他に依存関係が存在しない事を表している。

# modprobe --show-depends xfs
insmod /lib/modules/2.6.23.17-88.fc7/kernel/fs/xfs/xfs.ko


早速これをロードする。
ロードの場合、オプションは不要である。

# modprobe xfs

これをアンロードする場合は、
オプション「-r」を指定する。

# modprobe -r xfs

・コマンドの設定
ファイル「/etc/modprobe.conf」には、コマンドの設定を行える。
ディレクトリ「/etc/modprobe.d」以下に配置されたファイルも設定ファイルと見なされるため、設定ファイルを複数に分けて配置することも可能である。

以下は、NIC「eth0」へディバイスドライバであるカーネルモジュール「e100」をロードしている。

# cat /etc/modprobe.conf
alias eth0 e100
alias scsi_hostadapter ata_piix
・・・(略)

コマンド 意味
alias モジュールの別名指定
options モジュールへ渡すオプション
install ロード時に実行するシェルコマンド
remove アンロード時に実行するシェルコマンド

依存性情報の確認のため参照されるのは、設定ファイル「modules.dep」である。
この設定ファイルは、コマンド「depmod -a」によって再構築される。
これは、起動後の初期化シーケンスの中でも実行されるため、ユーザは意識する必要はない。

しかし、自作のモジュールを作成し起動中のシステム上へロードする場合は、
modprobeを実行する前に実行を行う必要がある。

カーネルモジュールの自動ロード

現在は、モジュールのロードは自動的に行われている。

Linux2.0まではデーモン「kerneld」が行っていた。
しかし、性能を向上させるため、Linux2.1からはカーネル内に「kmod」として実装された。

利用者はこの機能を有効にしている限り、カーネルモジュールのロード/アンロードは意識する必要が無くなる。


構築・インストール


  • 最終更新:2009-12-26 03:15:38

このWIKIを編集するにはパスワード入力が必要です

認証パスワード