web-dev-qa-db-ja.com

ドライバモジュールは自動的にロードおよびアンロードされますか?

Ubuntu 14.04では、外部ワイヤレスアダプターを接続しないと、モジュールrt2800usbは引き続きlsmodに表示されます。

  1. ドライバーモジュールの自動読み込みはいつ行われますか?デバイスがコンピュータに接続されたとき、またはOSが起動したときですか?

  2. ドライバーモジュールの自動アンロードはいつ行われますか?デバイスがコンピューターから切断されたとき、またはOSがシャットダウンしたときですか?

15
Tim

カーネルは新しいデバイスを検出すると、プログラム modprobe を実行し、デバイスを識別する名前を渡します。ほとんどのデバイスは、ベンダーやモデルの登録番号を通じて識別されます。 [〜#〜] pci [〜#〜] または [〜#〜] usb [〜#〜] 識別子。 modprobeプログラムは、モジュールエイリアステーブル/lib/modules/VERSION/modules.aliasを調べて、その特定のデバイスのドライバーを含むファイルの名前を見つけます。ファイルシステムや暗号アルゴリズムなど、ハードウェアデバイスではないもののドライバーにも同様の原則が適用されます。詳細については、 Debianが再起動後にシリアルPCIカードを検出しない を参照してください

Modprobeが要求されたドライバーを含むモジュールファイル(.ko)を特定すると、モジュールファイルをカーネルにロードします。モジュールコードは 動的にロードされます カーネルに。モジュールが正常にロードされると、lsmodのリストに表示されます。

カーネルが新しいホットプラグ可能なハードウェアを検出すると、モジュールの自動読み込みが行われます。 USB周辺機器を接続したとき。また、オペレーティングシステムは、起動時に存在する周辺機器のドライバーを読み込むために、起動時にシステムに存在するすべてのハードウェアを列挙するパスも実行します。

modprobeまたはinsmodコマンドを使用して、モジュールのロードを手動で要求することもできます。ほとんどのディストリビューションには、/etc/modulesにリストされているモジュールをロードする起動スクリプトが含まれています。モジュールをロードする別の方法は、モジュールがモジュールの依存関係である場合です。モジュールAがモジュールBに依存している場合、modprobe AはAをロードする前にBをロードします。

モジュールがロードされると、そのドライバーを使用するすべてのデバイスが切断されていても、明示的にアンロードされるまでロードされたままになります。昔、未使用のモジュールを自動的にアンロードするメカニズムがありましたが、覚えていれば、udevが登場したときに削除されました。自動アンロードは一般的な機能ではないのではないかと思います。なぜなら、それを必要とする傾向のあるシステムは、ほとんどの場合(ドライバーコードの規模で)大量のメモリを備えたデスクトップPCだからです。

モジュールは、システムが Initial RAM Disk a.k.a the initrd を介して起動するときにロードされます。

多くのLinuxディストリビューションは、単一の汎用Linuxカーネルイメージを同梱しています。これは、ディストリビューションの開発者が多種多様なハードウェアで起動するために特別に作成したものです。多くのドライバーを1つのカーネルに静的にコンパイルすると、カーネルイメージが非常に大きくなり、メモリが限られているコンピューターでブートするには多すぎるため、この汎用カーネルイメージのデバイスドライバーはロード可能なカーネルモジュールとして含まれています。これにより、ブート時にルートファイルシステムをマウントするために必要なモジュールを検出してロードするという問題が発生します。つまり、ルートファイルシステムがどこにあるか、または何であるかが推測されます。

Ubuntuは他の多くのディストリビューションと同様に、ドライバーが必要かどうかに関係なく、またデバイスがシステムに存在するかどうかに関係なく、すべてのデバイスドライバーをこのinitrdにロードすることを選択します。 Gilesが指摘したように、すべてがRAMに読み込まれ、起動時に使用されたモジュールが検出され、未使用のモジュールはRAMから削除されます。このアプローチを使用すると、セットアップに関係なく、Ubuntuが常にどのシステムでも起動するようになります。 Ubuntuはマイクロカーネルコンストラクトを使用してモノリシックカーネルを模倣しています。参照 これが機能する理由


  1. モジュールrt2800usbは、起動時に常にロードされます。これは、モジュールがGillesが参照する initramfs に含まれていたためです。 initramfsはinitrdの後継であるため、常にlsmodで表示されます。 modprobeの後にモジュール名を指定すると、新しくコンパイルしたモジュールをカーネルに挿入できます。

テストとして、ワイヤレスアダプタを取り外した状態でシステムを再起動します。すべてが順調に進んだ場合、モジュールはlsmods出力にリストされません。起動中にinitramfsおよびinit sstemによって開始された検出プロセスがプローブ中にデバイスを検出せず、モジュールがRAMから削除されたためです。

  1. システムの実行中にモジュールを削除するには、rmmodmodprobe -rなどのコマンドに続けてモジュール名を使用できます。次回の起動時にモジュールがリロードされます。上記を参照。ほとんどの場合、モジュールは動的に削除されません。これにより、ホットプラグが無効になります。つまり、モジュールが削除されると、それを使用しているデバイスは、再接続されたときに再び検出されません。

lsmodからモジュールを削除するには、選択したモジュールなしでカーネルを再コンパイルしてからイメージを再構築することによって作成されたinitramfsイメージからモジュールを削除する必要があります。これを行うと、そのモジュールのすべての検出が無効になります。

5
eyoung100