Wie wird die Ethernet-Schnittstelle im IP-Link-Befehl angezeigt?

Wie wird die Ethernet-Schnittstelle im IP-Link-Befehl angezeigt?

Ich experimentiere mit Linux und versuche, den frühen Bootvorgang zu verstehen. Zumindest auf den Systemen, mit denen ich gespielt habe, ist udev das „Modul“, das Geräte erkennt. Sobald es jedoch erkannt wurde, wird es irgendwie zur Liste der verfügbaren Schnittstellen „hinzugefügt“ und Sie können dann den Befehl „ip link set dev up“ ausführen. Bis zu diesem Schritt wird der Gerätename jedoch nicht erkannt.

Meine Frage ist, wo dies geschieht und welcher Befehl verwendet wird?

Ich weiß, dass es nach dem „Early User Space“ passiert, da ich meinem Initramfs-Image einen Hook hinzugefügt habe und „IP-Link“ verwende, um die Schnittstellen zu dumpen, und nur die Loopback-Schnittstelle vorhanden ist.

Es muss jedoch ziemlich früh geschehen und in meiner Systemumgebung gibt es einen „Geräte“-Eintrag als sys-subsystem-net-devices-ens33.device, wenn ich einen systemctl-Befehl ausführe.

Es ist überhaupt nicht klar, wie dieser Eintrag zur Geräteliste hinzugefügt wird oder welche Befehle er ausführt.

Vielen Dank für jede Hilfe. Ich habe mich umgesehen, aber die Einzelheiten dieses Vorgangs waren nicht leicht herauszufinden.

Antwort1

Es gibt keinen Befehl. Es wird nicht in erster Linie vom Benutzerbereich ausgeführt – es wird vollständig vom Ethernet-Treiber der Karte ausgeführt, der register_netdev()das „net“-Subsystem des Kernels verwendet, um eine neue Schnittstelle erscheinen zu lassen.

Der Vorgang ist ungefähr:

  1. Der Kernel erkennt ein PCI- oder USB-Gerät, erstellt ein „Modalias“, das es beschreibt, und sendet ein UEvent, das das Gerät an udev meldet. Beispiel:

    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 empfängt das uevent, verarbeitet es gemäß den Regeln (führt Hilfstools aus, fügt verschiedene Metadaten hinzu, erstellt symbolische Links) und sendet es erneut, diesmal an verschiedene libudev-verwendende Programme.

  3. Eine der Udev-Regeldateien, 80-drivers.rules, verarbeitet UEvents, die MODALIAS=libkmod enthalten, und verwendet sie, um alle Kernelmodule zu laden, die diesem Alias ​​entsprechen. (Früher wurde es modprobezum Laden des Moduls ausgeführt. Sie können jedoch immer noch einen Modalias an modprobeoder übergeben 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
    ...
    

    Daher lädt udev den ax88179_178aTreiber für dieses Gerät.

  4. Unabhängig davon, ob der Treiber gerade oder bereits zuvor geladen wurde, ruft der Kernel seine .probeFunktion auf, um ihn an ein bestimmtes Gerät anzuhängen.

  5. Die Funktion des Treibers probeführt die erforderliche Chip-Magie aus, um das Gerät einzuschalten, zu initialisieren, zu konfigurieren und schließlich register_netdev()eine echte Ethernet-Schnittstelle für sich selbst zu erstellen.

    (Bei USB-Geräten verschieben einige Treiber die Prüfung auf das usbnetModul, das den Großteil der Standard-USB-Arbeit erledigt und eine echte Ethernet-Schnittstelle erstellt, und ruft den Haupttreiber nur auf, um die hardwarespezifische Magie zu vollbringen.)

    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
    

verwandte Informationen