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


15

Ubuntu 14.04では、外部ワイヤレスアダプターを接続しないと、そのモジュールrt2800usbがまだ表示されてlsmodいることがわかりました。

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

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

回答:


13

カーネルは新しいデバイスを検出するmodprobeと、プログラムを実行し、デバイスを識別する名前を渡します。ほとんどのデバイスは、PCIUSB識別子など、ベンダーとモデルの登録番号で識別されます。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/modulesrt2800usbはの出力にありlsmod、起動する前にデバイスをコンピューターに接続したということですか?
すべてのStackExchange

1
@Timモジュールがロードされ、あなたが明示的にロードしませんでした、そしてそれはでリストされていない場合/etc/modules、デバイスは、いくつかの点で存在していたので、[はい、おそらくモジュールがロードされている理由があります。
ジル 'SO-悪であるのをやめる'

5

モジュールは、システムが初期RAMディスク(別名initrd)を介してブートするときにロードされます。根拠セクションには次のように記載されています。

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

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


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

テストとして、ワイヤレスアダプタを取り外した状態でシステムを再起動します。すべてがうまくいけば、lsmodブートアップ中にinitramfsとinit stemによって開始された検出プロセスがプローブ中にデバイスを見つけられず、モジュールがRAMから削除されたため、モジュールはs出力にリストされません。

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

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


3
RAMディスクの一部としてファイルをRAMにロードし、実行中のカーネルにモジュールをロード(つまり、動的にリンク)するのは混乱しています。モジュールは、カーネルではなくメモリにinitrd(現在は技術的にはinitramfs)から一時的にロードされますが、実際のルートがマウントされた後にメモリから削除されます。モジュールは、それらを使用するデバイスが検出された場合にのみカーネルにロードされます(いくつかの例外はあります)。
ジル 'SO-悪であるのをやめる'

私はここで同意しますが、彼はUbuntu RAMディスクを再構成することを選択しない限り実行できない1つのモジュールのアンロードとロードについて話していました。すべてのモジュールは毎回ロードされ、すべてが使用されるわけではありません。
eyoung100

2
いいえ、問題はモジュールをカーネルにロードおよびアンロードすることです。元の回答も修正された回答もそれを解決しません。initramfsは、この質問とは無関係です(または、せいぜい周辺で関連性があります)。
ジル「SO-悪であるのをやめる」

@Gillesこれはいいですか??
eyoung100

1
@ eyoung100、私はジルに同意します。initramfsの説明は、質問には関係ありません。モジュールは通常、デバイスを列挙/sysし、システムで実際に見つかったデバイスのドライバーをロードすることでロードされます。これは、デバイスがブート時に存在するか、後でホットプラグされるかに関係なく発生します。udevinitramfs / initrdよりもはるかに多くのことがあり、すべて、ほとんど、または一部のモジュールのみがinitramfs(の構成オプション/etc/initramfs-tools/initramfs.conf)にコピーされるかどうかは特に関係ありません。
セラダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.