簡單地說,SR-IOV是一種讓一臺主機上的多臺虛擬機和主機系統本身合用同一張物理網卡的技術,每臺虛擬機都認為自己擁有一張獨立的網卡(即一個VF),而其實它們都被騙了~~
由于手上只有一臺Linux主機和一張Mellanox ConnectX-4 LX 10G網卡(雙物理網口),為了研究SR-IOV,我只能搭建了如下圖所示的極簡測試環境。這塊網卡支持RoCE(RDMA),但在這里只使用它的以太網功能。
對于宿主機的操作系統來說,這塊網卡的兩個物理網口可以看作兩個獨立的網卡/網絡接口。如果運行ifconfig,可以看到系統中存在enp6s0f0np0和enp6s0f1np1兩個網口。
之所以會這樣,是因為硬件向系統展現了兩個PCIe設備,準確地說是兩個功能號。
比如用下面這個命令,可以看到這兩個PCIe設備的"bus:slot.func",即"總線號:設備號:功能號"。
$ lspci -D | grep Mellanox
0000:06:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
0000:06:00.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
一旦網卡被插在PCIe插槽上,它的bus和slot就確定了,并且是唯一的。但硬件只要提供兩個獨立的func,就會被Linux檢測為兩個獨立的PCIe設備,從而對應兩個獨立的網口。
準備好上述硬件連接和操作系統(Ubuntu 20.04.6)后,我們需要做如下幾件事才能使用SR-IOV功能。此處主要的參考文獻為《HOWTO CONFIGURE SR-IOV FOR CONNECTX-4/CONNECTX-5/CONNECTX-6 WITH KVM (ETHERNET)》。本文并非操作手冊,所以一些網上可以很容易搜到的東西我就不詳細說明了。
- 在BIOS中打開SR-IOV功能,一般位于PCI配置中。
- 在Linux啟動命令行中添加“intel_iommu=on iommu=pt”(對于Intel CPU)。
- 在Ubuntu中安裝虛擬機(只安裝virt-manager就幾乎把所有組件都安裝了)。
- 在宿主機安裝Mellanox網卡驅動。
安裝文件為MLNX_OFED_LINUX-5.8-2.0.3.0-ubuntu20.04-x86_64.tgz,需要從NVIDIA網站下載。
如果以后要看代碼還需要下載MLNX_OFED_SRC-debian-5.8-2.0.3.0.tgz 。
- 設置網卡的固件,使其支持SR-IOV。比如運行如下命令,將網卡最大支持的VF數量設置為8個。
*sudo mlxconfig -d /dev/mst/mt4117_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=8*
- 設置MLNX_OFED驅動(最終也會設置硬件),打開SR-IOV功能。
比如運行如下命令,使能4個VF。
echo 4 > /sys/class/net/enp6s0f1np1/device/sriov_numvfs
此時系統中會呈現4個VFs(每個都是一個PCIe設備),分別對應下面的后四行,即0000:06:00.2(后三個數就是"bus:slot.func")、0000:06:00.3、0000:06:00.4和0000:06:00.5。
$ lspci -D | grep Mellanox
0000:06:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
0000:06:00.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
0000:06:01.2 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
0000:06:01.3 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
0000:06:01.4 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
0000:06:01.5 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function]
- 把第一個VF添加到虛擬機中,虛擬機會把它認做一個獨立的PCIe設備。
這里給一個配置虛擬機的參考圖。
- 在虛擬機中安裝MLNX_OFED驅動。
此時我們會得到如下圖所示的測試環境。
如果我們在虛擬機里把enp6s0的IP設置為192.168.8.1。
然后在宿主機里把兩個原有的非VF的系統網口的IP設置為192.168.8.2(enp6s0f0np0)和192.168.8.3(enp6s0f1np1),并把VF3(在宿主機中)對應的網口enp6s0f1v3的IP設置為192.168.8.4。
在虛擬機中是可以ping通上述后三個IP的。
當然在這三種情況下數據走的物理通路是不同的。
按照我淺薄的認識,我認為從虛擬機中ping后面三個IP時,應該對應下圖中三條彩色虛線所示的數據通路。
對于不同的物理網口,數據肯定會通過光纖。
對于屬于相同物理網口的PF(對應原系統網口)和VFs,我認為網卡硬件中存在一個內部的交換機機制,使得所有PF和VFs之間都可以轉發數據包。之所以這樣想,是由于做了如下測試:
①在虛擬機中連續地ping 192.168.8.5,這是一個并不存在的地址。
②同時在宿主機上依次用“tcpdump -i enpXXXX”命令監視每個網口,包括未配置IP的VF。
可以發現每個網口都會持續收到ARP報文。如果數據沒有經過硬件而是在操作系統內部直接處理掉了,那這么做是完全沒必要的,因為系統知道每個網口的IP。并且ifconfig命令輸出中也會顯示每個網口的RX計數在持續增加,這種計數一般在驅動中實現,而且只有驅動真正從硬件收到包時才會增加計數。
在今后閱讀相關驅動代碼時我還會關注這一點。歡迎高手來拍磚。
本文只是搭建了一個簡單的測試環境,嘗試使用SR-IOV功能。接下來我會研究Linux系統和Mellanox驅動中做了哪些事情支持SR-IOV功能,以及猜測需要硬件做哪些工作。
-
以太網
+關注
關注
40文章
5425瀏覽量
171732 -
Linux系統
+關注
關注
4文章
593瀏覽量
27397 -
虛擬機
+關注
關注
1文章
917瀏覽量
28202 -
RDMA
+關注
關注
0文章
77瀏覽量
8949 -
PCIe接口
+關注
關注
0文章
120瀏覽量
9706
發布評論請先 登錄
相關推薦
評論