Linux 中的虚拟网络接口

Linux 中的虚拟网络接口

当我创建一个虚拟网络接口并启动它时,它显示处于未知状态:

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 年,向用户空间呈现虚拟接口的正确链接状态并不是当务之急。

相关内容