Ubuntu 14.04では、外部ワイヤレスアダプターを接続しないと、そのモジュールrt2800usb
がまだ表示されてlsmod
いることがわかりました。
ドライバーモジュールの自動読み込みはいつ行われますか?デバイスがコンピューターに接続されたときですか、OSが起動したときですか?
ドライバモジュールの自動アンロードはいつ行われますか?デバイスがコンピューターから切断されたときですか、OSがシャットダウンしたときですか?
Ubuntu 14.04では、外部ワイヤレスアダプターを接続しないと、そのモジュールrt2800usb
がまだ表示されてlsmod
いることがわかりました。
ドライバーモジュールの自動読み込みはいつ行われますか?デバイスがコンピューターに接続されたときですか、OSが起動したときですか?
ドライバモジュールの自動アンロードはいつ行われますか?デバイスがコンピューターから切断されたときですか、OSがシャットダウンしたときですか?
回答:
カーネルは新しいデバイスを検出するmodprobe
と、プログラムを実行し、デバイスを識別する名前を渡します。ほとんどのデバイスは、PCIやUSB識別子など、ベンダーとモデルの登録番号で識別されます。modprobe
プログラムは、モジュールエイリアステーブルを調べ、その特定のデバイス用のドライバが含まれているファイルの名前を見つけること。同様の原則が、ファイルシステムや暗号化アルゴリズムなど、ハードウェアデバイスではないもののドライバーにも適用されます。詳細については、Debianが再起動後にシリアルPCIカードを検出しないを参照してください。/lib/modules/VERSION/modules.alias
modprobeは.ko
、要求されたドライバーを含むモジュールファイル()を識別すると、モジュールファイルをカーネルにロードします。モジュールコードはカーネルに動的にロードされます。モジュールが正常にロードされると、モジュールのリストに表示されlsmod
ます。
モジュールの自動読み込みは、カーネルが新しいホットプラグ可能なハードウェアを検出したとき、たとえばUSB周辺機器を接続したときに発生します。また、オペレーティングシステムは、起動時にシステムに存在するすべてのハードウェアを列挙するパスを実行して、起動時に存在する周辺機器のドライバーをロードします。
modprobe
または、insmod
コマンドを使用してモジュールのロードを手動で要求することもできます。ほとんどのディストリビューションには、にリストされているモジュールをロードする起動スクリプトが含まれてい/etc/modules
ます。モジュールがロードされるもう1つの方法は、モジュールがモジュールの依存関係である場合です。モジュールAがモジュールBに依存している場合、Aをmodprobe A
ロードする前にBをロードします。
モジュールがロードされると、そのドライバーを使用するすべてのデバイスが切断されても、明示的にアンロードされるまでロードされたままになります。昔、未使用のモジュールを自動的にアンロードするメカニズムがありましたが、正しく覚えていれば、udevが登場したときに削除されました。自動モジュールのアンロードは、それを必要とする傾向があるシステムの大部分が、とにかく(ドライバーコードの規模で)多くのメモリを持つデスクトップPCであるため、一般的な機能ではないと思われます。
/etc/modules
、デバイスは、いくつかの点で存在していたので、[はい、おそらくモジュールがロードされている理由があります。
モジュールは、システムが初期RAMディスク(別名initrd)を介してブートするときにロードされます。根拠セクションには次のように記載されています。
多くのLinuxディストリビューションには、単一の汎用Linuxカーネルイメージが付属しています。これは、ディストリビューションの開発者がさまざまなハードウェアで起動するために特別に作成したものです。この汎用カーネルイメージのデバイスドライバーは、多くのドライバーを1つのカーネルに静的にコンパイルすると、カーネルイメージが非常に大きくなり、メモリが限られているコンピューターで起動するには大きすぎるため、ロード可能なカーネルモジュールとして含まれます。これにより、ブート時にルートファイルシステムをマウントするために必要なモジュールを検出およびロードする問題が発生します。そのため、ルートファイルシステムの場所や内容を推測する必要があります。
Ubuntuは、他の多くのディストリビューションと同様に、ドライバーが必要かどうか、およびデバイスがシステムに存在するかどうかに関係なく、すべてのデバイスドライバーをこのinitrdにロードすることを選択します。Gilesが指摘したように、すべてがRAMにロードされ、使用されたモジュールが起動時に検出され、未使用のモジュールがRAMから削除されます。このアプローチを使用すると、Ubuntuはセットアップに関係なく、どのシステムでも常に起動します。Ubuntuは、マイクロカーネルコンストラクトを使用してモノリシックカーネルを模倣しています。この作品の理由をご覧ください
rt2800usb
は、Gillesが参照したinitramfsに含まれていたため、起動時に常にロードされます。initramfsはinitrdの後継であるため、常にで表示されlsmod
ます。modprobe
モジュール名の後に続けて使用すると、新しくコンパイルされたモジュールをカーネルに挿入できることに注意してください。テストとして、ワイヤレスアダプタを取り外した状態でシステムを再起動します。すべてがうまくいけば、lsmod
ブートアップ中にinitramfsとinit stemによって開始された検出プロセスがプローブ中にデバイスを見つけられず、モジュールがRAMから削除されたため、モジュールはs出力にリストされません。
rmmod
かmodprobe -r
、モジュール名を続けます。次回の起動時に、モジュールがリロードされます。上記を参照。ほとんどの場合、モジュールは動的に削除されません。これはホットプラグを無効にするためです。つまり、モジュールが削除されると、それを使用するデバイスは再接続時に再び検出できなくなります。からモジュールを削除するにはlsmod
、選択したモジュールなしでカーネルを再コンパイルして作成したinitramfsイメージからモジュールを削除する必要があります。これを行うと、上記モジュールのすべての検出が無効になります。
/sys
し、システムで実際に見つかったデバイスのドライバーをロードすることでロードされます。これは、デバイスがブート時に存在するか、後でホットプラグされるかに関係なく発生します。udev
initramfs / initrdよりもはるかに多くのことがあり、すべて、ほとんど、または一部のモジュールのみがinitramfs(の構成オプション/etc/initramfs-tools/initramfs.conf
)にコピーされるかどうかは特に関係ありません。
/etc/modules
。rt2800usb
はの出力にありlsmod
、起動する前にデバイスをコンピューターに接続したということですか?