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 e
und WLAN-Schnittstellen immer mit dem Buchstaben beginnen w
.
Ist die Logik richtig? Wenn nicht, wie können wir das angehen?
networking
wifi
network-interface
ethernet
Mohan Raj
quelle
quelle
iwconfig
man WLAN-Schnittstellen von anderen filtert.lshw -class network
vielleicht? Nach allem suchen, was istcapabilities: ethernet physical
? Suchen Sie möglicherweise auch nach anderen Funktionen?Antworten:
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.
quelle
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.red
,blue
undgreen
.Für systemd vorhersehbare Schnittstellennamen können die Präfixe wie folgt eingesehen werden
udev-builtin-net_id.c
:sowohl für den traditionellen
ethX
benennungsstil 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 .quelle
biosdevname
zur Benennung von Schnittstellen verwendet werden, bei denen eine Ethernet-Schnittstelle wie folgt benannt werden kannp3p7
. 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.rename%u
Format hasn ' Es gibt sie seit 2012 im Quellcode. Ich möchte mich darüber seufzen, dass Ihre Software sechs Jahre veraltet ist.Die Namenskonvention ist , dass LAN - Schnittstellen sind benannt
eth0
,eth1
, ... und das WLAN - Schnittstellen benannt sindwlan0
,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
:Leider gibt es keine solchen
DEVTYPE
für LAN-Schnittstellen.quelle
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
quelle
Schließen Sie verbundene oder zusammengeschlossene Schnittstellen ausdrücklich aus? Standardmäßig wird hier
bond0
oderteam0
fü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.
quelle
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 istudev
.Zitieren von PredictableNetworkInterfaceNames :
quelle
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:quelle