定番のシナリオ:接続後に「姿を消す」デバイス
10Gbpsネットワークカードや専用ハードディスクをUbuntuサーバーに装着したばかりだとします。自信を持って ip a や lsblk を入力したものの、画面には何も表示されません。ハードウェアの故障だと急いで結論付けないでください。Linuxがデバイスを認識しているものの、通信するための「通訳」をまだ知らないだけかもしれません。
以前、不安定なRealtek Wifiカードのデバッグで一晩中起きていたことがあります。結局、システムが古いドライバーを誤ってロードして競合を引き起こしていたことが原因でした。OS全体を再インストールして2時間無駄にする代わりに、カーネルモジュールの制御方法を知っていれば、わずか30秒で解決できました。これは、無駄な時間を節約するための不可欠なスキルです。
カーネルモジュール:なぜ一度にすべてのドライバーをロードしないのか?
Linuxカーネルは「モノリシック」なアーキテクチャで構築されていますが、**Loadable Kernel Modules (LKM)** という仕組みのおかげで非常にスマートです。もしLinuxが世界中のあらゆるウェブカメラ、グラフィックスカード、プリンターのドライバーをあらかじめロードしていたら、カーネルファイルは数GBに膨れ上がり、起動した瞬間にRAMを使い果たしてしまうでしょう。
この仕組みは多機能ツールセットのようなものです。普段はペンチとドライバーだけを持ち歩きます。壁に穴を開ける必要がある時だけ、ドリルビットを取り付けます。モジュール(通常は .ko – Kernel Object という拡張子)はまさにそのドリルビットです。システムが本当に必要とした時だけメモリにロードされ、不要になればすぐに取り外してRAMを解放できます。
カーネルを制御するための「強力な」ツールセット
カーネルと対話するために、システム管理者は通常 kmod ツールセットを使用します。以下は、最も実戦的なコマンドです。
1. lsmod – 実行中のモジュールを確認する
システムが何をロードしているか知りたい場合は、 lsmod を使用します。このコマンドは、実際には仮想ファイル /proc/modules からデータを読み取ります。
lsmod | grep -i nvidia
Used by カラムが最も重要です。この数値が0であれば、そのモジュールを安全に削除できます。もし他のモジュールによって使用されている場合は、まずその「依存している」モジュールを先に削除する必要があります。
2. modinfo – 「履歴書」を照会する
正体がわからない未知のモジュールをロードしないでください。例えば、Intelネットワークカードのドライバー e1000e を確認したいとします。
modinfo e1000e
結果にはバージョン、作成者、そして特にパラメータ(parm)が表示されます。多くのドライバーエラーは、この parm 行にある小さなパラメータを変更するだけで解消されます。
3. modprobe – ドライバーのロードと削除を指揮する「指揮者」
古い insmod コマンドのことは忘れてください。 modprobe は依存関係を自動的に解決するため、よりスマートな選択肢です。モジュールAの実行にモジュールBが必要な場合、 modprobe は両方を自動的にロードします。
- モジュールのロード:
sudo modprobe wireguard - モジュールの削除:
sudo modprobe -r wireguard
ヒント:削除できない場合は、 lsof コマンドを使用して、そのハードウェアをハングアップさせている、あるいは使用しているプロセスがないか確認してください。
永続的な設定:再起動後も失われないようにする
modprobe コマンドによる変更はすべて、マシンの再起動時に消えてしまいます。設定を「永続化」するには、システムファイルを編集する必要があります。
起動時にモジュールを自動ロードする
古くなった /etc/modules ファイルを修正する代わりに、現代的な方法は /etc/modules-load.d/ に個別のファイルを作成することです。例えば、nbdドライバーをロードする場合:
echo "nbd" | sudo tee /etc/modules-load.d/nbd.conf
ブラックリスト – エラーを引き起こすドライバーを「締め出す」
これはUbuntuにNVIDIA GPUをインストールする際の典型的なテクニックです。オープンソースドライバーの nouveau は、しばしば自動的にロードされ、公式ドライバーをブロックしてしまいます。これを禁止するには:
# ブラックリストファイルを作成
sudo nano /etc/modprobe.d/blacklist-nouveau.conf
# ファイルの内容
blacklist nouveau
options nouveau modeset=0
# カーネルのキャッシュを更新(必須)
sudo update-initramfs -u
迅速なドライバーエラー解決の4ステップ
デバイスを接続しても動作しない場合は、落ち着いて以下の手順を実行してください:
- カーネルログを確認:
dmesg -T | tail -n 20と入力して直近のエラーを確認します。 - ハードウェアIDを特定:
lspci -nnまたはlsusbを使用します。8086:15d8のような形式の数値は、Googleでドライバーを検索するための正確な識別子です。 - 手動ロードを試行:
modprobeを使用してドライバーの互換性を確認します。 - 設定を固定: すべてが安定したら
/etc/modprobe.d/に反映させます。
カーネルモジュールを理解すれば、Linuxハードウェアの扱いに恐怖を感じることはなくなります。カーネルをレゴブロックの構造体のように考えてください。最高のパフォーマンスを得るために、どのピースでも追加、削除、変更する権利があなたにはあります。

