私RTL8153USBイーサネットアダプタに基づいて、cdc_ether
このドライバがデフォルトで使用されています。
r8152
RealtekのLinuxドライバソースに示すように、カスタムudevルールを作成してロードできるこのドライバを使用したいと思います。
ただし、アダプターを接続し、モジュールがロードされるcdc_ether
とr8152
混乱する部分があります。私の質問は、
- なぜ?
- ロードを担当するudevルールを見つける方法は
cdc_ether
? - このモジュールのロードをどのように停止できますか?これは、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 -a
USBイーサネットアダプタr8152
を取り外しcdc_ether
、モジュールを取り外して、イーサネットアダプタを再接続し、何が起こるかを確認します。 r8152モジュールだけがロードされていれば大丈夫です。
それでも読み込んでいる場合は、cdc_ether
別名を最も具体的にするために別名をより具体的に指定する必要があります(たとえば、1つ以上のアスタリスクを実際の値に置き換える必要があります)。最高の試合。
更新:以下はモジュールエイリアス形式の説明です。http://people.skolelinux.org/pere/blog/Modalias_strings___a_practical_way_to_map__stuff__to_hardware.html
答え2
最近のカーネルにはこの問題に対するパッチがあります。https://lkml.org/lkml/2017/9/25/711