当我创建一个虚拟网络接口并启动它时,它显示处于未知状态:
root@5b8dd2855a9c:# ip l a boom type dummy
root@5b8dd2855a9c:# ip l show boom
58: boom: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT
link/ether 1e:f6:4b:60:ff:1a brd ff:ff:ff:ff:ff:ff
root@5b8dd2855a9c:# ip l set boom up
root@5b8dd2855a9c:# ip l show boom
58: boom: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state **UNKNOWN** mode DEFAULT
link/ether 1e:f6:4b:60:ff:1a brd ff:ff:ff:ff:ff:ff
root@5b8dd2855a9c:#
有人知道为什么吗?我尝试为其分配一个 IP 地址,但问题并未得到解决。
我在以下机器上进行了测试:
root@5b8dd2855a9c:# uname -a
Linux 5b8dd2855a9c 3.16.1-tinycore64 #1 SMP Fri Aug 22 05:53:09 UTC 2014 x86_64 GNU/Linux
root@5b8dd2855a9c:#
更新:
所以看起来这并没有让界面无法使用。在谷歌上搜索了一番后,我找到了此信息
答案1
看看驱动程序/net/dummy.c和包括/linux/netdevice.h,看起来虚拟网络接口驱动程序仅实现了一小部分网络设备操作:
从第 112 行开始驱动程序/net/dummy.c我们了解到:
static const struct net_device_ops dummy_netdev_ops = {
.ndo_init = dummy_dev_init,
.ndo_uninit = dummy_dev_uninit,
.ndo_start_xmit = dummy_xmit,
.ndo_validate_addr = eth_validate_addr,
.ndo_set_rx_mode = set_multicast_list,
.ndo_set_mac_address = eth_mac_addr,
.ndo_get_stats64 = dummy_get_stats64,
.ndo_change_carrier = dummy_change_carrier,
};
当看着包括/linux/netdevice.h,其中struct net_device_ops
定义,似乎有(准确地说是第 1057 行):
int (*ndo_set_vf_link_state)(struct net_device *dev,
int vf, int link_state);
这给我们提供了什么答案,而不是仅仅在这里放一堆文字并希望获得 +10 分?嗯,答案既是肯定的,也是否定的。
来源显示,是的,状态 UNKNOWN 是预期行为,因为没有任何东西可以设置该状态,因此它肯定应该是 UNKNOWN。另一方面,可以合理地预期用户打开虚拟接口时应该看到状态发生变化。这是一个经典的例子,说明内核无法满足从用户角度来看合理的预期。
那么下一个问题可能是:这是一个错误吗?应该修复吗?如果答案是肯定的,那么这超出了范围,但如果有人愿意,当然可以修复它。然而,值得注意的是,虚拟接口在内核中已经存在了相当长一段时间,确切地说是 20 年。我想,早在 1994 年,向用户空间呈现虚拟接口的正确链接状态并不是当务之急。