カーネル モジュール

はじめに

第26章はじめに

Linuxカーネルは、モジュールを広範囲に使用します。このモジュールは、システムの起動後に必要に応じてロードおよびアンロードできる重要なソフトウェアを含んでいます。多くのモジュールには、システム ドライバまたは周辺機器に接続されたハードウェアを制御するデバイス ドライバが組み込まれています。その他のモジュールは、ネットワーク プロトコルを制御し、さまざまな種類のファイルシステムやその他の多くの目的をサポートできます。モジュールをロードするときには、パラメータを指定してその動作を制御できます。最終的な効果は、変化する条件とニーズに対応する際の、優れた柔軟性とアジリティ（俊敏性）です。


学習目標
この章の終わりまでに、次のことができるようになります。

カーネル モジュールを利用する利点をリストできます。
insmod、rmmod、modprobeを使用して、カーネル モジュールをロードおよびアンロードできます。
modinfoを使用して、カーネル モジュールに関する情報を見つけることができます。


カーネル モジュール

カーネル モジュール
Linuxカーネルの機能の多くは、最初にロードされるときにカーネルに組み込まれるように、または必要に応じてモジュールとして後で追加（または削除）されるように設計されています。実際、主要カーネル コンポーネントの大部分を除いて、このような方法で統合されています。

このようなモジュールは、デバイス ドライバである場合とそうでない場合があります。たとえば、ハードウェアやソフトウェア デバイスを動作させるのではなく、特定のネットワーク プロトコルやファイルシステムを実装する場合があります。変更をテストするためにカーネルを再起動する必要がないため、常に機能を必要とする場合でも、モジュールとしてロードおよびアンロードする形で組み込むと開発が容易になります。

カーネル モジュールが広く使用されている場合でも、Linuxはマイクロカーネル アーキテクチャではなく、モノリシック カーネル アーキテクチャを維持しています。これは、モジュールがロードされると、ほとんど制約なく完全なカーネル機能になるためです。マイクロカーネルのようなメッセージの受け渡しではなく、主にメモリやロックなどの共有リソースを介して、すべてのカーネル サブシステムと通信します。

Linuxは、モジュールを使用する唯一のオペレーティング システムではありません。Solarisも同様であり、こちらはAIXと同じくカーネル拡張と呼んでいます。ただし、Linuxはモジュールを非常に堅牢な方法で使用します。


Ismodで使用中のモジュールの一覧を表示する
ほとんどのカーネル機能は、常に使用される可能性がある場合でも、モジュールとして構成できます。この柔軟性は、開発やデバッグ中のテストにシステムの再起動がほとんど必要ないため、新機能の開発にも役立ちます。

他のオペレーティング システムもモジュールのような方法を使用していますが、Linuxは他のオペレーティング システムよりもはるかに多く使用しています。

モジュールがロードされている間は、下のスクリーンショットのように、lsmodでその状態をいつでも確認できます。

lsmodの使用例

モジュールの削除は、次の方法で直接実行できます。

$ sudo /sbin/rmmod module_name

モジュールを削除するときに、フルパス名または拡張子.koを指定する必要がないことに留意してください。

モジュールのロードとアンロードを行うことができるのは、rootユーザーだけです。完全なパス名がわかっている場合は、次のコマンドを使用していつでもモジュールを直接ロードできます。

$ sudo /sbin/insmod <pathto>/module_name.ko

カーネル モジュールの通常のファイルシステムの場所は、/lib/modules/<kernel-version>のディレクトリ ツリーの下です。カーネル モジュールのファイル拡張子は、e1000e.ko、ext4.ko、usbserial.koのように、常に.koになります。

カーネル モジュールはカーネル バージョン固有であり、実行中のカーネルと一致させる必要があります。一致しない場合、ロードできません。これらのコンパイルは、カーネル自体がコンパイルされるときに、またはその後で、コンパイルを適切に行うのに十分なカーネル ソースとコンパイル構成を保持しているシステムで行う必要があります。


モジュール ユーティリティ
カーネル モジュールで使用されるユーティリティ プログラムは多数あります。

lsmod
ロードされたモジュールをリストします。
insmod
モジュールを直接ロードします。
rmmod
モジュールを直接削除します。
modprobe
依存関係と場所の情報を持つ、事前に構築されたモジュール データベースを使用して、モジュールをロードまたはアンロードします。
depmod
モジュールの依存関係データベースを更新します。modprobeとmodinfoで必要となります。
modinfo
モジュールに関する情報を表示します。

modprobeを使用してモジュールをロードする場合：

$ modprobe e1000e

modprobe -rを使用して、モジュールをアンロードまたは削除する場合：

$ modprobe -r e1000e

modprobeでは、更新されたモジュールの依存関係のデータベースを要求します。depmodeを使用して、ファイル/lib/modules/$(name -r)/modules.depを生成または更新します。

insmodを使用してモジュールを直接ロードする場合（完全修飾名のモジュール名が必要）：

$ insmod /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/e1000e.ko

rmmodを使用して、モジュールを直接削除する場合：

$ rmmod e1000e

lsmodを使用して、ロードされたモジュールをリストする場合：

$ lsmod

modinfoを使用して、モジュールに関する情報（パラメータを含む）を表示する場合：

$ modinfo e1000e


モジュールに関する留意事項
モジュールをロードおよびアンロードする際に留意すべき重要な点がいくつかあります。

1つ以上の他のモジュールが参照しているモジュールは、アンロードすることはできません。これらのモジュールは、lsmodリストから確認できます。
1つ以上のプロセスで使用されているモジュールは、アンロードすることはできません。これもlsmodリストから確認できます。ただし、ネットワーク デバイス ドライバ モジュールなど、参照カウントを記録しないモジュールがあります。これは、ネットワーク スタック全体の大部分をシャットダウンして再起動することせずに、一時的にモジュールを交換するのは非常に難しいためです。
モジュールがmodprobeでロードされると、システムは最初にロードする必要がある他のモジュールも自動的にロードします。
modprobe -rを使用してモジュールをアンロードする場合、他のモジュールがそれを参照していなければ、システムはそのモジュールが使用している他モジュールも自動的にアンロードします。


modinfoの使用例
次のようにmodinfoを使用すると、カーネル モジュールに関する情報を（現在ロードされているかどうかに関係なく）見つけることができます。

$ /sbin/modinfo my_module

$ /sbin/modinfo <pathto>/my_module.ko

このスクリーンショットの例をご覧ください。バージョン、ファイル名、デバイス ドライバ モジュールが処理できるハードウェア デバイス、読み込み時に指定できるパラメータに関する情報が表示されています。

modinfoの使用例

モジュールに関する多くの情報は、/sys疑似ファイルシステムのディレクトリ ツリーでも確認できます。この例では、/sys/module/e1000の下を調べています。そして、すべてではありませんが一部のパラメータは/sys/module/e1000/parametersで読み書きできます。次にそれらを設定する方法を示します。

次のように、パラメータ値を指定しながら多くのモジュールをロードできます。

$ sudo /sbin/insmod <pathto>/e1000e.ko debug=2 copybreak=256

または、すでにシステムの適切な場所にモジュールがある場合は、次の方法を使用すると簡単です。

$ sudo /sbin/modprobe e1000e debug=2 copybreak=256


/etc/modprobe.d
/etc/modprobe.dサブディレクトリ ツリー内の.conf拡張子で終わるすべてのファイルは、modprobeを使用してモジュールをロードおよびアンロードするときに参照します。/etc/modprobe.dディレクトリ内のファイルには、modprobeを使用してロードするときに使うパラメータを設定します。これらのパラメータには、モジュール名のエイリアス（別名）と自動的に提供されるオプションが含まれます。特定のモジュールをblacklistファイルに登録して、それらがロードされるのを防ぐこともできます。

設定はモジュールのロードまたはアンロード時に適用され、必要に応じて構成を変更できます。

/etc/modprobe.d内のファイルの形式はシンプルです。１行に１つのコマンドがあり、空行と＃で始まる行は無視されます（コメントの追加に便利です）。行の終わりにバックスラッシュがあると、次の行に継続するため、ファイルが少し見やすくなります。


デモ：カーネル モジュール

このビデオでは、Ubuntu 17.04システムでカーネル モジュールに関する情報を取得する方法と、カーネル モジュールをロードおよびアンロードする方法を示します。


演習

課題 26.1: カーネル モジュール

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

【【これ以降は橋本さんの訳を挿入】】

1.  List all currently loaded kernel modules on your system.

2.  Load a currently unloaded module on your system.
If you are running a distribution kernel, this is easy to find; you can simply look in the /lib/modules/<kernel-version>/kernel/drivers/net directory and grab one. (Distribution kernels come with drivers for every device, filesystem, net-work protocol etc.  that a system might need.)However, if you are running a custom kernel you may not have manyunloaded modules compiled.
A choice that will usually work is to pick either e1000.ko or e1000e.ko, as while these gigabit Ethernet drivers are quite common, it is very unlikely both would be loaded at once.

3.  Re-list all loaded kernel modules and see if your module was indeed loaded.

4.  Remove the loaded module from your system.

5.  Re-list again and see if your module was properly removed.

Solution 26.1

1.$ lsmod
2.  In the following, substitute whatever module name you used for e1000e.  Either of these methods work but, of course,the second is easier.
$ sudo insmod /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/e1000e.ko
$ sudo /sbin/modprobe e1000e
3.$ lsmod | grep e1000e
4.  Once again, either method works.
$ sudo rmmod e1000e
$ sudo modprobe -r e1000e
5.$ lsmod | grep e1000e


知識チェック

「第26章 - カーネル モジュール」を完遂しました。おめでとうございます。このクイズに答えて、これまでに学んだ概念の理解度をチェックしてください。

クイズ開始

問題 26.1
ロードされたモジュールを確認するには、どのツールを使用しますか？

A. modprobe
B. modinfo
C. lsmod
D. insmode

問題 26.2
構築済みのモジュール データベースを使用してモジュールをロードまたはアンロードするには、どのツールを使用しますか？

A. modprobe
B. modinfo
C. insmode
D. depmod

問題 26.3
モジュールを直接アンロードするには、どのツールを使用しますか？

A. lsmode
B. modprobe
C. depmod
D. rmmod

問題 26.4
モジュールの依存関係データベースを再構築するには、どのツールを使用しますか？

A. modprobe
B. modinfo
C. depmod
D. rmmod

問題 26.5
モジュールに関する情報を表示するには、どのツールを使用しますか？

A. lsmod
B. modinfo
C. depmod
D. modprobe

