modprobe / lsmod 入門 - カーネルモジュールの確認とロード
この記事で解決できること
lsmodで いまロードされているモジュール を確認できるmodprobeで 依存関係ごとモジュールをロード / アンロード できるmodinfo/blacklist/ 起動時自動ロードまで 実務の型 が身につく
結論(実務の型)
- 状態を見る →
lsmod(読み取り専用、/proc/modulesを整形表示) - ロード / 削除する →
modprobe(依存解決つき。insmod/rmmodは基本使わない) - 設定する →
/etc/modprobe.d/*.conf(オプション・blacklist)//etc/modules-load.d/*.conf(起動時ロード)
前提(対象環境)
- OS:Ubuntu / RHEL 系どちらでも共通
- モジュール本体は
/lib/modules/$(uname -r)/配下に存在 modprobe/modinfoでの変更操作は基本root(sudo)が必要
lsmod とは?
結論:
lsmodは現在ロード済みのカーネルモジュール一覧を表示する読み取り専用コマンド。実体は/proc/modulesの整形出力。
$ lsmod
Module Size Used by nf_conntrack 172032 2 nf_nat,xt_conntrack xfs 2068480 1 vfat 24576 1
列の意味:
- Module:モジュール名
- Size:メモリ上のサイズ(バイト)
- Used by:参照カウントと、依存している側のモジュール名
Used by のカウントが 0 でないモジュールは、他から使用中のためそのままでは外せない。先に依存側を外すか、modprobe -r に依存解決を任せる。
特定モジュールがロード済みか確認したいだけなら grep と組み合わせる。
$ lsmod | grep nf_conntrack
modprobe で何ができるのか?
結論:
modprobeは依存関係を自動解決してモジュールをロード / アンロードする。手動のinsmod/rmmodと違い依存モジュールも面倒を見る。
ロードする
$ sudo modprobe nf_conntrack
依存しているモジュールがあれば、それらも自動で先にロードされる。.ko ファイルのパスを指定する必要はなく、モジュール名だけで済む。
アンロードする(-r)
$ sudo modprobe -r nf_conntrack
-r(--remove)は対象モジュールに加え、それだけが使っていた依存モジュールも一緒に外す。使用中(Used by が非ゼロ)の場合は失敗する。
何が起きるか先に見る(-n -v)
$ modprobe -n -v nf_conntrack
insmod /lib/modules/6.8.0-106-generic/kernel/net/netfilter/nf_conntrack.ko.zst
-n(--dry-run)は実際にはロードせず、-v(--verbose)と組み合わせると 実行されるはずの手順 を表示する。本番前の確認に有効。
modprobe はモジュール本体を /lib/modules/$(uname -r)/ 配下から探す。Module not found が出る場合、稼働カーネルとモジュールのバージョン不一致(カーネル更新後に再起動していない等)を疑う。
insmod / rmmod との違いは?
結論:
insmod/rmmodは単一の.koを直接操作する低レベルコマンド。依存解決をしないため、実務ではmodprobeを使う。
| 操作 | 推奨(依存解決あり) | 低レベル(依存解決なし) |
|---|---|---|
| ロード | modprobe mod |
insmod /path/mod.ko |
| アンロード | modprobe -r mod |
rmmod mod |
| 名前指定 | モジュール名 | フルパス(insmod) |
insmod は依存モジュールを自動ではロードしないため、依存が満たされないと Unknown symbol 等で失敗する。特別な理由がない限り modprobe を使う。
modinfo でモジュールの詳細を見る
結論:
modinfoはモジュールのファイルパス・説明・依存・設定可能パラメータを表示する。ロード前の調査やパラメータ確認に使う。
$ modinfo nf_conntrack
filename: /lib/modules/6.8.0-106-generic/.../nf_conntrack.ko.zst license: GPL description: Netfilter connection tracking core depends: nf_defrag_ipv4,nf_defrag_ipv6,libcrc32c parm: expect_hashsize:uint
注目すべき行:
- depends:依存モジュール(
modprobeが自動解決する対象) - parm:起動時 / ロード時に渡せるパラメータ
- filename:実体の
.koパス(稼働カーネルと一致しているか確認)
パラメータ付きで一時的にロードする例:
$ sudo modprobe nf_conntrack expect_hashsize=2048
モジュールのパラメータや無効化を永続化するには?
結論: 永続設定は
/etc/modprobe.d/*.confに書く。optionsでパラメータ、blacklistで自動ロード抑止を指定する。
パラメータを永続化(options)
/etc/modprobe.d/nf_conntrack.conf:
options nf_conntrack expect_hashsize=2048
モジュールを無効化(blacklist)
特定モジュールの自動ロードを抑止したいとき(例: 競合するドライバを止める)。
/etc/modprobe.d/blacklist-mymod.conf:
blacklist mymod
blacklist は 他モジュールの依存としてロードされる経路までは止めない。完全に阻止したい場合は install mymod /bin/true を併用する。また initramfs に組み込まれるモジュールを止めるには sudo update-initramfs -u(Debian 系)での再生成が必要。
起動時に必ずロードする
/etc/modules-load.d/mymod.conf にモジュール名を1行ずつ書くと、systemd-modules-load.service が起動時にロードする。
nf_conntrack
depmod は何のためにある?
結論:
depmodはモジュール間の依存マップ(modules.dep)を生成する。modprobeの依存解決はこのファイルに依存している。
新しい .ko を /lib/modules/$(uname -r)/ に追加したり、カーネルを更新したときは依存マップを更新する。
$ sudo depmod -a
通常はパッケージ管理(apt / dnf)やカーネル更新時に自動実行されるため、手動で叩くのは独自ビルドのモジュールを入れた場合などに限られる。
トラブルシューティング
結論: 失敗の多くは「バージョン不一致」「使用中」「権限不足」のいずれか。エラー文言から切り分ける。
| 症状 | 主な原因 | 対処 |
|---|---|---|
Module not found |
稼働カーネルと不一致 / 未インストール | uname -r 確認 → 再起動 / depmod -a |
Module ... is in use |
Used by が非ゼロ |
依存側を停止、または modprobe -r(単体 rmmod は不可) |
Operation not permitted |
権限不足 | sudo を付ける |
Unknown symbol in module |
依存未解決(insmod 使用時) |
modprobe を使う / depmod -a |
ロード / アンロード時のカーネル側エラーは dmesg に出る。
$ sudo dmesg | tail
まとめ:確認と操作を分けて考える
結論: 状態確認は
lsmod/modinfo、操作はmodprobe、永続設定は/etc/modprobe.d/と/etc/modules-load.d/に集約する。
- 見る →
lsmod(一覧)/modinfo(詳細) - 操作 →
modprobe(ロード)/modprobe -r(削除) - 設定 →
options(パラメータ)/blacklist(無効化)/modules-load.d(起動時) - 困ったら →
dmesgとmodprobe -n -vで切り分け