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


9

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

回答:


11

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

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

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

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

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

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


3

多くのシステムは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/locallocalサブディレクトリが存在しない場合はサブディレクトリを作成します)、実行depmod -aしてエイリアスデータベースを再生成します。カーネルが自動的に検出できない異常な機能用のモジュールの場合は、それを/lib/modules/$VERSION/localにドロップし、実行depmod -aして依存関係を分析し、モジュール名をに追加します/etc/modules


もも見つかりません。/var/lib/modulesまた、/lib/modules/*/localGoogleやdepmodmanページでこれについての言及も見つかりません。CentOS 6.4、7.4およびUbuntu 19.04で見られました。
itadok

@itsadok私は書くつもりだったと確信しています/lib/modules/…localサブディレクトリを作成するだけです(再帰的にdepmod走査します/lib/module/$VERSION)。
Gilles「SO-邪悪なことをやめよ」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.