Por que o Udev está carregando dois módulos do kernel para um único dispositivo USB?

0

Tenho um adaptador ethernet USB baseado em RTL8153 , que usa o driver cdc_ether por padrão.

Eu quero usar o driver r8152 , que poderia ser carregado criando uma regra personalizada do udev, como presente na fonte do driver Linux do Realtek.

Mas aqui está uma parte confusa, quando eu plugo o adaptador, ambos os módulos cdc_ether e r8152 são carregados. Minhas perguntas são,

  1. Por quê?
  2. Como posso encontrar a regra do udev responsável pelo carregamento de cdc_ether ?
  3. Como posso parar de carregar esse módulo? Como não é necessário carregar dois módulos neste caso.

Uma linha da regra do Udev

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

A parte DRIVER== não é necessária.

    
por Arnab 02.02.2018 / 16:08

2 respostas

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

O significado desta regra do udev é o seguinte: "Quando um dispositivo com idVendor valor 2357 e idProduct valor 0601 (e gerenciado pelo driver" r8152 ") for adicionado ao sistema, se seu bConfigurationValue não for qualquer valor definido na variável de ambiente REALTEK_NIC_MODE , defina seu bConfigurationValue para esse valor. "

Em outras palavras, esta regra do udev não está carregando o driver r8152, ele está alternando o dispositivo para o modo correto para esse driver, se necessário.

Quando um novo dispositivo é adicionado, o kernel Linux basicamente executa modprobe com os IDs de hardware (e algumas outras coisas) do dispositivo codificado no "nome" do módulo solicitado. Esse "nome" é então comparado por modprobe às cadeias curinga incorporadas em cada módulo como aliases do módulo. O comando depmod reúne esses nomes de alias e os armazena em /lib/modules/<kernel version>/modules.alias[.bin] para pesquisa rápida. Você pode ver as cadeias de apelidos embutidas nos módulos do kernel com o comando modinfo .

Para o seu adaptador ethernet USB, o "nome" é algo como usb:v2357p0601d... . Infelizmente, o módulo cdc_ether tem um alias de caractere curinga que também corresponderá a ele.

Todos os alias definidos em /etc/modprobe.d terão precedência sobre os aliases incorporados nos próprios módulos. Portanto, você provavelmente poderia especificar um alias que corresponderia ao seu adaptador ethernet e faria com que o módulo r8152 fosse carregado.

Tente adicionar isso como /etc/modprobe.d/usbnic.conf :

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

Em seguida, execute depmod -a como root, desconecte o adaptador ethernet USB, descarregue os módulos r8152 e cdc_ether , conecte o adaptador Ethernet novamente e veja o que acontece. Se apenas o módulo r8152 estiver carregado, bom.

Se o cdc_ether ainda for carregado também, o alias pode precisar ser mais específico (ou seja, um ou mais dos asteriscos nele precisam ser substituídos por valores reais, sejam eles quais forem) para que esse alias ser o mais específico e, portanto, o "melhor" jogo.

Atualização: Aqui está uma descrição do formato do alias do módulo: por 03.02.2018 / 15:08

3

Há um patch para esse problema em kernels recentes: link

    
por 03.02.2018 / 11:14