Como a interface Ethernet aparece no comando IP link

Como a interface Ethernet aparece no comando IP link

Estou experimentando o Linux e tentando entender o processo de inicialização inicial. Pelo menos nos sistemas com os quais tenho brincado o udev é o "módulo" que descobre dispositivos. No entanto, uma vez descoberto, de alguma forma ele é "adicionado" à lista de interfaces disponíveis e você pode executar um comando "ip link set dev up". Até essa etapa, ele não reconhecerá o nome do dispositivo.

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

Eu sei que isso acontece depois do "espaço inicial do usuário", pois adicionei um gancho à minha imagem initramfs e estou usando o "ip link" para despejar 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 executo um comando systemctl.

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

Obrigado por qualquer ajuda, estive fuçando, mas os detalhes desse processo não foram fáceis de localizar.

Responder1

Não há comando. Em primeiro lugar, isso não é feito pelo espaço do usuário – é feito inteiramente pelo driver Ethernet da placa, que usa register_netdev()o subsistema “net” do kernel para fazer uma nova interface aparecer.

O processo é, aproximadamente:

  1. O Kernel descobre um dispositivo PCI ou USB, constrói uma "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, processa-o de acordo com as regras (executando ferramentas auxiliares, adicionando vários metadados, criando links simbólicos) e o envia novamente, desta vez para vários programas que usam o libudev.

  3. Um dos arquivos de regras do udev, 80-drivers.rules, lida com uevents contendo MODALIAS=e usa libkmod para carregar quaisquer módulos do kernel que correspondam a esse alias. (No passado, ele costumava ser executado modprobepara o carregamento do módulo. Você ainda pode passar modalias para modprobeou modinfo, no entanto.)

    $ 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 ax88179_178adriver.

  4. Quer o driver tenha sido carregado agora ou já tenha sido carregado anteriormente, o kernel chama sua .probefunção para anexá-lo a um dispositivo específico.

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

    (Para dispositivos USB, alguns drivers adiam a análise para o usbnetmódulo, que é aquele que faz a maior parte do trabalho USB padrão e cria uma interface Ethernet real, e apenas chama o driver principal para fazer a mágica específica do hardware.)

    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
    

informação relacionada