W jaki sposób `ip link show 'w iproute2 określa stan łącza?


3

Mam interfejs sieciowy, który ip link showraportuje w ten sposób:

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

Ale /sys/class/net/docker0/flagsmówi to:

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

Te trzy bity, które są ustawione są IFF_MULTICAST, IFF_BROADCASTi IFF_UP. Wygląda to na włączony interfejs. Dlaczego ip linkzgłaszasz się state DOWN?

System to Linux 4.15 / Ubuntu 18.04.

Odpowiedzi:


2

Trzy ustawione bity to IFF_MULTICAST, IFF_BROADCAST i IFF_UP. Wygląda to na włączony interfejs

A to doskonale odpowiada rzeczywistemu wyjściowi flag :

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

Dlaczego raport łącza IP ma stan W DÓŁ?

To inny rodzaj stanu.

  • Flaga IFF_UP (pokazana powyżej jako „<UP>”) opisuje stan administracyjny , czyli pokrętło ręczne, które można ustawić ip link set eth0 up.

  • Z drugiej strony tekst „stan […]” opisuje stan operacyjny , który wskazuje, czy interfejs może działać.

Stan operacyjny jest mniej więcej taki sam jak obecność „operatora” - np. W pełni ustanowione łącze Ethernet lub powiązany punkt dostępu Wi-Fi. Zgłoszono, że most jest włączony (ma przewoźnika), jeśli przynajmniej jeden z jego portów członkowskich jest włączony. Z tego powodu możesz chcieć dodać dummy0interfejs jako element mostu.

Stan operacyjny w przybliżeniu odpowiada IFF_LOWER_UPflagom (pokazanym jako „<DOLNA_UP>” w obszarze flag) i IFF_RUNNING(jego brak pokazany jako pseudo-flaga „<NO-CARRIER>” w twoim przykładzie). ( kod źródłowy )

Jednak narzędzia iproute uzyskują informacje o interfejsie za pośrednictwem Netlink, a state …sekcja jest drukowana na podstawie atrybutu netlink IFLA_OPERSTATE. ( kod źródłowy )

Ten atrybut jest również dostępny poprzez sysfs …/operstate. Dokumentacja systemu Linux zawiera bardziej szczegółowe objaśnienie tych flag i atrybutów w pliku operstates.txt .


Dziękuję za wyjaśnienie. Mam również interfejs Ethernet, który ip linkzgłasza, że ​​ma flagi, BROADCAST,MULTICAST,UP,LOWER_UPale który pokazuje, że sysfs ma flagi 0x1003 (to samo co powyżej interfejs docker0). Myślę, że rozbieżność wynika z tego, że narzędzia iproute nie używają sysfs. Czy rozsądnie jest próbować wywnioskować stan łącza operacyjnego z sysfs, czy też konieczne jest użycie innego interfejsu? Robię to w pythonie i staram się unikać subprocess.call('ip link show | grep eth0'.split()).split()itp.
Tom

Bah, nieważne, znalazłem /sys/class/net/eth0/operstateteraz sam ...
Tom

1
@Tom: Użyj operstateatrybutu sysfs. Użyj modułu python rtnetlink. (Mam niewielkie podejrzenie, że IFF_LOWER_UP jest zgłaszany tylko przez netlink, ale nie przez sysfs.) Użyj, ip -json link show | jq ".[]|.operstate"jeśli musisz ...
grawity
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.