Detectar se uma placa de rede é uma placa de rede virtual (docker / veth / etc) no Linux / bsd

5

Eu vejo uma boa explicação para buscar informações sobre placas de rede e suas estatísticas no ubuntu em isto página. Isso deu uma boa saída, como mencionado na página. Eu tentei ler outras documentações também, mas não consegui encontrar uma bandeira ou algo parecido, onde eu possa diferenciar entre as placas de rede reais e virtuais no meu sistema.

Existe alguma maneira de diferenciar? Obrigado.

    
por Gagan93 30.05.2017 / 09:10

1 resposta

6

Verifique o link simbólico /sys/class/net/<device_name> . Se ele apontar para /sys/devices/virtual/ , então é uma interface virtual. Se ele apontar para um dispositivo "real" (por exemplo, em /sys/devices/pci0000:00/ ), então não é.

Editar:

Do código, você pode usar readlink para verificar se o dispositivo é virtual. Aqui está um código de exemplo muito fictício para fazer isso:

#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]);
        }
    }
}
    
por 30.05.2017 / 09:38