Namenskonventionsstandard für Ethernet- und Wi-Fi-Schnittstellen auf Linux-Computern


13

Was ist die Namenskonvention für Ethernet- und Wi-Fi-Schnittstellen auf einem Linux-Computer?

Wir entwickeln ein Tool, das nur die Ethernet- und Wi-Fi-Schnittstellen der Linux-Maschine und ihren aktuellen Status anzeigen soll.

Im Folgenden finden Sie beispielsweise die Liste der Netzwerkschnittstellen (sowohl physische als auch virtuelle) auf meinem Linux-Computer (Ubuntu):

docker0, enp0s25, lo,wlp3s0

Wenn ich das Tool ausführe, wird das folgende Ergebnis angezeigt:

enp0s25, wlp3s0

Wir haben den Code mit der Logik geschrieben, dass alle Ethernet-Schnittstellen immer mit dem Buchstaben beginnen eund WLAN-Schnittstellen immer mit dem Buchstaben beginnen w.

Ist die Logik richtig? Wenn nicht, wie können wir das angehen?



Ich würde mal schauen, wie iwconfigman WLAN-Schnittstellen von anderen filtert.
Patrick Mevzek

1
Gibt es einen Grund, warum du nicht so etwas wie lshw ansiehst? Untersuchen Sie speziell den Inhalt von lshw -class networkvielleicht? Nach allem suchen, was ist capabilities: ethernet physical? Suchen Sie möglicherweise auch nach anderen Funktionen?
Zoredache

Um die von @dirkt aufgeworfene Frame-Herausforderung zu bewältigen, wäre eine bessere Frage einfach: "Wie erhalte ich den Typ einer Netzwerkschnittstelle unter Linux (oder macOS oder anderen ...)?"
Roger Lipscombe

Antworten:


41

Netzwerkschnittstellen können beliebig benannt werden. Unabhängig davon, was Sie tun, treten Situationen auf, in denen (1) eine "physische" Netzwerkschnittstelle mit einem Namen vorhanden ist, der nicht Ihrem Muster entspricht, oder (2) eine "physische" Netzwerkschnittstelle, die Ihrem Muster entspricht.

Wenn ich ein Benutzer Ihres Tools wäre, würde ich in dem Moment, in dem Ihr Tool es mir nicht erlauben würde, etwas zu tun, was ich möchte, weil ich eine "virtuelle" Netzwerkschnittstelle besitze, obwohl dies aus praktischen Gründen in Betracht gezogen werden sollte. "physisch" in meinem Setup würde ich anfangen, Ihre App laut und heftig zu verfluchen und sie nie wieder verwenden.

Physische und virtuelle Netzwerkschnittstellen haben alle eine gemeinsame API, was Linux wirklich flexibel macht. Bitte versuchen Sie nicht, Ihren Benutzer zu babysitten, und nehmen Sie ihm das weg. Ihre Benutzer werden es Ihnen danken.


11
Sie haben die Frage nicht beantwortet. Sie haben 3 Absätze damit verbracht, den Hintergrund der Frage zu hinterfragen. Mir ist zwar bewusst, dass Frame-Challenge-Antworten eine Sache sind, dies scheint jedoch kein Fall zu sein, zumal user4556274 die gestellte Frage kurz und bündig beantwortet hat.
Mike Ounsworth

18
@MikeOunsworth: Das Problem ist, dass die Antwort von user4556274 im Allgemeinen nicht funktioniert, sondern nur, wenn die Schnittstellennamen tatsächlich vorhersagbare Schnittstellennamen sind. Was ein einfacher ip link set ... name ...ändern kann. Und ja, ich hätte die vorhersehbaren Schnittstellennamen selbst auflisten können. Die Antwort auf die ursprüngliche Frage lautet "Bitte nicht so machen". Denn egal wie Sie vorgehen, es wird nicht funktionieren.
Dirkt

@ fpmurphy1 Nein, ich denke er meint vorhersehbare Schnittstellennamen. Egal, ob es sich um systematische, traditionelle (ethN), unternehmensspezifische Konventionen oder andere Standards handelt, die die Namen vorhersehbar machen
slebetman

12
@MikeOunsworth: Die Antwort befindet sich im allerersten Unterabschnitt des allerersten Satzes des ersten Absatzes: "Netzwerkschnittstellen können beliebig benannt werden […]" Daher ist das, worüber das OP fragt, unmöglich und kann möglicherweise nicht getan werden . Sie können den Typ einer Netzwerkschnittstelle nicht anhand eines Namenskonventionsstandards erkennen, da es keinen Namenskonventionsstandard gibt und jeder seine Schnittstellen beliebig benennen kann. Zum Beispiel auf meinem alten Linux - Router, gehe ich farbige Aufkleber auf der Rückseite und die physikalischen Ethernet - Schnittstellen wurden genannt red, blueund green.
Jörg W Mittag

1
@ JörgWMittag, natürlich können Sie sie anhand eines Standards erkennen, wenn Sie wissen, dass der Standard verwendet wird (und Sie erwarten einen, der diese Informationen in den Namen exportiert). Wir wissen, dass systemd einen Standard für die Benennung von Netzwerkschnittstellen hat , daher ist es sinnlos zu sagen, dass es keinen gibt.
ilkkachu

28

Für systemd vorhersehbare Schnittstellennamen können die Präfixe wie folgt eingesehen werden udev-builtin-net_id.c:

* Two character prefixes based on the type of interface:
*   en — Ethernet
*   ib — InfiniBand
*   sl — serial line IP (slip)
*   wl — wlan
*   ww — wwan

sowohl für den traditionellen ethXbenennungsstil als auch für den neueren systemd-benennungsstil sollte ein Anfangsbuchstabe e eine ethernet-schnittstelle für alle automatisch generierten schnittstellennamen sein. Alle WLAN-Schnittstellen sollten in beiden Schemata mit einem w beginnen , obwohl nicht alle Schnittstellen, die mit w beginnen , WLAN sind.

Wenn dieses Tool muss Arbeit in einer beliebigen Umgebung ( und nicht nur auf interne Umgebungen , die Sie steuern), beachten Sie, dass die Benutzer - Schnittstellen auf Linux - Systeme mit beliebigen Namen benennen kann, wie [ wan0, lan0, lan1, dmz0] , die keine Annahmen über die Anfangsbuchstaben brechen .


7
Und einige von uns sind strenge systematische Verweigerer.
chrylis -on strike-

1
Beachten Sie, dass diese Lösung nicht auf Systemen funktioniert, die biosdevnamezur Benennung von Schnittstellen verwendet werden, bei denen eine Ethernet-Schnittstelle wie folgt benannt werden kann p3p7. Diese Methode ist ein Vorgänger der neuen systemd-vorhersagbaren Namen, und obwohl sie jetzt in gängigen Distributionen veraltet ist, wird es immer noch viele Systeme geben, die sie aufgegriffen haben, als es vor einigen Jahren die Standardmethode war.
TooTea

systemd ruft eine meiner Ethernet-Schnittstellen "rename3" auf. Welches es ist, kann variieren, seufzen :(
user1908704

1
@ user1908704: Normalerweise bedeutet dies, dass udev angewiesen wurde, mehreren Schnittstellen denselben Namen zu geben. (Vielleicht haben Sie eine alte automatisch generierte Datei mit "persistenten Namen" in /etc/udev/rules.d?) Das heißt, der Umbenennungsprozess wurde in v187 so korrigiert , dass er vollständig atomar ist (entweder erfolgreich oder rollback) und das rename%uFormat hasn ' Es gibt sie seit 2012 im Quellcode. Ich möchte mich darüber seufzen, dass Ihre Software sechs Jahre veraltet ist.
user1686

1
@grawity Dies ist Ubuntu 18.04. Es stellt sich heraus, dass bestimmte Motherboards zwei NICs mit demselben ACPI-Eintrag haben, was dazu führt, dass beide eno1 sind. Da das nicht passieren kann, wird einer von ihnen 'rename3' genannt. Ich habe die Logik, wer das Rennen gewinnt, noch nicht vollständig ausgearbeitet, aber Änderungen können den Wettbewerb stören und dazu führen, dass der andere umbenannt wird3.
user1908704

9

Die Namenskonvention ist , dass LAN - Schnittstellen sind benannt eth0, eth1, ... und das WLAN - Schnittstellen benannt sind wlan0, wlan1...

Was Sie sehen, sind die sogenannten "vorhersehbaren Namen", die systemd eingeführt hat. In der Praxis sind sie alles andere als vorhersehbar, und sie können sich sogar ändern, wenn die Hardware geändert wird. Dies ist genau das Problem, das vermieden werden soll.

Für eine Vermutung kann der Anfangsbuchstabe gut genug sein. Einige Schnittstellen, insbesondere WLAN, enthalten Hinweise zu /sys/class/net/*/uevent:

DEVTYPE=wlan

Leider gibt es keine solchen DEVTYPEfür LAN-Schnittstellen.


2
Änderungen des Gerätenamens, wenn sich die Hardware ändert, sind nicht das Problem, das vorhersehbare Schnittstellennamen zu vermeiden versuchen. Vorhersehbare Schnittstellennamen verhindern Namensänderungen bei unveränderter Hardware . Dies ist ein Problem, wenn die Hardwaregeräte in zufälliger Reihenfolge erkannt werden.
Johan Myréen

@ JohanMyréen Das ist falsch: "... dass sie (Schnittstellenname) fest bleiben, auch wenn Hardware hinzugefügt oder entfernt wird" freedesktop.org/wiki/Software/systemd/…
RalfFriedl

Die Motivation für die Einführung der vorhersagbaren Schnittstellennamen war, dass die Prüfung nicht deterministisch ist und "die Zuweisung der Namen" eth0 "," eth1 "usw. nicht mehr festgelegt ist und dass" eth0 "bei einem Start sehr wahrscheinlich auftritt "eth1" am nächsten. " Es ist ein Bonus, wenn die vorhersehbaren Namen Hardwareänderungen überstehen können, aber dies war nicht der Hauptgrund für sie.
Johan Myréen

1
Gewinnen Sie einige verlieren einige - in einigen Szenarien ist es sehr wünschenswert, wenn geänderte Hardware zuverlässig in den gleichen "Namens-Slot" klickt :)
Rackandboneman

@ JohanMyréen Das alte Schema zum Zuweisen von Schnittstellennamen basierend auf MAC oder anderen Eigenschaften funktionierte zuverlässiger, wenn Schnittstellen hinzugefügt wurden, ohne den Aufwand der neuen Namen.
RalfFriedl

5

Ein Vorbehalt mit meiner Antwort (gilt auch für die meisten anderen): Ich kenne den Zweck Ihrer Bewerbung nicht. Wenn es sich um eine wegwerfbare Anwendung handelt, um ein bestimmtes Problem zu beheben oder das Netzwerk besser zu verstehen, und die Anwendung nie wieder verwendet werden soll, ist es möglicherweise eine gute und schnelle Option, sich auf den ersten Buchstaben der Benutzeroberfläche zu verlassen. Wenn Sie planen, den nächsten Konkurrenten an Wireshark oder tcpdump zu schreiben, müssen Sie sicherstellen, dass Sie es für alle Arten von Edge Cases richtig machen.

Und wenn die Anwendung, die Sie schreiben, irgendwo zwischen diesen Extremen liegt, können nur Sie (und Ihre Kunden) wissen, wie sorgfältig Sie Ihre Logik implementieren müssen.

Andere haben bereits darauf hingewiesen, dass die Namen aus einer Reihe von Gründen niemals zuverlässig sind. Das ultimative Problem ist eines der häufigsten bei Software: Annahmen werden hartcodiert, anstatt sich auf bekannte / dokumentierte Fakten zu stützen.

Das zweite Problem, das nicht erwähnt wurde, basiert ebenfalls auf einer Annahme über Ihre Anforderungen: Die Liste der Schnittstellen, die Sie auflisten möchten, lautet immer genau "Hardware-Ethernet-Schnittstellen" und "WLAN-Schnittstellen".

Das dritte Problem ist eine weitere Annahme: Alle Benutzeroberflächen fallen in die Kategorien, die Sie sich gerade vorstellen können. Wie wäre es mit Infiniband, wie von @ user4556274 erwähnt? Wie wäre es mit Tunnelschnittstellen für ein VPN? Wie wäre es mit überbrückten Schnittstellen? Wie wäre es mit überbrückten Schnittstellen, die physische und logische Schnittstellen kombinieren?

Möglicherweise gibt es jedoch Optionen, um das zu erreichen, wonach Sie suchen. Definieren Sie zunächst genau, was eine Schnittstelle kennzeichnet, die Sie auflisten möchten, und was nicht.

Ein Merkmal, auf das Sie sich in den meisten Fällen verlassen können, ist die Routing-Tabelle (dies funktioniert jedoch nur, solange die Schnittstelle aktiv ist, sodass es möglicherweise nicht das ist, wonach Sie tatsächlich suchen).

Jede Schnittstelle, die eine Standardroute hat (dh eine Route zu 0.0.0.0), ist wahrscheinlich eine, nach der Sie suchen.

Beachten Sie, dass auch dies auf einer nur zuverlässigeren Annahme beruht: Es ist denkbar, dass ein System so konfiguriert ist, dass der gesamte ausgehende Datenverkehr über eine virtuelle Maschine oder einen Docker-Container weitergeleitet wird (z. B. wenn auf einem Container eine Firewall ausgeführt wird) ). Das Gegenteil ist der Fall: Ein Systemadministrator kann möglicherweise den externen Datenverkehr sperren, indem er die Standardroute löscht.

Eine andere Möglichkeit besteht darin, anhand der tatsächlichen Hardware herauszufinden, welcher Treiber verwendet wird. Sie können dann bestimmte bekannte Treiber ausschließen


4

Schließen Sie verbundene oder zusammengeschlossene Schnittstellen ausdrücklich aus? Standardmäßig wird hier bond0oder team0für die primäre Schnittstelle für unsere Server verwendet.

Ich denke, Sie müssen Ihre Logik überdenken. Versuchen Sie vielleicht, alle definierten Netzwerkschnittstellen auf einem bestimmten System zu durchlaufen, sie in Ethernet, WLAN, Infiband, seriell usw. zu unterteilen und dann Ihre Magie zu verwirklichen.


3

Keine Hardcode- oder Pattern-Match-Hardwarenamen. Dies gilt für alle Geräte. Verlassen Sie sich auf die von udev bereitgestellten Tools, um die Liste der Geräte zu ermitteln und geeignete Maßnahmen zu ergreifen. Sehen Sie sich 16.7 Persistent Device Naming an und lesen Sie dann das gesamte Dokument durch , insbesondere 16.2 und 16.3. Beachten Sie, dass udev verteilungsunabhängig und auch systemunabhängig ist, da udev jetzt die bevorzugte Methode für die Geräteverwaltung unter Linux ist.

Beachten Sie, dass @ user4556274, auf das in seiner Antwort verwiesen wird, wenn Sie sich beziehen udev-builtin-net-id.c, was kurz gesagt bedeutet, dass die Musterübereinstimmung, die Sie erreichen möchten, ein fester Bestandteil von ist udev.

Zitieren von PredictableNetworkInterfaceNames :

Mit systemd 197 haben wir systemd / udevd proper um native Unterstützung für eine Reihe verschiedener Benennungsrichtlinien erweitert und ein Schema ähnlich dem von biosdevname (aber im Allgemeinen leistungsfähiger und näher an kernelinternen Geräteidentifikationsschemata) als Standard festgelegt. Die folgenden unterschiedlichen Benennungsschemata für Netzwerkschnittstellen werden jetzt von udev nativ unterstützt:

  1. Namen mit von Firmware / BIOS bereitgestellten Indexnummern für integrierte Geräte (Beispiel: eno1)
  2. Bezeichnungen mit den von Firmware / BIOS bereitgestellten PCI Express-Hotplug-Steckplatz-Indexnummern (Beispiel: ens1)
  3. Namen, die den physischen / geografischen Standort des Anschlusses der Hardware enthalten (Beispiel: enp2s0)
  4. Namen, die die MAC-Adresse der Schnittstelle enthalten (Beispiel: enx78e7d1ea46da) Klassische, unvorhersehbare kernel-native ethX-Benennung (Beispiel: eth0)

Standardmäßig benennt systemd v197 jetzt Schnittstellen gemäß Richtlinie 1), wenn diese Informationen aus der Firmware zutreffend und verfügbar sind, und greift auf 2) zurück, wenn diese Informationen aus der Firmware zutreffend und verfügbar sind, und greift auf 3) zurück, falls zutreffend, zurück bis 5) in allen anderen Fällen. Richtlinie 4) wird standardmäßig nicht verwendet, ist jedoch verfügbar, wenn der Benutzer dies wählt.

Diese kombinierte Richtlinie wird nur als letzter Ausweg angewendet. Das heißt, wenn auf dem System biosdevname installiert ist, hat dies Vorrang. Wenn der Benutzer udev-Regeln hinzugefügt hat, die den Namen der Kernel-Geräte ändern, haben diese ebenfalls Vorrang. Darüber hinaus haben verteilungsspezifische Benennungsschemata im Allgemeinen Vorrang.


2

Wie andere gesagt haben, kann man sich nicht vollständig auf den Namen verlassen.

In meinem Fall scheint für drahtlose /sys/class/net/<ifacename>/Netzwerke ein Verzeichnis mit dem Namen "wireless" vorhanden zu sein, wenn es sich um eine drahtlose Schnittstelle handelt:

# kbrandt @ kbrandtlx in /sys/class/net [9:47:43] C:130
$ ls
br-b293588ecdae  enp11s0  lo    veth6061cd8  virbr0-nic
docker0          enp12s0  ppp0  virbr0       wlp13s0

# kbrandt @ kbrandtlx in /sys/class/net [9:47:44] 
$ echo  /sys/class/net/*/wireless
/sys/class/net/wlp13s0/wireless
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.