Назад | Перейти на главную страницу

Определить, является ли сетевая карта виртуальной сетевой картой (docker / veth / etc) в Linux / bsd

Я вижу хорошее объяснение для получения информации о сетевых картах и ​​их статистике в ubuntu на этот страница. Это дало хороший результат, как указано на странице. Я пробовал читать и другие документы, но не смог найти флага или чего-то подобного, по которому я мог бы различать настоящие и виртуальные сетевые карты в моей системе.

Есть ли способ отличить? Спасибо.

Проверить /sys/class/net/<device_name> символическая ссылка. Если он указывает на /sys/devices/virtual/, то это виртуальный интерфейс. Если он указывает на «настоящее» устройство (например, на /sys/devices/pci0000:00/), то это не так.

Редактировать:

Из кода вы можете использовать readlink чтобы проверить, является ли устройство виртуальным. Вот очень фиктивный пример кода для этого:

#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char **argv) {
    char theLink[128];
    char thePath[128];

    strcpy(thePath,"/sys/class/net/");
    memset(theLink,0,128);

    if (argc>1) {
        strcat(thePath,argv[1]);
    } else {
        printf("Gimme device\n");
        return 1;
    }

    if (readlink(thePath, theLink, 127)==-1) {
        perror(argv[1]);
    } else {
        if (strstr(theLink,"/virtual")) {
            printf("%s is a virtual device\n",argv[1]);
        } else {
            printf("%s is a physical device\n",argv[1]);
        }
    }
}