Linuxのカーネルモジュールを管理する方法|lsmod・modprobeで確認・ロード・ブラックリスト設定と永続化

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, カーネル管理 > Linuxのカーネルモジュールを管理する方法|lsmod・modprobeで確認・ロード・ブラックリスト設定と永続化
「新しいNICを挿したのにLinuxが認識しない」「サーバー起動後に特定のドライバが読み込まれていない」。こうしたハードウェア認識の問題に直面したとき、原因の切り口を知らないと途方に暮れてしまいます。
「再起動したらまた同じ問題が再発した」「ブラックリストに追加したのにまだ読み込まれる」という声も現場でよく聞きます。

Linuxはドライバや機能の大部分を「カーネルモジュール」として動的に管理しています。この仕組みを理解すれば、デバイス認識からドライバ競合の解決まで、原因を体系的に追えるようになります。

この記事では、カーネルモジュール管理の中心となる lsmodmodinfomodprobe の使い方から、起動時の自動ロード設定(/etc/modules-load.d/)、ブラックリスト設定(/etc/modprobe.d/)、よくあるトラブルの切り分け手順まで、RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した内容を解説します。

この記事のポイント

・lsmod でロード済みモジュール一覧、modinfo で詳細情報を確認できる
・modprobe でモジュールを手動ロード・アンロード(依存関係も自動処理)
・/etc/modules-load.d/ に書けば OS 起動時に自動でモジュールが読み込まれる
・完全にモジュールを無効化するには blacklist だけでなく install 行が必要な場合がある


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

カーネルモジュールとは何か

Linuxカーネルは、ハードウェアドライバやファイルシステム、ネットワークプロトコルなどの機能を「モジュール」という形で分離して管理しています。モジュールは必要なときだけカーネルに読み込み(ロード)、不要になれば取り外す(アンロード)ことができます。

NIC(ネットワークアダプタ)ドライバ: 例)e1000e、ixgbe、virtio_net
ファイルシステム: 例)xfs、ext4、nfs
USB・PCIeデバイスドライバ: 例)usbcore、ahci
セキュリティ機能: 例)ip_tables、nf_conntrack

モジュールファイルは /lib/modules/$(uname -r)/ 配下に .ko(または .ko.xz)形式で格納されています。OS起動時に自動でロードが必要なものはinitramfs(dracut)が処理し、起動後に追加が必要なものは modprobe コマンドで手動ロードします。

# 現在のカーネルバージョンに対応するモジュールディレクトリを確認する ls /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/ | head -5

モジュールの依存関係は /lib/modules/$(uname -r)/modules.dep に定義されており、modprobe はこのファイルを参照して依存モジュールも一括でロードします。

現在のモジュール状況を確認する

1. lsmodでロード済みモジュール一覧を確認する

lsmod は現在カーネルにロードされているモジュールの一覧を表示します。出力は「モジュール名 / サイズ / 使用数 / 参照しているモジュール」の4列です。

# ロード済みモジュール一覧を表示する $ lsmod Module Size Used by xt_MASQUERADE 16384 1 nf_nat 57344 1 xt_MASQUERADE nf_conntrack 172032 3 nf_nat,xt_MASQUERADE,nft_ct ixgbe 372736 0 mdio 16384 1 ixgbe

「Used by」列が 0 のモジュールは、現在ほかのモジュールから依存されていないため、アンロード可能な状態です。

特定のモジュールが読み込まれているか確認したいときは grep を組み合わせます。

# 特定モジュールの有無を確認する $ lsmod | grep ixgbe ixgbe 372736 0 # 何も表示されなければロードされていない $ lsmod | grep dummy (出力なし)

2. modinfo でモジュールの詳細情報を調べる

modinfo は指定したモジュールのメタデータ(説明・バージョン・対応デバイスID・使用可能なパラメータ)を表示します。どのドライバがどのハードウェアに対応しているかを調べるときに役立ちます。

# モジュールの詳細情報を表示する $ modinfo ixgbe filename: /lib/modules/5.14.0-427.el9.x86_64/kernel/drivers/net/ethernet/intel/ixgbe/ixgbe.ko.xz version: 5.20.3 description: Intel(R) 10 Gigabit PCI Express Network Driver author: Intel Corporation, <linux.nics@intel.com> license: GPL v2 vermagic: 5.14.0-427.el9.x86_64 SMP preempt mod_unload parm: InterruptThrottleRate:Maximum interrupts per second ... (array of uint) parm: MQ:Disable or enable Multiple Queues (array of int)

「parm」行に表示されるパラメータは modprobe ロード時またはmodprobe.dの設定ファイルで指定できます。

3. dmesgでデバイス認識の状況を確認する

モジュールが読み込まれているかどうかだけでなく、実際にデバイスとして認識されているかを確認するには dmesg を参照します。NICやストレージデバイスが認識された際のログが記録されています。

# ドライバ関連のカーネルメッセージを確認する $ dmesg | grep -i "driver\|firmware\|ixgbe" | head -10 [ 3.421893] ixgbe 0000:03:00.0: Multiqueue Enabled: Rx Queue count = 4, Tx Queue count = 4 XDP Queue count = 0 [ 3.451204] ixgbe 0000:03:00.0: Intel(R) 10 Gigabit Network Connection [ 3.471338] ixgbe 0000:03:00.0 eth0: registered PHC device # ファームウェアの読み込みエラーを確認する $ dmesg | grep -i "firmware\|failed to load"

「failed to load firmware」のようなメッセージが出ている場合は、ドライバ自体はロードされているが、対応するファームウェアファイルが /lib/firmware/ 配下に存在しない可能性があります。

modprobeでモジュールをロード・アンロードする

1. モジュールをロードする

手動でモジュールをロードするには modprobe モジュール名 を使います。insmod との大きな違いは、modprobe が依存関係を自動解決してくれる点です。本番環境では常に modprobe を使いましょう。

# モジュールをロードする(依存モジュールも自動でロードされる) $ sudo modprobe dummy # ロードされたことを確認する $ lsmod | grep dummy dummy 16384 0 # パラメータを指定してロードする(例:dummyの仮想NIC数を2に設定) $ sudo modprobe dummy numdummies=2

ロードが成功すれば何もメッセージは表示されません。エラーが出た場合は次のトラブルシュートセクションを参照してください。

2. モジュールをアンロードする(modprobe -r)

アンロードには modprobe -r または rmmod を使います。modprobe -r は依存関係を確認しながら安全にアンロードするので、こちらを推奨します。

# モジュールをアンロードする $ sudo modprobe -r dummy # rmmodも同様に使える(依存関係の自動解決はしない) $ sudo rmmod dummy # アンロード後に確認する $ lsmod | grep dummy (出力なし=アンロード済み)

3. 依存関係があるモジュールを扱う

あるモジュールが他のモジュールから使用されている(「Used by」列が0でない)場合は、アンロードできません。まず依存しているモジュールを先にアンロードする必要があります。

# 依存があるモジュールをアンロードしようとするとエラーになる $ sudo rmmod nf_conntrack rmmod: ERROR: Module nf_conntrack is in use by: nf_nat xt_MASQUERADE nft_ct # modprobeの依存ツリーを確認する $ modprobe --show-depends nf_nat insmod /lib/modules/5.14.0-427.el9.x86_64/kernel/net/netfilter/nf_conntrack.ko.xz insmod /lib/modules/5.14.0-427.el9.x86_64/kernel/net/netfilter/nf_nat.ko.xz

modprobe -r を使えば依存するモジュールも含めてアンロードを試みますが、他のプロセスがそのモジュールを使用中の場合はエラーになります。その際は、使用中のサービスを停止してから再度アンロードを試みてください。

起動時に自動ロードされるよう永続化する

/etc/modules-load.d/ に設定ファイルを置く

手動でロードしたモジュールは再起動すると消えてしまいます。OS起動時に自動でロードさせるには /etc/modules-load.d/ 配下に .conf ファイルを作成します。systemd の systemd-modules-load.service がこのディレクトリを参照してモジュールをロードします。

# /etc/modules-load.d/ 配下に設定ファイルを作成する # ファイル名は任意(.conf拡張子が必要) $ sudo vi /etc/modules-load.d/mymodules.conf # 内容:1行に1モジュール名を記述する(#はコメント行) # カスタムモジュール設定 dummy br_netfilter

# 設定を反映させる(再起動なしで即時ロード) $ sudo systemctl restart systemd-modules-load.service # ロードされたか確認する $ lsmod | grep dummy dummy 16384 0

この方法で設定したモジュールは、次回OS起動時から自動でロードされます。Kubernetes環境での br_netfilter や仮想化環境での kvm_intel(または kvm_amd)など、インフラ要件で必要なモジュールを永続化する際に使います。

起動プロセスの詳細や起動時間の分析については、systemd-analyze で起動時間計測の記事も参考にしてください。

modprobe.d でパラメータ設定とブラックリスト

モジュールオプションを設定する

/etc/modprobe.d/ 配下の .conf ファイルに options 行を書くことで、モジュールロード時のパラメータを固定できます。手動ロードで毎回オプションを指定する手間が省けます。

# /etc/modprobe.d/ixgbe.conf を作成してパラメータを設定する $ sudo vi /etc/modprobe.d/ixgbe.conf # 内容:options キーワード + モジュール名 + パラメータ options ixgbe InterruptThrottleRate=0

設定後は modprobe -r ixgbe でアンロードしてから modprobe ixgbe で再ロードすると、新しいパラメータが適用されます。NICドライバの割り込み調整やサウンドカードのデフォルト出力チャンネル変更などで活用します。

モジュールをブラックリストに登録する

競合ドライバや不要なモジュールを起動時から除外するには blacklist キーワードを使います。以下の例は、古いドライバ(nouveau)がNVIDIA公式ドライバと競合する場合に排除するパターンです。

# /etc/modprobe.d/blacklist-nouveau.conf を作成する $ sudo vi /etc/modprobe.d/blacklist-nouveau.conf # 内容:blacklist キーワード + モジュール名 blacklist nouveau blacklist lbm-nouveau

ただし、blacklist だけでは「自動ロードを抑制する」効果しかありません。他のモジュールが依存関係で引き込んだ場合や、手動で modprobe nouveau を実行した場合はロードされてしまいます。

完全にモジュールを無効化したい場合は、blacklist に加えて install 行でダミーコマンドを指定します。

# 完全無効化:install行でロードを/bin/trueに置き換える blacklist nouveau install nouveau /bin/true

この設定により、modprobe nouveau を実行しても /bin/true が実行されるだけでモジュールは読み込まれません。設定変更後は dracut -f(RHEL系)または update-initramfs -u(Debian/Ubuntu系)でinitramfsを再生成し、再起動して反映させます。

# RHEL/CentOS/Rocky Linux: initramfsを再生成する $ sudo dracut -f # Debian/Ubuntu: initramfsを更新する $ sudo update-initramfs -u # 再起動して設定を反映する $ sudo reboot

トラブルシュート・エラー対処

「FATAL: Module xxx not found in directory」が出る

指定したモジュール名が存在しない、またはカーネルバージョンに対応するモジュールがない場合に発生します。

$ sudo modprobe hoge_driver modprobe: FATAL: Module hoge_driver not found in directory /lib/modules/5.14.0-427.el9.x86_64

切り分け手順:

・モジュール名のスペルを確認する(find /lib/modules/$(uname -r)/ -name "*hoge*" で探す)
・カーネルヘッダやドライバパッケージがインストールされているか確認する
・RHEL系なら dnf install kernel-modules-extra で追加モジュールを入れる
・現在動作中のカーネルと /lib/modules/ のディレクトリが一致しているか確認する(uname -r vs ls /lib/modules/

# モジュールファイルをキーワードで探す $ find /lib/modules/$(uname -r)/ -name "*.ko*" | xargs -I{} basename {} .ko.xz | grep -i "virtio" virtio_blk virtio_net virtio_scsi

モジュールが見つかった場合は正確なモジュール名で再試行します。見つからない場合は、該当ドライバを含むパッケージを確認します。

# RHEL系:ドライバが含まれるパッケージを調べる $ rpm -qf /lib/modules/$(uname -r)/kernel/drivers/net/virtio_net.ko.xz kernel-core-5.14.0-427.el9.x86_64 # パッケージが不足している場合はインストールする $ sudo dnf install kernel-modules-extra

RPMパッケージの照会については、rpm コマンドの使い方も参照してください。

ブラックリストに追加したのに読み込まれる

blacklist のみでは、依存関係で自動的に引き込まれる場合には効果がありません。前節で説明した install モジュール名 /bin/true の追加と、initramfsの再生成・再起動を行ってください。

# ブラックリスト設定後に再起動してから確認する $ lsmod | grep nouveau (出力なし=正常に除外済み) # もし依然として読み込まれる場合はinstall行を追加する $ cat /etc/modprobe.d/blacklist-nouveau.conf blacklist nouveau install nouveau /bin/true # initramfsを再生成してから再起動する $ sudo dracut -f && sudo reboot

「ERROR: Module xxx is in use」が出る

他のモジュールやプロセスが対象モジュールを使用中の場合にアンロードできません。

$ sudo modprobe -r nf_conntrack modprobe: FATAL: Module nf_conntrack is in use. # lsmodで依存しているモジュールを確認する $ lsmod | grep nf_conntrack nf_conntrack 172032 3 nf_nat,xt_MASQUERADE,nft_ct # 依存モジュール(nf_nat, xt_MASQUERADE, nft_ct)を先にアンロードする $ sudo modprobe -r nft_ct xt_MASQUERADE nf_nat $ sudo modprobe -r nf_conntrack

iptables/nftablesのルールがアクティブな状態でコネクショントラッキング関連モジュールを外そうとしても失敗します。その場合は iptables -F または nft flush ruleset でルールをクリアしてからアンロードを試みます。

本記事のまとめ

カーネルモジュール管理の要点をまとめます。

やりたいこと コマンド・設定方法
ロード済みモジュール一覧を確認する lsmod
特定モジュールがロードされているか確認する lsmod | grep モジュール名
モジュールの詳細・パラメータを調べる modinfo モジュール名
モジュールを手動でロードする modprobe モジュール名
モジュールをアンロードする modprobe -r モジュール名
起動時に自動ロードを永続化する /etc/modules-load.d/ に .conf ファイルを作成
ロード時オプションを固定する /etc/modprobe.d/ に options 行を記述
モジュールの自動ロードを抑制する /etc/modprobe.d/ に blacklist 行を記述
モジュールを完全に無効化する blacklist 行 + install モジュール名 /bin/true
ブラックリスト設定をinitramfsに反映する dracut -f(RHEL系)/ update-initramfs -u(Debian系)後に再起動

カーネルモジュールを含むLinux基盤の仕組みを体系的に理解したい方へ

カーネルモジュールはLinuxのドライバ・ファイルシステム・ネットワーク機能の核心部分です。断片的に覚えるより、「Linuxがどのように動いているか」を体系的に理解することで、デバイス認識トラブルやドライバ競合が起きても自力で解決できるエンジニアになれます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。