Linux におけるカーネルモジュールの管理

CompTIABeginner
オンラインで実践に進む

はじめに

この実験では、Linux 環境においてカーネルモジュールを管理するための基本的な技術を習得します。まず、現在ロードされているモジュールを一覧表示してシステムの稼働中のコンポーネントを確認する方法や、個々のモジュールを調査してその目的、依存関係、その他のパラメータなどの詳細を理解する方法を探索します。

これらの調査スキルを習得した後は、実行中のカーネルから動的にモジュールをアンロード(削除)したりロード(挿入)したりする実習を行います。最後に、特定のカーネルモジュールがシステムの起動時に自動的にロードされるように設定する方法を学び、再起動後も手動操作なしで必要な機能が利用できるようにします。

lsmod と modinfo によるカーネルモジュールの表示と調査

このステップでは、現在ロードされているカーネルモジュールを一覧表示し、その詳細を調査する方法を学びます。Linux カーネルはモジュール式(モジュラー構造)であり、必要に応じて機能の一部をロードまたはアンロードできます。これらの動的にロード可能な部品はカーネルモジュールと呼ばれ、多くの場合、デバイスドライバ、ファイルシステムドライバ、またはシステムコールに対応しています。

まず、システムのカーネルに現在ロードされているすべてのカーネルモジュールの状態を確認しましょう。lsmod コマンドを使用すると、クリーンで読みやすいリストが表示されます。リストが非常に長くなる場合があるため、出力を less ユーティリティにパイプして、ナビゲーションしやすくします。

ターミナルで次のコマンドを実行してください。

lsmod | less

モジュールのリストが表示されます。出力は Module(モジュール名)、Size(サイズ)、Used by(使用元)の 3 つの列で構成されています。

  • Module: カーネルモジュールの名前。
  • Size: モジュールのサイズ(バイト単位)。
  • Used by: このモジュールを現在使用している他のモジュールまたはプロセスの数。その後に依存しているモジュールのリストが続きます。

出力は以下のようになります。

Module                  Size  Used by
nls_iso8859_1          16384  1
nls_cp437              20480  1
vfat                   20480  1
fat                    69632  1 vfat
...

矢印キーを使用してリストをスクロールできます。q を押すと less ビューアを終了し、コマンドプロンプトに戻ります。

モジュールのリスト表示方法がわかったところで、特定のモジュールに関する詳細情報を取得してみましょう。modinfo コマンドは、ファイル名、ライセンス、説明、作成者、依存関係など、カーネルモジュールに関するさまざまな詳細を表示します。

パラレルポートに関連する parport モジュールを調べてみましょう。

modinfo parport

コマンドを実行すると、parport モジュールに関する詳細情報が表示されます。

filename:       /lib/modules/x.x.x-xx-generic/kernel/drivers/parport/parport.ko
license:        GPL
description:    Parallel port driver
author:         Philip Blundell, Tim Waugh, Grant Grundler
srcversion:     <some_version_string>
depends:
retpoline:      Y
intree:         Y
vermagic:       x.x.x-xx-generic SMP mod_unload
sig_id:         ...
signer:         ...
sig_key:        ...
sig_hashalgo:   ...
signature:      ...

この出力から、モジュールファイル(.ko ファイル)の正確な場所、ライセンス、簡単な説明などがわかります。depends フィールドが空であることに注目してください。これは、このモジュールに依存関係がないことを示しています。

モジュールは他のモジュールに依存することがよくあります。depmod コマンドは、/lib/modules/$(uname -r) 内のモジュールを分析して、モジュールの依存関係リストを作成します。これにより、システムは必要なモジュールを自動的にロードできるようになります。この依存関係ファイルを生成してみましょう。このコマンドにはルート権限が必要なため、sudo を使用します。

sudo depmod

このコマンドは、正常に完了した場合には通常何も出力しません。カーネルのモジュールディレクトリ内に modules.dep という名前のファイルを作成または更新します。パスの $(uname -r) 部分は、現在のカーネルのリリースバージョンを挿入するコマンド置換です。

次に、作成した依存関係ファイルを確認してみましょう。

less /lib/modules/$(uname -r)/modules.dep

このファイルには、モジュールとその依存関係のリストが含まれており、モジュールを自動的に管理するツールによって使用されます。q を押すと less を終了できます。

rmmod によるカーネルモジュールのアンロード

このステップでは、rmmod コマンドを使用して、実行中のカーネルからカーネルモジュールをアンロード(削除)する方法を学びます。モジュールのアンロードは、ハードウェアの問題のトラブルシューティング、システムメモリの解放、またはモジュールが不要になった場合に役立ちます。システムや他のモジュールによって現在使用されていないモジュールのみをアンロードできる点に注意してください。

ジョイスティックのサポートを提供する joydev モジュールを使用して進めましょう。まず、このモジュールがロードされているかどうかを確認します。lsmodgrep を組み合わせて出力をフィルタリングします。

lsmod | grep joydev

モジュールがロードされている場合、以下のような出力が表示されます。正確なサイズは異なる場合があります。

joydev                 24576  0

Used by 列の 0 は、モジュールはロードされているが、現在どのプロセスや他のモジュールからも使用されていないことを示しています。これにより、安全に削除できる候補となります。この数値が 0 より大きい場合、rmmod は失敗する可能性が高く、システムが依存しているモジュールをアンロードできないようになっています。

では、joydev モジュールを削除しましょう。この操作は実行中のカーネルを変更するため、sudo を使用してルート権限で実行する必要があります。

sudo rmmod joydev

rmmod コマンドは、成功した場合には通常何も出力しません。モジュールが正常にアンロードされたことを確認するために、再度同じ lsmod | grep joydev コマンドを実行します。

lsmod | grep joydev

今回は、コマンドを実行しても何も出力されないはずです。何も表示されないことが、joydev モジュールがカーネルにロードされていないことの確認となります。

insmod によるカーネルモジュールのロード

このステップでは、insmod コマンドを使用して、実行中のカーネルに手動でカーネルモジュールをロード(挿入)する方法を学びます。これは rmmod の対になる操作です。現代のシステムでは、依存関係を自動的に処理する modprobe というより高度なツールがよく使われますが、insmod を理解することはカーネルモジュールの仕組みを学ぶ上で基本となります。

前のステップで joydev モジュールをアンロードしました。今度はそれをロードし直します。insmod コマンドを使用するには、拡張子が .ko (Kernel Object) であるモジュールのオブジェクトファイルへのフルパスを指定する必要があります。

カーネルモジュールの標準ディレクトリは /lib/modules/$(uname -r)/kernel/ です。ここで $(uname -r) は現在のカーネルバージョンに展開されます。joydev モジュールは通常、drivers/input/ サブディレクトリに配置されています。

フルパスを使用して joydev モジュールをロードしましょう。この操作にはルート権限が必要です。

sudo insmod /lib/modules/$(uname -r)/kernel/drivers/input/joydev.ko

rmmod と同様に、insmod も成功した場合には何も出力しません。

モジュールがロードされたことを確認するには、再び lsmod | grep joydev コマンドを使用します。

lsmod | grep joydev

コマンド実行後、出力に joydev モジュールが表示されれば、カーネルに正常にロードされたことが確認できます。

joydev                 24576  0

起動時にカーネルモジュールを自動ロードするように設定する

このステップでは、システムが起動するたびにカーネルモジュールが自動的にロードされるようにする方法を学びます。insmod による手動ロードは一時的なものであり、再起動後は保持されません。変更を永続的にするには、起動プロセス中にモジュールをロードするようにシステムを設定する必要があります。

systemd を使用する現代の Linux システムでは、起動時にカーネルモジュールを自動ロードする標準的な方法は、/etc/modules-load.d/ ディレクトリに設定ファイルを追加することです。このディレクトリ内にある .conf 拡張子を持つすべてのファイルが読み取られ、システムはその中に記述された各モジュール(1 行に 1 つ)をロードしようとします。

joydev モジュールが自動的にロードされるように設定しましょう。/etc/modules-load.d/ 内に joydev.conf という名前のファイルを作成し、その中に joydev という単語を追加します。echoteesudo と組み合わせて、1 つのコマンドで実行できます。

echo joydev | sudo tee /etc/modules-load.d/joydev.conf

このコマンドの動作は以下の通りです:

  • echo joydev は 'joydev' というテキストを出力します。
  • パイプ | は、このテキストを次のコマンドの入力として送ります。
  • sudo tee /etc/modules-load.d/joydev.conf はテキストを受け取ります。tee コマンドは、受け取った入力を指定されたファイル (/etc/modules-load.d/joydev.conf) に書き込むと同時に、画面にも表示します。このディレクトリは保護されており書き込みにルート権限が必要なため、sudo を使用しています。

ファイルに書き込まれた内容として、以下の出力が表示されるはずです:

joydev

ファイルが正しく作成されたことを確認するために、cat コマンドを使用して内容を表示します。

cat /etc/modules-load.d/joydev.conf

出力は、先ほど追加したモジュール名になるはずです:

joydev

これで、システムが起動するたびに joydev モジュールが自動的にロードされるようになります。モジュールの永続的なロード設定が正常に完了しました。

まとめ

この実験では、Linux 環境におけるカーネルモジュール管理の基本操作を学びました。lsmod コマンドを使用して現在ロードされているすべてのモジュールを一覧表示し、modinfo コマンドを使用して特定のモジュールのファイル名や説明などの詳細情報を調査する実習を行いました。

また、rmmod によるモジュールのアンロードや insmod によるロードを通じて、実行中のカーネルを動的に変更する実践的な経験を積みました。最後に、モジュールを起動時に自動ロードするように設定する方法を学び、システム再起動後も必要なドライバや機能が利用可能であることを保証する方法を習得しました。これらのスキルは、デバイスドライバやカーネル機能を効果的に管理するために不可欠です。