Como a interface Ethernet aparece no comando IP link

2

Estou experimentando com o Linux e estou tentando entender o processo de inicialização antecipada. Pelo menos nos sistemas que eu tenho jogado com o udev é o "módulo" que está descobrindo dispositivos. Uma vez descoberto, no entanto, de alguma forma ele é "adicionado" à lista de interfaces disponíveis e você pode então fazer um comando "ip link set dev up". Até esse passo, ele não reconhecerá o nome do dispositivo.

Minha pergunta é onde isso acontece e qual comando é usado?

Eu sei que isso acontece depois de "early user space", já que adicionei um hook à minha imagem initramfs e estou usando o "ip link" para descarregar as interfaces e apenas a interface de loopback existe.

Isso deve acontecer bem cedo e no meu ambiente de sistema há uma entrada de "dispositivo" como sys-subsystem-net-devices-ens33.device quando eu faço um comando systemctl.

Não fica claro como essa entrada é adicionada à lista de dispositivos ou quais comandos ela executa.

Obrigado por qualquer ajuda, tenho andado por aí, mas os detalhes deste processo não foram fáceis de localizar.

    
por Mestrio 04.09.2016 / 19:31

1 resposta

1

Não há comando. Isso não é feito pelo userspace em primeiro lugar - é feito inteiramente pelo driver Ethernet da placa, que usa register_netdev() do subsistema "net" do kernel para fazer uma nova interface aparecer.

O processo é, aproximadamente:

  1. O Kernel descobre um dispositivo PCI ou USB, cria um "modalias" descrevendo-o e envia um uevent anunciando o dispositivo para o udev. Por exemplo:

    ACTION=add
    DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3
    DEVTYPE=usb_device
    SUBSYSTEM=usb
    ...
    
    ACTION=add
    DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0
    DEVTYPE=usb_interface
    MODALIAS=usb:v0B95p1790d0100dcFFdscFFdp00icFFiscFFip00in00
    SUBSYSTEM=usb
    ...
    
  2. O udev recebe o uevent, o processa de acordo com as regras (executando ferramentas auxiliares, adicionando vários metadados, criando links simbólicos) e os envia novamente, desta vez para vários programas que usam o libudev.

  3. Um dos arquivos de regras do udev, 80-drivers.rules , manipula uevents contendo MODALIAS= e usa a libkmod para carregar qualquer módulo do kernel correspondente a esse alias. (No passado, costumava executar modprobe para o carregamento do módulo. Você ainda pode passar um modalias para modprobe ou modinfo .)

    $ modinfo usb:v0B95p1790d0100dcFFdscFFdp00icFFiscFFip00in00
    filename:       /lib/modules/4.7.2-1-ARCH/kernel/drivers/net/usb/ax88179_178a.ko.gz
    description:    ASIX AX88179/178A based USB 3.0/2.0 Gigabit Ethernet Devices
    alias:          usb:v0DF6p0072d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v2001p4A00d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v0B95p178Ad*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v0B95p1790d*dc*dsc*dp*ic*isc*ip*in*
    depends:        usbnet,usbcore,mii
    ...
    

    Portanto, para este dispositivo, o udev carregará o driver ax88179_178a .

  4. Se o driver foi carregado agora ou já havia sido carregado anteriormente, o kernel chama sua função .probe para anexá-lo a um dispositivo específico.

  5. A função probe do driver faz qualquer mágica de chip necessária para ligar o dispositivo, inicializá-lo, configurá-lo e finalmente chamar register_netdev() para criar uma interface Ethernet real para si mesmo.

    (Para dispositivos USB, alguns drivers adiam a detecção para o módulo usbnet , que é o que faz a maior parte do trabalho USB padrão e cria uma interface Ethernet real, e só chama o driver principal para fazer o hardware específico mágica.)

    Sep 04 21:25:11 kernel: ax88179_178a 2-1.3:1.0 eth1: register 'ax88179_178a'
    ↵ at usb-0000:00:1d.0-1.3, ASIX AX88179 USB 3.0 Gigabit Ethernet, 8c:ae:4c:f4:06:33
    
por 04.09.2016 / 20:44