カーネルモジュール
Linux のカーネルは一枚岩ではなく、必要な機能を後から差し込める作りになっています。この差し込む部品がカーネルモジュールです。101 試験ではコマンドの使い分けが直球で問われ、特に insmod と modprobe、rmmod と modprobe -r の違いが頻出です。実体が置かれているパス、依存関係を記録したファイル名、ブラックリストを書くディレクトリも出題範囲です。
insmod は依存を解決してくれません
| コマンド | 何をするか | 依存関係の解決 |
|---|---|---|
lsmod | 読み込み済みモジュールを一覧する | — |
modinfo <名前> | 説明、作者、パラメータ、依存を表示する | — |
modprobe <名前> | モジュールを読み込む | する |
modprobe -r <名前> | モジュールを取り外す | する |
insmod <ファイルパス> | モジュールファイルを直接読み込む | しない |
rmmod <名前> | モジュールを取り外す | しない |
depmod | 依存関係の一覧を作り直す | — |
insmod は引数にファイルの絶対パスを取り、そのファイルだけを読み込みます。依存する別のモジュールが未ロードなら失敗します。一方 modprobe は名前だけ与えれば、必要な下位モジュールを自動でたどります。実務でも試験でも、基本は modprobe が答えです。
| オプション | 意味 |
|---|---|
-n | 実際には実行せず、何をするかだけを見せる (dry run) |
-v | 実行するコマンドを表示する |
-r | 取り外す |
-f | バージョン不一致でも強制する |
-n -v を組み合わせると、何も変えずに「読み込むとしたら何が起きるか」を確かめられます。壊したくない機械で試すときの定石です。
ターミナル
modprobe -n -v loop
# insmod /lib/modules/6.1.0-52-686/kernel/drivers/block/loop.koモジュールの置き場所と依存ファイル
実体は /lib/modules/$(uname -r)/ 以下に、カーネルのソースツリーと同じ構造で置かれています。拡張子は .ko (kernel object) で、.ko.xz と圧縮されていることもあります。
依存関係は同じディレクトリの modules.dep に記録されています。このファイルを作り直すのが depmod です。新しいモジュールを手で置いたのに modprobe が見つけてくれないときは depmod -a を実行します。
読み込み済みモジュールの情報源は /proc/modules で、lsmod はこれを整形して見せているだけです。lsmod の Used by 列には、そのモジュールに依存している別のモジュール名が並びます。この列が空でないモジュールは、依存元を先に外さないと取り外せません。
読み込みを止める設定
/etc/modprobe.d/ 以下に .conf で終わるファイルを置くと、modprobe の挙動を変えられます。
| 書式 | 意味 |
|---|---|
blacklist <名前> | そのモジュールの自動読み込みを禁止する |
options <名前> <パラメータ>=<値> | 読み込み時のパラメータを固定する |
ターミナル
# /etc/modprobe.d/no-pcspkr.conf
blacklist pcspkrblacklist が止めるのは自動読み込みだけで、管理者が明示的に modprobe pcspkr と打てば読み込まれます。完全に禁止するなら install pcspkr /bin/true と書きます。逆に起動時へ必ず読み込ませたいモジュールは /etc/modules-load.d/ 以下に1行ずつ書き、Debian 系では /etc/modules も同じ役目です。
演習では動作中のモジュールを外しません。今のファイルシステムやディスクを支えているモジュールを外すと学習環境が不安定になるので、調べる操作と dry run と設定ファイルの記述にとどめます。
よくある引っかけ
insmod に名前だけを渡す選択肢は誤りです。insmod はファイルパスを取り、名前で指定できるのは modprobe の方です。
rmmod は依存関係を見ないので、他のモジュールから使われているものを外そうとすると失敗します。安全なのは modprobe -r です。
modinfo は読み込まれていないモジュールにも実行できます。「読み込み済みでないと情報が見られない」は誤りです。逆に lsmod は読み込み済みしか出しません。
そして depmod はモジュールを読み込むコマンドではありません。依存関係の索引を作り直すだけです。