
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:
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 ...
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.
Eine der Udev-Regeldateien,
80-drivers.rules
, verarbeitet UEvents, dieMODALIAS=
libkmod enthalten, und verwendet sie, um alle Kernelmodule zu laden, die diesem Alias entsprechen. (Früher wurde esmodprobe
zum Laden des Moduls ausgeführt. Sie können jedoch immer noch einen Modalias anmodprobe
oder übergebenmodinfo
.)$ 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_178a
Treiber für dieses Gerät.Unabhängig davon, ob der Treiber gerade oder bereits zuvor geladen wurde, ruft der Kernel seine
.probe
Funktion auf, um ihn an ein bestimmtes Gerät anzuhängen.Die Funktion des Treibers
probe
führt die erforderliche Chip-Magie aus, um das Gerät einzuschalten, zu initialisieren, zu konfigurieren und schließlichregister_netdev()
eine echte Ethernet-Schnittstelle für sich selbst zu erstellen.(Bei USB-Geräten verschieben einige Treiber die Prüfung auf das
usbnet
Modul, 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