在Linux/bsd中检测网卡是否为虚拟网卡(docker/veth/etc)

在Linux/bsd中检测网卡是否为虚拟网卡(docker/veth/etc)

我看到了一些关于在 ubuntu 中获取网卡及其统计信息的很好的解释页面。正如页面上所述,这给出了一个很好的输出。我也尝试阅读其他文档,但找不到标志或类似的东西来区分我系统上的真实网卡和虚拟网卡。

有什么办法可以区分吗?谢谢。

答案1

检查/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]);
        }
    }
}

答案2

另一种方法是检查文件是否/sys/class/net/<interface>/device存在。通常,docker 和其他虚拟接口没有该文件(实际上是设备的符号链接)。这应该有效:

for device in $(ls /sys/class/net/); do
  if [ -L /sys/class/net/$device/device ]; then
     echo "Device : $device"
  else
     echo "Virtual: $device"
  fi
done 

输出(在我的笔记本电脑上执行的示例):

Virtual: docker0
Virtual: docker_gwbridge
Device : enp0s25
Virtual: lo
Virtual: veth7a67a62
Device : wlo1
Virtual: ztmjfg2jdx

经过测试,Ubuntu 22.04不确定是否同样适用于其他分布。

相关内容