Eu tenho um adaptador ethernet USB baseado em RTL8153cdc_ether
, que usa o driver por padrão.
Eu quero usar o r8152
driver, que pode ser carregado criando uma regra udev personalizada, conforme presente na fonte do driver linux da Realtek.
Mas aqui está a parte confusa, quando eu conecto o adaptador, ambos os módulos cdc_ether
e são carregados. r8152
Minhas perguntas são,
- Por quê?
- Como posso encontrar a regra udev responsável pelo carregamento
cdc_ether
? - Como posso parar de carregar esse módulo? Como não é necessário carregar dois módulos neste caso.
Uma linha da regra Udev
ACTION=="add", DRIVER=="r8152", ATTR{idVendor}=="2357", ATTR{idProduct}=="0601", ATTR{bConfigurationValue}!="$env{REALTEK_NIC_MODE}", ATTR{bConfigurationValue}="$env{REALTEK_NIC_MODE}"
A DRIVER==
peça não é necessária.
O significado desta regra do udev é o seguinte: "Quando um dispositivo com
idVendor
valor 2357 eidProduct
valor 0601 (e gerenciado pelo driver "r8152") é adicionado ao sistema, sebConfigurationValue
não for o valor definido na variável de ambienteREALTEK_NIC_MODE
, defina-obConfigurationValue
como esse valor."Em outras palavras, esta regra do udev não está carregando o driver r8152, está alternando o dispositivo para o modo correto para esse driver, se necessário.
Quando um novo dispositivo é adicionado, o kernel do Linux basicamente é executado
modprobe
com os IDs de hardware (e algumas outras coisas) do dispositivo codificados no "nome" do módulo solicitado. Este "nome" é então comparado pormodprobe
strings curinga embutidas em cada módulo como aliases de módulo. Odepmod
comando reúne esses nomes de alias e os armazena/lib/modules/<kernel version>/modules.alias[.bin]
para uma pesquisa rápida. Você pode visualizar as strings de alias embutidas nos módulos do kernel com omodinfo
comando.Para o seu adaptador ethernet USB, o "nome" é algo como
usb:v2357p0601d...
. Infelizmente, ocdc_ether
módulo possui um alias curinga que também corresponderá a ele.Quaisquer aliases definidos em
/etc/modprobe.d
terão precedência sobre os aliases embutidos nos próprios módulos. Portanto, você provavelmente poderia especificar um alias que corresponda ao seu adaptador ethernet e faça com que or8152
módulo seja carregado.Tente adicionar isso como
/etc/modprobe.d/usbnic.conf
:Em seguida, execute
depmod -a
como root, desconecte o adaptador ethernet USB, descarregue os módulosr8152
ecdc_ether
, conecte o adaptador ethernet novamente e veja o que acontece. Se apenas o módulo r8152 estiver carregado, ótimo.Se o
cdc_ether
ainda for carregado também, o alias pode precisar ser mais específico (ou seja, um ou mais asteriscos precisam ser substituídos por valores reais, sejam eles quais forem) para que esse alias seja o mais específico e, portanto, o "melhor" jogo.Atualização: Aqui está uma descrição do formato de alias do módulo: http://people.skolelinux.org/pere/blog/Modalias_strings___a_practical_way_to_map__stuff__to_hardware.html
Há um patch para esse problema em kernels recentes: https://lkml.org/lkml/2017/9/25/711