![在Linux/bsd中检测网卡是否为虚拟网卡(docker/veth/etc)](https://linux22.com/image/705137/%E5%9C%A8Linux%2Fbsd%E4%B8%AD%E6%A3%80%E6%B5%8B%E7%BD%91%E5%8D%A1%E6%98%AF%E5%90%A6%E4%B8%BA%E8%99%9A%E6%8B%9F%E7%BD%91%E5%8D%A1%EF%BC%88docker%2Fveth%2Fetc%EF%BC%89.png)
我看到了一些关于在 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
不确定是否同样适用于其他分布。