それらの多くは起動時にロードされますが、起動時やその他の時点で自動的にロードされることはありません。これには、次の 3 つの異なるメカニズムがあります。
-
ユーザー空間リクエスト: これは、init サービスから udev、コマンドラインまですべてをカバーしています。起動時に特定のモジュールをロードしたい場合は、おそらく init または udev が最も簡単な手段です。
-
ホットプラグされたデバイス: USB や PCI などに何かを接続すると、カーネルがこれを検出し、デバイス自体の識別方法に基づいて適切なモジュールを要求します。
-
必要なプロトコルまたはその他の実装 :ファイルシステムの読み取りなど、カーネルが何かを行う必要があり、それを行うための知識が不足していることを発見すると、カーネルはモジュールを要求します。
最後の 2 つは「モジュールをリクエストする」というフレーズを使用していることに注意してください。これは、カーネルがユーザー空間デーモン kmod
を介して実際にロードされるためです。 /sbin/modprobe
を実行します . Linux Kernel Architecture の Wolfgang Mauerer によると 、内部 request_module()
を呼び出す 2.6 カーネルには ~100 の異なるポイントしかありません。 関数。
modprobe
インストールされた MODULE_ALIAS のデータベースを使用します。これらは、モジュールのソース コードで明示的に指定されるか、モジュールがサービスを提供する OEM デバイス ID のリストである MODULE_DEVICE_TABLE から派生します。
多くのシステムは、initrd または initramfs を使用するように設定されています。これらは、ブートローダーによってロードされ、ルート パーティションをマウントする前にカーネルで使用できるようになるファイル システム イメージです。これにより、ルート パーティションのマウントに必要なドライバー (ディスク ドライバー、ファイルシステム ドライバー、デバイス マッパー、または論理ボリューム ドライバーなど) をモジュールとしてコンパイルし、initrd/initramfs からロードできます。
initrd の起動スクリプト (/linuxrc
) または initramfs (/init
) は通常、いくつかのモジュールをロードし、ルート ファイルシステムを見つけます。各ディストリビューションには独自のセットアップがあります。 Ubuntu は、initramfs-tools
のコンポーネントから組み立てられた initramfs を使用します。 ルート ファイルシステムをマウントするために必要なドライバーに基づいて、カーネルごとにパッケージ化され、再生成されます。
ルートファイルシステムがマウントされた後、システムの起動中に /etc/modules
にリストされているモジュール (Debian など) または /etc/modules.conf
(Red Hat、Arch など) がロードされます。このファイルには、通常、いくつかのモジュールがリストされています。ほとんどのモジュールはオンデマンドでロードされます。
カーネルは、ドライバーが不足しているハードウェアや、ネットワーク プロトコルや暗号化アルゴリズムなどの他の特定のコンポーネントを検出すると、/sbin/modprobe
を呼び出します。 モジュールをロードします。ハードウェア ドライバーの場合、カーネルは、PCI ID、USB ID、またはその他のハードウェアの体系的な指定をエンコードする名前を渡します。 /lib/modules/$VERSION/modules.alias
に表があります これらの体系的な指定をモジュール名にマップします。このテーブルは depmod
によって生成されます modprobe
によって読み取られます .
ハードウェア デバイス用に手動でコンパイルした追加のカーネル モジュールがある場合は、それを /lib/modules/$VERSION/local
にドロップします。 (local
を作成します 存在しない場合はサブディレクトリ)、depmod -a
を実行します。 エイリアス データベースを再生成します。モジュールがカーネルが自動的に検出できない異常な機能のためのものである場合は、それを /lib/modules/$VERSION/local
にドロップします。 、 depmod -a
を実行します 依存関係を分析し、モジュール名を /etc/modules
に追加します .