Ubuntu 14.04では、外部ワイヤレスアダプターを接続しないと、モジュールrt2800usb
は引き続きlsmod
に表示されます。
ドライバーモジュールの自動読み込みはいつ行われますか?デバイスがコンピュータに接続されたとき、またはOSが起動したときですか?
ドライバーモジュールの自動アンロードはいつ行われますか?デバイスがコンピューターから切断されたとき、またはOSがシャットダウンしたときですか?
カーネルは新しいデバイスを検出すると、プログラム 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はマイクロカーネルコンストラクトを使用してモノリシックカーネルを模倣しています。参照 これが機能する理由
rt2800usb
は、起動時に常にロードされます。これは、モジュールがGillesが参照する initramfs に含まれていたためです。 initramfsはinitrdの後継であるため、常にlsmod
で表示されます。 modprobe
の後にモジュール名を指定すると、新しくコンパイルしたモジュールをカーネルに挿入できます。テストとして、ワイヤレスアダプタを取り外した状態でシステムを再起動します。すべてが順調に進んだ場合、モジュールはlsmod
s出力にリストされません。起動中にinitramfsおよびinit sstemによって開始された検出プロセスがプローブ中にデバイスを検出せず、モジュールがRAMから削除されたためです。
rmmod
、modprobe -r
などのコマンドに続けてモジュール名を使用できます。次回の起動時にモジュールがリロードされます。上記を参照。ほとんどの場合、モジュールは動的に削除されません。これにより、ホットプラグが無効になります。つまり、モジュールが削除されると、それを使用しているデバイスは、再接続されたときに再び検出されません。lsmod
からモジュールを削除するには、選択したモジュールなしでカーネルを再コンパイルしてからイメージを再構築することによって作成されたinitramfsイメージからモジュールを削除する必要があります。これを行うと、そのモジュールのすべての検出が無効になります。