Вопрос или проблема
Я хотел узнать, есть ли способ различать физические и виртуальные сетевые устройства. ip a
не предоставляет такой возможности. Поэтому я проверяю /sys/class/net/<iface>
.
Существуют два атрибута addr_assign_type
и type, но type только указывает Ethernet
или loopback
, он не говорит, является ли устройство виртуальным.
Я хотел узнать, говорит ли addr_assign_type
нам о различии?
Согласно моим наблюдениям, /sys/class/net/<iface>/{eth|loopback}
дает 0
, а /sys/class/net/<iface>/{virtualdevice}
дает 1 или 3
.
Можно ли что-то извлечь из этого?
Когда вы выполняете ethtool -i <сетевой интерфейс>
, физические интерфейсы должны иметь строчку bus-info:
, которая идентифицирует соответствующее аппаратное устройство. Для виртуальных устройств bus-info:
будет пустым.
Для идентификации, основанной на /sys
, вы можете сделать что-то вроде этого:
if readlink /sys/class/net/$IFACE | grep -q /virtual/
then
echo "$IFACE is virtual"
else
echo "$IFACE is physical"
fi
Согласно странице sysfs-class-net на kernel.org:
Что: /sys/class/net/<iface>/addr_assign_type
Дата: Июль 2010
Версия ядра: 3.2
Контакты: [email protected]
Описание:
Указывает тип назначения адреса. Возможные значения:
== ============================
0 постоянный адрес
1 случайно сгенерированный
2 украденный у другого устройства
3 установленный (через) dev_set_mac_address
== ============================
.
Ответ или решение
Для идентификации физических и виртуальных сетевых устройств в Linux существует несколько методов, включая анализ содержимого каталога /sys/class/net/<iface>
. Давайте рассмотрим этот процесс подробнее, чтобы вы могли эффективно различать физические и виртуальные сетевые интерфейсы.
Структура /sys/class/net/<iface>
В каталоге /sys/class/net/<iface>
содержится информация о каждом сетиовом интерфейсе. Среди атрибутов, которые вас интересуют, выделяются addr_assign_type
и type
:
-
type: дает общую информацию о типе интерфейса, например, Ethernet или loopback. Однако по этому атрибуту не всегда можно с уверенностью сказать, является ли устройство виртуальным.
-
addr_assign_type: указывает тип назначения адреса. Возможные значения:
0
: постоянный адрес;1
: случайно сгенерированный адрес;2
: адрес, "украденный" у другого устройства;3
: адрес установленный с помощьюdev_set_mac_address
.
По вашему наблюдению, физические устройства имеют значение 0
для addr_assign_type
, в то время как виртуальные устройства могут иметь значения 1
или 3
. Это действительно может помочь в определении типа устройства. Однако это не стопроцентный способ, так как в некоторых случаях виртуальные интерфейсы могут получить постоянный адрес.
Использование ethtool
Еще один способ различения физических и виртуальных интерфейсов заключается в использовании утилиты ethtool
. Выполнив команду ethtool -i <network interface>
, вы можете обратить внимание на строку bus-info:
. Для физических интерфейсов эта строка будет содержать информацию о аппаратном устройстве, в то время как для виртуальных интерфейсов она обычно будет пустой.
Скрипт для автоматизации
Вы можете автоматизировать процесс определения типа интерфейса с помощью простого скрипта на оболочке. Например:
if readlink /sys/class/net/$IFACE | grep -q /virtual/; then
echo "$IFACE - виртуальный интерфейс"
else
echo "$IFACE - физический интерфейс"
fi
Этот скрипт проверяет символическую ссылку для интерфейса и ищет слово virtual
. Если оно присутствует, интерфейс считается виртуальным, иначе — физическим.
Заключение
Хотя анализ атрибутов в /sys/class/net/<iface>
может предоставить некоторую информацию о сетевых интерфейсах, рекомендуется использовать комбинированный подход: анализировать как addr_assign_type
, так и вывод ethtool
. Учитывая вариабельность в конфигурациях и установках, надежный способ различать физические и виртуальные сетевые интерфейсы требует использования нескольких методов одновременно.
Информация, представленная в этом ответе, поможет вам лучше понимать, как идентифицировать сетевые устройства в Linux. Если у вас остались вопросы или нужна дополнительная информация, не стесняйтесь обращаться.