modprobe / lsmod 入門 - カーネルモジュールの確認とロード

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 での変更操作は基本 rootsudo)が必要

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(起動時)
  • 困ったら → dmesgmodprobe -n -v で切り分け

次に読む