Autoloading módulo compilado externamente no evento hotplug

1

Eu tenho um sistema Linux embutido bastante desatualizado com o kernel v2.6.33.7, que veio sem os módulos USBNET e CDC_ETHER. Compilei esses módulos para poder anexar um determinado dispositivo USB-LAN, que funciona com o driver do CDC, que é carregado pelo módulo USBNET. Agora eu copiei os módulos para a pasta /lib/modules/2.6.33.7/kernel/drivers/net/usb .

É possível carregar o módulo cdc_ether usando insmod , mas modprobe me dá um erro.
Após inserir o módulo usbnet, dmesg mostra:
usbnet: exports duplicate symbol usbnet_resume (owned by kernel) .
Além disso, se eu tentar descarregar o módulo usbnet, recebo o erro:
FATAL: Module usbnet is builtin

Após inserir o módulo cdc_ether dmesg mostra o sucesso:
eth1: register 'cdc_ether' at usb-mxc-ehci.0-1, CDC Ethernet Device, fc:8f:c4:06:e8:9c usbcore: registered new interface driver cdc_ether
Se eu inicializar o módulo cdc_ether manualmente, há um adaptador ethernet eth1 disponível para o sistema, que por sua vez pode ser configurado com sucesso usando ifconfig .

Como é possível carregar automaticamente o módulo quando o stick é conectado? Eu dei uma olhada nas regras do driver udev , que parecem carregar os módulos do kernel, e também nos módulos. * Arquivos em /lib/modules/2.6.33.7/ ... sem sorte. Qual é a peça que faltava para que isso funcione?

Acabei de descobrir, procurando no arquivo de configuração de tempo de compilação /proc/config.gz que o módulo usbnet deveria ser construído pela empresa que compilou meu kernel, como é dito lá CONFIG_USB_USBNET=y  Então eu basicamente preciso rodar o módulo cdc_ether quando o stick é plugado por uma regra do udev, certo?

Consegui pegar os arquivos modules.* que foram construídos e colocá-los na pasta antiga do kernel /lib/modules/2.6.33.7/ . O efeito é que modprobe agora conhece os módulos ao tentar carregá-los usando o modprobe.

Como o módulo usbnet é integrado, ele é executado imediatamente a partir da inicialização. Somente o módulo cdc_ether precisa ser iniciado então. Depois de obter o modprobing para funcionar, eu preciso do mecanismo hotplugging. Para facilitar a codificação, adicionei cdc_ether a /etc/modules . O módulo é carregado na inicialização. Eu tinha o arquivo de configuração de rede /etc/network/interfaces editado corretamente bit a nova interface eth1 nunca iria obter seu IP quando foi criado, porque de alguma forma já estava configurado. Então eu adicionei uma regra do udev que libera os endereços de cada dispositivo de eth que é removido.

#ACTION=="add",SUBSYSTEM=="usb",DRIVER=="cdc_ether",RUN+="/sbin/modprobe cdc_ether"
ACTION=="add",SUBSYSTEM=="net",RUN+="/sbin/ifup %k"
ACTION=="remove",SUBSYSTEM=="net",RUN+="/sbin/ifdown %k",RUN+="/sbin/ip addr flush %k"

Não consigo fazer o carregamento do módulo hotplug funcionar, por isso parece que tenho que ficar com o carregamento na inicialização do sistema.

    
por goeck 09.04.2015 / 07:15

0 respostas