Определение физических сетевых устройств с помощью /sys/class/net/

Вопрос или проблема

Я хотел узнать, есть ли способ различать физические и виртуальные сетевые устройства. 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. Если у вас остались вопросы или нужна дополнительная информация, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...