¿Cómo aparece la interfaz Ethernet en el comando de enlace IP?

¿Cómo aparece la interfaz Ethernet en el comando de enlace IP?

Estoy experimentando con Linux y tratando de comprender el proceso de arranque temprano. Al menos en los sistemas con los que he estado jugando, udev es el "módulo" que descubre dispositivos. Sin embargo, una vez que se descubre, de alguna manera se "agrega" a la lista de interfaces disponibles y luego puede ejecutar un comando "ip link set dev up". Hasta ese paso, no reconocerá el nombre del dispositivo.

Mi pregunta es ¿dónde sucede esto y qué comando se usa?

Sé que sucede después del "espacio de usuario inicial", ya que agregué un enlace a mi imagen initramfs y estoy usando "ip link" para volcar las interfaces y solo existe la interfaz loopback.

Sin embargo, debe suceder bastante temprano y en el entorno de mi sistema hay una entrada de "dispositivo" como sys-subsystem-net-devices-ens33.device cuando ejecuto un comando systemctl.

No está del todo claro cómo se agrega esa entrada a la lista de dispositivos o qué comandos realiza.

Gracias por cualquier ayuda, he estado husmeando, pero los detalles de este proceso no han sido fáciles de localizar.

Respuesta1

No hay ningún comando. En primer lugar, no lo realiza el espacio de usuario: lo realiza completamente el controlador Ethernet de la tarjeta, que utiliza register_netdev()el subsistema "net" del núcleo para hacer que aparezca una nueva interfaz.

El proceso es, aproximadamente:

  1. El kernel descubre un dispositivo PCI o USB, crea un "modalias" que lo describe y envía un uevent anunciando el dispositivo a udev. Por ejemplo:

    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. udev recibe el uevent, lo procesa de acuerdo con reglas (ejecutando herramientas auxiliares, agregando varios metadatos, creando enlaces simbólicos) y lo envía nuevamente, esta vez a varios programas que usan libudev.

  3. Uno de los archivos de reglas de udev, 80-drivers.rulesmaneja los uevents que contienen MODALIAS=y usa libkmod para cargar cualquier módulo del kernel que coincida con ese alias. (En el pasado, solía ejecutarse modprobepara la carga del módulo. Sin embargo, aún puedes pasar un modalias a modprobeo 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
    ...
    

    Entonces, para este dispositivo, udev cargará el ax88179_178acontrolador.

  4. Ya sea que el controlador se cargó hace un momento o ya se había cargado anteriormente, el kernel llama a su .probefunción para conectarlo a un dispositivo específico.

  5. La función del controlador probehace toda la magia del chip necesaria para encender el dispositivo, inicializarlo, configurarlo y finalmente llamar register_netdev()para crear una interfaz Ethernet real para sí mismo.

    (Para dispositivos USB, algunos controladores posponen la prueba al usbnetmódulo, que es el que realiza la mayor parte del trabajo USB estándar y crea una interfaz Ethernet real, y solo llama al controlador principal para que haga la magia específica del 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
    

información relacionada