SR-IOV简介:(参考:http://docs.oracle.com/cd/E38902_01/html/E38873/glbzi.html)

我们知道vt-d功能可以进行设备直接分配,用以让虚拟机使用达到类似物理机性能的i/o设备,但是使用vt-d有个缺点:一个设备只能让一个客户机使用,所以有没有什么办法可以让设备性能的情况下,让多个虚拟机同时使用呢?这个就是

SR-IOV(single root i/o virtualization and sharing) 技术,图片来自书本《kvm虚拟化技术 原理和实战解析》

sr-iov技术需要硬件设备的支持,它提供两种新功能类型:

物理功能(physical function pf):用于支持 SR-IOV 功能的 PCI 功能,如 SR-IOV 规范中定义。PF 包含 SR-IOV 功能结构,用于管理 SR-IOV 功能。PF 是全功能的 PCIe 功能,可以像其他任何 PCIe 设备一样进行发现、管理和处理。PF 拥有完全配置资源,可以用于配置或控制 PCIe 设备。

虚拟功能 (Virtual Function, VF):与物理功能关联的一种功能。VF 是一种轻量级 PCIe 功能,可以与物理功能以及与同一物理功能关联的其他 VF 共享一个或多个物理资源。VF 仅允许拥有用于其自身行为的配置资源。

简而言之,一个PF可以配置出多个VF,也可以自身作为一个完整资源提供给虚拟机使用。每个VF都有自己独立的配置空间(configuration space)和完整BAR(BASE ADDRESS REGISTER 基址寄存器),它是一个真正的独立的硬件资源。hypervisor把这些资源通过vd-x等硬件虚拟化技术绕过自身的软件交换机直接映射给客户机使用,可以把多个VF分配给不同的客户机,这样多个客户机就可以直接操作相同硬件资源

在kvm中,可以将一个或多个VF分配给一个客户机,客户机通过自身的VF驱动程序直接操作设备的VF而不需要kvm的参与。

SR-IOV使用(以网卡为例):

lspci -v -s $BDF #查看Capability选项来确定设备是否支持$BDF功能,一般显示为Capabilities: [160] Single Root I/O Virtualization (SR-IOV)

modinfo igb #查看igb模块说明,PF使用不同驱动支持不同数量的VF,比如网卡驱动igb最多支持7,而ixgbe最多支持63,可以看到说明中的“ parm:           max_vfs:Maximum number of virtual functions to allocate per physical function (uint)”

lsmod igb

rmmod igb 

modprobe igb max_vfs=7  #要想开启vf功能需要在加载驱动是加上max_vfs参数

ls -l /sys/bus/pci/devices/$BDF #可以观察这里的链接来查看PF和VF的对应关系

echo -n "$vendID $deviceID"> /sys/bus/pci/drivers/pci-stub/new_id

echo $BDF >/sys/bus/pci/devices/$BDF/driver/unbind

echo $BDF > /sys/bus/pci/drivers/pci-stub/bind #隐藏设备,当然这里的BDF指的是VF的BDF 

qemu-system-x86_64  -m 2048 -smp 3 xp.qcow2  -device pci-assign,host=$BDF,id=mydev0,addr=0x6 -usb -usbdevice tablet #通过-device 参数分配设备给客户机

PCI设备的热插拔:

pci设备的需要BIOS、pci总线、客户机操作系统内核和驱动程序的支持。

将一个可热插拔设备添加到客户机只需要在monitor界面中,使用以下命令:

device_add pco-assign,host=$BDF,id=yourid    #id可以自定义

要删除,则使用:

device_del  yourid #即插入时的id