web-dev-qa-db-ja.com

起動時にLinuxカーネルモジュールを読み込むシーケンスとは何ですか?優先度はどのように設定されていますか?

私は動的にコンパイルしたLinuxカーネルモジュールを持っています。スタートアップにどのように追加されますか?たくさんあります.koファイル/lib/modules。これらのモジュールをロードするための優先順位はどのように設定されますか?

9
ganeshredcobra

それらの多くは起動時にロードされますが、起動時やその他の時点では自動的にロードされません。これが発生するメカニズムは3つあります。

  • serspace request:これは、initサービスからudev、コマンドラインまですべてをカバーします。起動時に特定のモジュールをロードする場合、Initまたはudevがおそらく最も簡単な方法です。

  • Hotplugged device: USBやPCIなどに何かを接続すると、カーネルがこれを検出し、デバイスがそれ自体を識別する方法に基づいて適切なモジュールを要求します。

  • 必要なプロトコルまたはその他の実装:カーネルがファイルシステムの読み取りなどの何かを行う必要があり、そのための知識がないことを発見すると、モジュールを要求します。

最後の2つについては「モジュールのリクエスト」というフレーズを使用していることに注意してください。これは、カーネルが実際に/sbin/modprobeを実行するユーザースペースデーモンkmodを介してロードされるためです。 LinuxカーネルアーキテクチャのWolfgang Mauerer氏によると、2.6カーネルには内部request_module()を呼び出すポイントが100個までしかありません関数。

modprobeは、インストールされたMODULE_ALIASのデータベースを使用します。これらは、モジュールのソースコードで明示的に指定されるか、モジュールが処理するOEMデバイスIDのリストであるMODULE_DEVICE_TABLEから派生します。

11
goldilocks

多くのシステムは initrdまたはinitramfs を使用するように設定されています。これらは、ブートローダーによってロードされ、カーネルがルートパーティションをマウントする前に利用できるようになるファイルシステムイメージです。これにより、ルートパーティションのマウントに必要なドライバー(ディスクドライバー、ファイルシステムドライバー、デバイスマッパー、または論理ボリュームドライバーなど)をモジュールとしてコンパイルし、initrd/initramfsからロードできます。

Initrd(/linuxrc)またはinitramfs(/init)の起動スクリプトは、通常、いくつかのモジュールをロードし、ルートファイルシステムを見つけます。各ディストリビューションには独自のセットアップがあります。 Ubuntuは initramfs を使用します。これはinitramfs-toolsパッケージのコンポーネントからアセンブルされ、ルートファイルシステムをマウントするために必要なドライバーに基づいてカーネルごとに再生成されます。

ルートファイルシステムがマウントされた後、システムのブート中に、/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に追加します。