Linux

Linux中的虛擬網路介面

  • September 19, 2014

當我創建一個虛擬網路介面然後將其啟動時,它顯示為處於 UNKNOWN 狀態:

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:#

更新:

所以看起來這並沒有使界面無法操作。經過一些奴性的Google搜尋後,我發現了這個資訊

查看drivers/net/dummy.cinclude/linux/netdevice.h,似乎虛擬網路介面驅動程序只實現了一小部分網路設備操作:

drivers/net/dummy.c的第 112 行我們了解到:

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,
};

在查看include/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 年,我想為使用者空間的虛擬介面提供正確的連結狀態並不是什麼優先事項。

引用自:https://serverfault.com/questions/629676