目录

网卡虚拟化(简)

总结来说,网卡的VF虚拟化技术在云计算、容器化、高性能计算、SDN/NFV等领域具有广泛的应用,通过提高网络性能、增强资源隔离和利用率、简化管理,满足现代数据中心和网络环境的多样化需求。

SRIOV,即单根虚拟化。Intel在早期为了支持虚拟化环境,在CPU和PCI总线上提供了三层虚拟化技术,它们分别是:

  1. 基于处理器的虚拟化技术VT-x
  2. 基于PCI总线实现的IO虚拟化技术VT-d
  3. 基于网络的虚拟化技术VT-c

从SRIOV的中文字面不难理解,它属于VT-d技术的一个分支,要实现SRIOV功能,前提条件就是你的网卡首先要支持SRIOV,你的主板要支持VT-d技术(支持VT-d自然也就支持SRIOV)

  1. PF就是物理网卡所支持的一项PCI功能,PF可以扩展出若干个VF

  2. VF是支持SRIOV的物理网卡所虚拟出的一个“网卡”或者说虚出来的一个实例,它会以一个独立网卡的形式呈现出来,每一个VF有它自己独享的PCI配置区域,并且可能与其他VF共享着同一个物理资源(公用同一个物理网口)

  3. PF miniport driver即PF驱动是工作于Hyper-V虚拟化平台父区域的,并在VF之前最先加载

  4. VF miniport driver即VF驱动是工作于Hyper-V虚拟化平台子区域的,即guestOS;需要注意的是,VF及PF之间是隔离的,任何经由VF驱动或所执行的结果都不会影响到其他的VF或PF

  5. Network Interface Card即物理网卡,在启用SRIOV之后会生成若干vport,物理NIC所要做的就是转发physical port与vport之间的流

  6. physical port顾名思义就是物理网口,在SRIOV场景中physical port充当一个面向对外的网络媒介

  7. VPort是个抽象出来的接口,类似于物理网口,它们被映射给每一个VF或者PF,供parentOS或guestOS来使用

    启用SRIOV之后,物理NIC将通过VF与虚拟机(VF driver)进行数据交互,反之亦然。那么这样一来即可跳过中间的虚拟化堆栈(即VMM层),以达到近乎于纯物理环境的性能;这一点也是SRIOV最大的价值所在,它有别于以往虚拟机通过仿真设备和虚拟化层进行流量传递的情况。

1)查看是否支持

若含有 Intel_iommu=on iommu=pt 则支持虚拟化

(base) kwephispre11269:/ # cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.12.14-120-default root=UUID=e33c9337-79fb-429e-afd1-7dc59392fe2d mitigations=auto splash=silent quiet showopts net.ifnames=0 nospec nopti

2)查看设备端口

(base) kwephispre11269:/ # cd /sys/class/net/ && ls
eth0  lo

(base) kwephispre11269:/sys/class/net # cd eth0
(base) kwephispre11269:/sys/class/net/eth0 # ls -l
total 0
-r--r--r-- 1 root root 4096 Jun 11 10:47 addr_assign_type
-r--r--r-- 1 root root 4096 Jun 11 10:47 addr_len
-r--r--r-- 1 root root 4096 Jun 11 10:47 address
-r--r--r-- 1 root root 4096 Jun 11 10:47 broadcast
-rw-r--r-- 1 root root 4096 Jun 11 10:47 carrier
-r--r--r-- 1 root root 4096 Jun 11 10:47 carrier_changes
-r--r--r-- 1 root root 4096 Jun 11 10:47 dev_id
-r--r--r-- 1 root root 4096 Jun 11 10:47 dev_port
lrwxrwxrwx 1 root root    0 Jun 11 10:47 device -> ../../../virtio0
-r--r--r-- 1 root root 4096 Jun 11 10:47 dormant
-r--r--r-- 1 root root 4096 Jun 11 10:47 duplex
-rw-r--r-- 1 root root 4096 Jun 11 10:47 flags
-rw-r--r-- 1 root root 4096 Jun 11 10:47 gro_flush_timeout
-rw-r--r-- 1 root root 4096 Jun 11 10:47 ifalias
-r--r--r-- 1 root root 4096 Jun 11 10:47 ifindex
-r--r--r-- 1 root root 4096 Jun 11 10:47 iflink
-r--r--r-- 1 root root 4096 Jun 11 10:47 link_mode
-rw-r--r-- 1 root root 4096 Jun 11 10:47 mtu
-r--r--r-- 1 root root 4096 Jun 11 10:47 name_assign_type
-rw-r--r-- 1 root root 4096 Jun 11 10:47 netdev_group
-r--r--r-- 1 root root 4096 Jun 11 10:47 operstate
-r--r--r-- 1 root root 4096 Jun 11 10:47 phys_port_id
-r--r--r-- 1 root root 4096 Jun 11 10:47 phys_port_name
-r--r--r-- 1 root root 4096 Jun 11 10:47 phys_switch_id
drwxr-xr-x 2 root root    0 Jun 11 10:47 power
-rw-r--r-- 1 root root 4096 Jun 11 10:47 proto_down
drwxr-xr-x 4 root root    0 Jun 11 10:47 queues
-r--r--r-- 1 root root 4096 Jun 11 10:47 speed
drwxr-xr-x 2 root root    0 Jun 11 10:47 statistics
lrwxrwxrwx 1 root root    0 Jun 11 10:47 subsystem -> ../../../../../../class/net
-rw-r--r-- 1 root root 4096 Jun 11 10:47 tx_queue_len
-r--r--r-- 1 root root 4096 Jun 11 10:47 type
-rw-r--r-- 1 root root 4096 Jun 11 10:47 uevent

Linux系统是基于文件系统的,可以看到网卡的设备参数都是一个个文件在描述。eth0是PF。

3)vf

(base) kwephispre11269:/sys/class/net/eth0 # cd device && ls -l
total 0
-r--r--r-- 1 root root 4096 Jun 11 10:59 device
lrwxrwxrwx 1 root root    0 May  6 20:48 driver -> ../../../../bus/virtio/drivers/virtio_net
-r--r--r-- 1 root root 4096 Jun 11 10:59 features
-r--r--r-- 1 root root 4096 Jun 11 10:59 modalias
drwxr-xr-x 3 root root    0 May  6 20:48 net
drwxr-xr-x 2 root root    0 May  7 09:09 power
-r--r--r-- 1 root root 4096 Jun 11 10:59 status
lrwxrwxrwx 1 root root    0 May  6 20:48 subsystem -> ../../../../bus/virtio
-rw-r--r-- 1 root root 4096 Jun 11 10:59 uevent
-r--r--r-- 1 root root 4096 Jun 11 10:59 vendor

该目录下有sriov_numvfs,他描述了将会虚拟化出多少个VF。

DPDK 就是围绕这些文件进行配置和操作,理解这些文件的用途,对DPDK学习有很大帮助。修改这些参数,观察内核的状态变化。

4)vf网卡参数解析

vf 0 MAC 00:00:00:00:00:00, spoof checking on, link-state auto

这里是用户MAC,可以有多个,但是端口MAC,有且只能有一个。spoof checking on是做MAC校验,校验从源MAC到端口MAC发送的内容是否一致,不一致则丢弃。link-state auto 自动随发,fix 固定的,disabled 去使能。trust on,非信任模式时,提供有限能力集;开启时,可以开启所有能力。

查看例如 /sys/module,内核插入ko后,文件夹下会有一个对应的目录

1)-i 查看固件版本和驱动版本,版本间需要配套等

(base) kwephispre11269:/ # ethtool -i eth0
driver: virtio_net
version: 1.0.0
firmware-version:
expansion-rom-version:
bus-info: 0000:00:03.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

2)查看基本信息

(base) kwephispre11269:/ # ethtool eth0
Settings for eth0:
        Supported ports: [ ]
        Supported link modes:   Not reported
        Supported pause frame use: No
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: Unknown!
        Duplex: Unknown! (255)
        Port: Other
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: off
        Link detected: yes

speed速度,Duplex为full则是全双工,port为FIBER是光纤连接,link detected是物理状态连接,yes则物理状态正常