Как iproute2 `ip link show` определяет состояние ссылки?

276
Tom

У меня есть сетевой интерфейс, который ip link showсообщает, как это:

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 

Но /sys/class/net/docker0/flagsговорит это:

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

Три бита, которые установлены IFF_MULTICAST, IFF_BROADCASTи IFF_UP. Это похоже на интерфейс, который UP. Почему ip linkотчет state DOWN?

Система Linux 4.15 / Ubuntu 18.04.

3

1 ответ на вопрос

2
grawity

Устанавливаются три бита: IFF_MULTICAST, IFF_BROADCAST и IFF_UP. Это похоже на интерфейс, который UP

И это прекрасно соответствует фактическому выводу флагов :

3: docker0: <НЕТ НОСИТЕЛЬ, ВЕЩАТЕЛЬ, МУЛЬТИКАСТ, ВВЕРХ > ↑ ↑ ↑ 

Почему IP-ссылка сообщает о состоянии ВНИЗ?

Это другой тип государства.

  • Флаг IFF_UP (показанный выше как «<UP>») описывает административное состояние, которое представляет собой ручную ручку, которую можно установить с помощью ip link set eth0 up.

  • С другой стороны, текст «состояние […]» описывает рабочее состояние, которое указывает, способен ли интерфейс работать.

Рабочее состояние примерно совпадает с присутствием «оператора» - например, канал Ethernet полностью установлен или точка доступа Wi-Fi связана с. Сообщается, что мост работает (имеет оператора связи), если хотя бы один из его портов-участников работает. По этой причине вы можете добавить dummy0интерфейс в качестве члена моста.

Рабочее состояние приблизительно соответствует флагам IFF_LOWER_UP(показанным как «<LOWER_UP>» в области флагов) и IFF_RUNNING(его отсутствие показано как псевдофлажок «<NO-CARRIER>» в вашем примере). ( исходный код )

Однако инструменты iproute получают информацию об интерфейсе через Netlink, и этот state …раздел печатается на основе атрибута netlink IFLA_OPERSTATE . ( исходный код )

Этот атрибут также доступен через sysfs …/operstate. Документация Linux содержит более подробное объяснение этих флагов и атрибутов в operstates.txt .

Thanks for the explanation. I also have an ethernet interface which `ip link` reports to have flags `BROADCAST,MULTICAST,UP,LOWER_UP` but which sysfs shows to have flags 0x1003 (same as the docker0 interface above). I guess the discrepancy is because iproute tools are not using sysfs. Is ti reasonable to try to infer operational link state from sysfs, or is it necessary to use another interface? I'm doing this in python and trying to avoid `subprocess.call('ip link show | grep eth0'.split()).split()` etc. Tom 5 лет назад 0
Бах, не бери в голову, я нашел `/ sys / class / net / eth0 / operstate` теперь сам по себе ... Tom 5 лет назад 0
@Tom: Используйте атрибут `operstate` sysfs. Используйте модуль Python rtnetlink. (У меня есть небольшое подозрение, что IFF_LOWER_UP сообщается только через netlink, но не через sysfs.) Используйте `ip -json link show | jq ". [] | .operstate" `если нужно ... grawity 5 лет назад 0