Wie bestimmt der IP-Link von iproute2 den Verbindungsstatus?

308
Tom

Ich habe eine Netzwerkschnittstelle, die ip link showwie folgt berichtet:

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default  link/ether 02:42:43:e6:b1:e7 brd ff:ff:ff:ff:ff:ff 

Aber /sys/class/net/docker0/flagssagt dies:

$ cat /sys/class/net/docker0/flags  0x1003 

Die drei Bits, die gesetzt werden, sind IFF_MULTICAST, IFF_BROADCASTund IFF_UP. Das sieht aus wie eine Schnittstelle, die UP ist. Warum ip linkmeldet sich state DOWN?

Das System ist Linux 4.15 / Ubuntu 18.04.

3

1 Antwort auf die Frage

2
grawity

Die drei gesetzten Bits sind IFF_MULTICAST, IFF_BROADCAST und IFF_UP. Das sieht aus wie eine Schnittstelle, die UP ist

Und das entspricht sehr gut der tatsächlichen Ausgabe der Flags :

3: docker0: <NO-CARRIER, BROADCAST, MULTICAST, UP > ↑ ↑ ↑ 

Warum meldet der IP-Link den Status DOWN?

Das ist eine andere Art von Staat.

  • Das Flag IFF_UP (oben als "<UP>" dargestellt) beschreibt den Verwaltungsstatus, den manuellen Drehknopf, über den Sie einstellen können ip link set eth0 up.

  • Auf der anderen Seite, der „Staat [...]“ Text beschreibt Betriebszustand, das anzeigt, ob die Schnittstelle anzeigt, fähig zu arbeiten.

Der Betriebszustand entspricht in etwa der Präsenz des Betreibers - z. B. eine vollständig eingerichtete Ethernet-Verbindung oder ein damit verbundener WLAN-Zugangspunkt. Es wird berichtet, dass eine Bridge aktiv ist (einen Carrier haben), wenn mindestens einer ihrer Mitgliedsports aktiv ist. Aus diesem Grund möchten Sie möglicherweise eine dummy0Schnittstelle als Brückenmitglied hinzufügen .

Der Betriebszustand entspricht in etwa den Flags IFF_LOWER_UP(im Flag-Bereich als "<LOWER_UP>" dargestellt) und IFF_RUNNING(deren Abwesenheit wird in Ihrem Beispiel als Pseudo-Flag "<NO-CARRIER>" angezeigt). ( Quellcode )

Die iproute-Tools erhalten jedoch Schnittstelleninformationen über Netlink. Der state …Abschnitt wird basierend auf dem netlink-Attribut IFLA_OPERSTATE gedruckt. ( Quellcode )

Dieses Attribut ist auch über sysfs unter verfügbar …/operstate. In der Linux-Dokumentation werden diese Flags und Attribute in operstates.txt ausführlicher erklärt .

Danke für die Erklärung. Ich habe auch eine Ethernet-Schnittstelle, die "ip link" meldet, um Flags zu haben "BROADCAST, MULTICAST, UP, LOWER_UP", aber die von sysfs zeigt, Flags 0x1003 zu haben (genau wie die Docker0-Schnittstelle oben). Ich denke, die Diskrepanz liegt darin, dass iproute-Tools nicht sysfs verwenden. Ist es vernünftig zu versuchen, den Betriebsstatus der Verbindung von sysfs abzuleiten, oder muss eine andere Schnittstelle verwendet werden? Ich mache dies in Python und versuche, 'subprocess.call' ('ip link show | grep eth0'.split ()). Split () `etc. zu vermeiden. Tom vor 5 Jahren 0
Ach, egal, ich habe jetzt `/ sys / class / net / eth0 / operstate` selbst gefunden ... Tom vor 5 Jahren 0
@Tom: Verwenden Sie das sysfs-Attribut `operstate`. Verwenden Sie ein rtnetlink-Python-Modul. (Ich habe den leichten Verdacht, dass IFF_LOWER_UP nur über netlink, aber nicht über sysfs gemeldet wird.) Verwenden Sie `ip -json link show | jq ". [] | .operstate" `wenn Sie müssen ... grawity vor 5 Jahren 0