🐧 Linux 総合学習プラットフォーム
デバイスドライバ実装 ・ 上級

モジュールの確認と操作

モジュールはコマンドで一覧・調査・着脱ができます。lsmod でいま組み込まれているモジュールの一覧を見て、modinfo で個々のモジュールの情報(作者・ライセンス・依存)を調べます。組み込みは insmod(単体)か modprobe(依存も自動解決)で行い、取り外しは rmmod か modprobe -r を使います。実務では依存関係を自動でたどる modprobe を使うのが基本で、insmod / rmmod は単一の .ko を直接扱う学習・検証向けです。

カーネルモジュールは、専用のコマンド群で一覧を見たり、中身を調べたり、組み込み・取り外しをしたりできます。デバイスドライバの開発や調査では、これらの操作が日々の基本動作になります。まず全体像をつかむと、やることは「いま何が組み込まれているかを見る」「個々のモジュールの素性を調べる」「組み込む」「取り外す」の4つに整理できます。それぞれに対応するコマンドがあり、このうち組み込みと取り外しはシステム全体に影響するため、管理者権限(sudo)を付けて実行する必要があります。ここでは lsmod・modinfo・insmod・rmmod・modprobe の5つを順に見ていきます。どれも、操作の前後に状態を確かめることをセットにすると、何が起きたのかを目で追えて理解が早まります。

いま何が動いているか — lsmod

lsmod は、現在カーネルに組み込まれているモジュールの一覧を表示するコマンドです。出力は3つの列から成り、左からモジュール名、そのモジュールが使っているメモリのサイズ、そして「使用カウントと、それを使っている他のモジュールの名前」が並びます。とくに3列目が読み解きの鍵で、あるモジュールを別のモジュールが頼っている(依存している)場合には、ここにその頼っている側の名前が出ます。使用カウントが0でなければ「いま誰かに使われている最中」という意味になり、これは後で触れる「取り外しが拒まれる」現象の理由を読み解く手がかりになります。組み込んだはずの自作モジュールがこの一覧に出てくるかどうかを見るだけでも、ロードが成功したのかどうかをすぐに確かめられます。なお lsmod が見せている内容は、実体としては /proc/modules というファイルの情報を、人間に読みやすく整形したものです。

素性を調べる — modinfo

modinfo は、個々のモジュールに書き込まれた情報を取り出して表示します。モジュールの中には、誰が作ったのか(author)、どんなライセンスで配布されるのか(license)、何をするものなのか(description)、バージョン、受け付けるパラメータといった「自己紹介」を埋め込めるようになっていて、modinfo はそれを一覧で見せてくれます。便利なのは、すでに組み込まれているかどうかに関わらず、.ko ファイルそのものを引数に渡して調べられる点です。これから組み込もうとしているモジュールが何者なのか、依存している別モジュール(depends として表示されます)は何か、を事前に確かめられます。とりわけライセンスの表示は、そのモジュールがGPLを名乗っているかどうかを示し、カーネル内部の機能をどこまで利用できるかにも関わる、見落とせない情報です。

組み込む — insmod と modprobe

モジュールをカーネルに組み込む(ロードする、と言います)コマンドは2つあります。ひとつめの insmod は、指定した .ko ファイルを「そのまま挿す」素朴なコマンドです。sudo insmod hello.ko のようにファイルを直接指定して読み込み、成功すると登録されている初期化関数が走ります。動きが分かりやすい反面、依存関係は自分では面倒を見てくれません。あるモジュールが別のモジュールを必要としていても、insmod はそれを先に読み込んでくれないため、必要なものを手で先に組み込んでおく必要があります。そのぶん、手元にある単一の .ko を直接扱って挙動を確かめる、という学習・検証の用途には素直で向いています。

もうひとつの modprobe は、依存関係を自動で解決してくれる賢いコマンドです。あらかじめ depmod という仕組みが作っておいた依存表(modules.dep というファイル)を参照し、「このモジュールにはあのモジュールが要る」と判断して、必要な別モジュールを先に組み込んでから目的のモジュールを読み込みます。指定の仕方も insmod とは異なり、ファイルのパスではなく、拡張子 .ko を付けないモジュール名で指定します。対象になるのは、/lib/modules/$(uname -r) というカーネルのバージョンごとのディレクトリの下に、正しく配置されたモジュールだけです。実務では、この自動的な依存解決のおかげで modprobe を使うのが基本になります。

取り外す — rmmod と modprobe -r

組み込んだモジュールを取り外す(アンロードする)には、rmmod を使います。sudo rmmod hello のように、こちらも拡張子を付けないモジュール名を指定します。成功すると、登録されている終了関数が走って後始末が行われ、モジュールがメモリから取り除かれます。ただし、そのモジュールが他のモジュールに使われている最中、つまり先ほどの lsmod で使用カウントが0でない状態だと、巻き添えで不具合が起きるのを防ぐために取り外しは拒否されます。依存関係をたどってまとめて外したいときは modprobe -r を使うと、目的のモジュールに加えて、それに引きずられて不要になった依存モジュールも併せて片付けられます。

使い分けの勘どころ

整理すると、依存関係を自動でたどる modprobe と modprobe -r が実務の基本であり、単一の .ko を直接扱って挙動を確かめたい学習・検証の場面では insmod と rmmod が手軽だ、ということになります。そして、組み込みや取り外しの前後には lsmod で状態を確かめ、組み込む前には modinfo で素性を見ておく——この確認とセットにすると、何が起きたのかを目で追いながら安全に進められます。さらに、組み込みや取り外しがうまくいかないときは、カーネルがエラーの理由をログに残していることが多いので、dmesg と組み合わせて確認するのが定石です。これらのコマンドはカーネルモジュールを扱うあらゆる作業の入口になるので、まず手に馴染ませておきましょう。

この項目に出てくる用語

カーネルモジュールかーねるもじゅーる
あとからカーネルに着脱できる拡張機能。多くのドライバはこの形。

関連コマンド

lsmodmodinfoinsmodrmmodmodprobe

▶ 学習アプリでこの続きを学ぶ・演習する