Udevが単一のUSBデバイス用に2つのカーネルモジュールをロードするのはなぜですか?

Udevが単一のUSBデバイス用に2つのカーネルモジュールをロードするのはなぜですか?

RTL8153USBイーサネットアダプタに基づいて、cdc_etherこのドライバがデフォルトで使用されています。

r8152RealtekのLinuxドライバソースに示すように、カスタムudevルールを作成してロードできるこのドライバを使用したいと思います。

ただし、アダプターを接続し、モジュールがロードされるcdc_etherr8152混乱する部分があります。私の質問は、

  1. なぜ?
  2. ロードを担当するudevルールを見つける方法はcdc_ether
  3. このモジュールのロードをどのように停止できますか?これは、2つのモジュールをロードする必要がないためです。

Udevルールの1行

ACTION=="add", DRIVER=="r8152", ATTR{idVendor}=="2357", ATTR{idProduct}=="0601", ATTR{bConfigurationValue}!="$env{REALTEK_NIC_MODE}", ATTR{bConfigurationValue}="$env{REALTEK_NIC_MODE}"

このDRIVER==セクションは必須ではありません。

ベストアンサー1

ACTION=="add", DRIVER=="r8152", ATTR{idVendor}=="2357", ATTR{idProduct}=="0601", ATTR{bConfigurationValue}!="$env{REALTEK_NIC_MODE}", ATTR{bConfigurationValue}="$env{REALTEK_NIC_MODE}"

udev ルールは以下を意味します。 「idVendor値が2357でidProduct値が0601のデバイス(ドライバ「r8152」によって管理されている)がシステムに追加されたときにbConfigurationValue環境変数で定義された値でない場合は、その値にREALTEK_NIC_MODE設定してください。」bConfigurationValue

つまり、このudevルールはr8152ドライバをロードしませんが、必要に応じてデバイスをそのドライバの正しいモードに切り替えます。

新しいデバイスが追加されると、Linuxカーネルはデフォルトで要求されたモジュールのmodprobe「名前」でエンコードされたデバイスのハードウェアIDとして機能します。その後、この「名前」は、modprobe各モジュールのモジュールエイリアスとして含まれるワイルドカード文字列と比較されます。このコマンドは、クイック検索のためにdepmodこれらのエイリアスを収集して保存します。/lib/modules/<kernel version>/modules.alias[.bin]このコマンドを使用して、カーネルモジュールに含まれているエイリアス文字列を表示できますmodinfo

USBイーサネットアダプタの場合、「名前」はusb:v2357p0601d...。残念ながら、cdc_etherモジュールに一致するワイルドカードエイリアスがあります。

で定義されているすべてのエイリアスは、組み込みモジュール/etc/modprobe.d自体のエイリアスよりも優先されます。したがって、イーサネットアダプタと一致し、r8152モジュールをロードするエイリアスを指定できます。

次のように追加してみてください/etc/modprobe.d/usbnic.conf

alias usb:v2357p0601d*dc*dsc*dp*ic*isc*ip*in* r8152

その後、rootとして実行し、depmod -aUSBイーサネットアダプタr8152を取り外しcdc_ether、モジュールを取り外して、イーサネットアダプタを再接続し、何が起こるかを確認します。 r8152モジュールだけがロードされていれば大丈夫です。

それでも読み込んでいる場合は、cdc_ether別名を最も具体的にするために別名をより具体的に指定する必要があります(たとえば、1つ以上のアスタリスクを実際の値に置き換える必要があります)。最高の試合。

更新:以下はモジュールエイリアス形式の説明です。http://people.skolelinux.org/pere/blog/Modalias_strings___a_practical_way_to_map__stuff__to_hardware.html

おすすめ記事