igb網卡MAC地址為0時VF不能在guest中使用如何解決

來源:互聯網
上載者:User

在使用了Linux 3.9 作為KVM host的核心後,使用Intel igb NIC(如:82576, I350)的SR-IOV,在將VF(igbvf)分配guest使用時,可能會遇到不工作的情況。在guest的dmesg中可以看到如下的錯誤資訊:

 代碼如下 複製代碼
igbvf 0000:00:03.0: irq 26 for MSI/MSI-X
igbvf 0000:00:03.0: Invalid MAC Address: 00:00:00:00:00:00
igbvf: probe of 0000:00:03.0 failed with error -5


即是,在guest中檢測到的igbvf的MAC地址為全0,如kernel(KVM)bugzilla上的這個bug:
https://bugzilla.kernel.org/show_bug.cgi?id=55421

經過分析,出現這個問題的原因是,在最新的igb driver中在igbf使用時,會預設設定其MAC地址為全0,而之前是設定一個隨機的MAC,可以看下面的Patch真是去做這件事情的。

 代碼如下 複製代碼
[root@jay-linux kvm.git]# git diff 5ac6f91d39e088^ 5ac6f91d39e088
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index b81a953..a59e630 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -5197,7 +5197,7 @@ static int igb_vf_configure(struct igb_adapter *adapter, int vf)
 {
        unsigned char mac_addr[ETH_ALEN];
 
-       eth_random_addr(mac_addr);
+       eth_zero_addr(mac_addr);
        igb_set_vf_mac(adapter, vf, mac_addr);
 
        return 0;
@@ -5550,9 +5550,9 @@ static void igb_vf_reset_event(struct igb_adapter *adapter, u32 vf)
 {
        unsigned char *vf_mac = adapter->vf_data[vf].vf_mac_addresses;
 
-       /* generate a new mac address as we were hotplug removed/added */
+       /* clear mac address as we were hotplug removed/added */
        if (!(adapter->vf_data[vf].flags & IGB_VF_FLAG_PF_SET_MAC))
-               eth_random_addr(vf_mac);
+               eth_zero_addr(vf_mac);
 
        /* process remaining reset events */
        igb_vf_reset(adapter, vf);



至於為什麼設定為全0而不使用曾經的隨機MAC呢,這主要是因為隨機的MAC在guest中與udev不能很好的工作,多次使用VF後會讓ethX(X為數字編號)的編號持續增長變化,可能變為eth500、eth666之類的,對使用者很不友好。

所以在KVM中,對於igb NIC的SR-IOV操作,需要注意以下兩種方法(注意使用其中一種方法即可避免VF的MAC全0的情況):

1. 在分配VF給客戶機之前,需要在host中先設定igbvf的MAC地址,命令如下:

 代碼如下 複製代碼
[root@jay-linux ~]# ip link set eth0 vf 0 mac 00:1E:67:65:93:01
# eth0為host中PF對應的interface名稱,0代表PF的編號為0的VF(即第一個VF)
 
# 如果不清楚PF和VF對應關係,可以用下面的命令你個來查看以便確認
[root@jay-linux ~]# ethtool -i eth0
driver: igb
version: 4.1.2-k
firmware-version: 1.64, 0x800006fc
bus-info: 0000:0a:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no
[root@jay-linux ~]# ls -l /sys/bus/pci/devices/0000:0a:00.0/virtfn*
lrwxrwxrwx 1 root root 0 Apr 23 15:09 /sys/bus/pci/devices/0000:0a:00.0/virtfn0 -> ../0000:0b:10.0
lrwxrwxrwx 1 root root 0 Apr 23 15:09 /sys/bus/pci/devices/0000:0a:00.0/virtfn1 -> ../0000:0b:10.4
lrwxrwxrwx 1 root root 0 Apr 23 15:09 /sys/bus/pci/devices/0000:0a:00.0/virtfn2 -> ../0000:0b:11.0
lrwxrwxrwx 1 root root 0 Apr 23 15:09 /sys/bus/pci/devices/0000:0a:00.0/virtfn3 -> ../0000:0b:11.4
lrwxrwxrwx 1 root root 0 Apr 23 15:09 /sys/bus/pci/devices/0000:0a:00.0/virtfn4 -> ../0000:0b:12.0
lrwxrwxrwx 1 root root 0 Apr 23 15:09 /sys/bus/pci/devices/0000:0a:00.0/virtfn5 -> ../0000:0b:12.4
lrwxrwxrwx 1 root root 0 Apr 23 15:09 /sys/bus/pci/devices/0000:0a:00.0/virtfn6 -> ../0000:0b:13.0


2. 升級guest中的kernel或igbvf driver,發現在升級一個rhel6.4 guest的核心到 Linux 3.9 之後,也可以正常使用igbvf了(儘管沒有做第一種方法中在host中手動設定igbvf的MAC)。

這是因為最新的igbvf driver在檢測到MAC為全0時,也做了特別處理。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.