Altera o nó do dispositivo kernel no Ubuntu 16.04 (nome da interface usb estática baseado na porta em que está conectado)

0

Estou trabalhando com interfaces de rede USB (Ethernet via USB), em um Raspberry Pi. O objetivo é basicamente fazer o flash de várias máquinas Linux ao mesmo tempo através do TFTP U-boot, usando as quatro portas USB oferecidas pelo Raspberry Pi.

Neste momento, defini quatro interfaces usb e cada uma delas tem um endereço IP. Eu configurei o servidor tftp . Ele funciona bem, no entanto, se eu tentar conectar várias máquinas Linux ao mesmo tempo, parece que o DHCP mistura as interfaces (como o antigo usb0 se torna novo usb1 e o antigo usb1 se torna novo usb0 ), e Acredito que isso cria confusão nas concessões e, assim, as trocas de TFTP parecem ficar presas em um estado de bloqueio suave.

Bem, isso não pode acontecer. Então, eu configurei quatro regras do udev que dão a esses dispositivos um nome fixo, com base na porta USB em que estão conectados. Algo parecido com isto:

SUBSYSTEM=="usb", ACTION=="add", DEVPATH=="*.2", NAME="usb0"

(recebi esses valores usando udevadm info )

Eu obviamente preciso renomear o dispositivo, já que ele será o nome da minha interface de rede. Então, neste caso, um link simbólico não é de uso algum (a menos que haja algo que eu não esteja ciente).

No entanto, systemd-udevd não me permite renomear o dispositivo:

Feb 28 17:25:01 pi systemd-udevd[3749]: NAME="usb2" ignored, kernel device nodes can not be renamed; please fix it in /lib/udev/rules.d/99-systemd.rules:49

Eu li on-line que isso era possível antes da versão 15.04, então acredito que deveria haver uma maneira de restaurar esse comportamento antigo?

Qualquer conselho seria muito apreciado.

    
por Nepho 28.02.2017 / 17:34

1 resposta

2

Algumas coisas precisam ser esclarecidas:

  1. Existe uma hierarquia de árvore de dispositivos. Seu adaptador Ethernet USB é exibido como vários "dispositivos" em diferentes subsistemas, representando diferentes camadas:

    • subsistema usb , devtype usb_device - um dispositivo USB conectado a alguma porta;
    • subsistema usb , devtype usb_interface - uma função específica que o dispositivo USB fornece (o termo 'interface' tem um significado diferente do que na rede!);
    • subsistema net - a interface de rede real (desta vez no sentido de rede regular).

    (O dispositivo de rede é um filho da interface usb, que é filho do usb_device, etc.)

  2. Nem todos os dispositivos têm "nós de dispositivo", por exemplo as interfaces de rede não aparecem em /dev . (O que é lamentável, mas além do ponto.)

  3. Somente interfaces de rede podem ser renomeadas. Outros dispositivos não podem. Esta política tornou-se mais rígida quando o Linux mudou de nós de dispositivos de criação do udev para o próprio kernel fazendo isso. (Sim, tecnicamente mv /dev/foo /dev/bar ainda funciona, mas a política é que o udev não irá mexer com o que o kernel exporta.)

Portanto, o ponto # 1 é importante: todo o seu post está falando sobre interfaces de rede (que pertencem ao subsistema net ), mas suas regras do udev estão combinando com o subsistema usb - como resultado, você está tentando renomeie algum dispositivo USB abstrato em / sys.

Sua regra precisa especificamente ter SUBSYSTEM=="net" . Se você quiser adicionalmente combinar dispositivos pai, SUBSYSTEMS=="usb" poderia ser usado (observe o 'S').

    
por 08.11.2017 / 17:54