重学kvm之六(PCI/PCIe设备透传、USB设备透传、SR-IOV功能的实现)

A、pci/pci设备透传

A1、qemu与其他商业软件的pci/pci-e设备透传介绍

功能区别
    1、qemu目前仅支持透传
    2、某些商业软件除支持透传外 还支持pci/pci-e设备重定向(需要bios的cpu设置中打开 Intel VT-d或者 AMD的AND Vi)
可透传的设备:显卡GPU、声卡、HBA卡、网卡、USB控制器等

注意:其中某些设备需要额外设置(IOMMU)才能透传(注意:Intel IOMMU 和IOMMU的区别哦)

透传前需要知道总线地址信息
    提醒:qemu实现中有为设备直接分配准备的设备模型,包括pci-assgn、vfio-pci、vfio-vga等

A2、以网卡为例介绍pci/pci-e设备的透传

1、查看网卡的pci详细信息
    lspci
......
02:05.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)(rev 01)
#可见网卡型号 Intel 82545EM ,BDF号为 02:05.0
......

2、写一个域定义文件,类型pci,总线号0x02,物理设备号0x05,逻辑设备号0x0
    cat >> pci-e1000.xml << EOF
<hostdev mode='subsystem' type='pci' managed='yes'>
    <source>
    <address domain='0x0000' bus='0x02' slot='0x05' function='0x0'/>
    </source>
</hostdev>

3、使用virsh工具的 attach-device 参数将这个设备添加到虚拟机
    virsh attach-device kvm7786 pci-e1000.xml

4、注意:并不是所有主机,虚拟机系统和pci、pcie设备都支持热插拔,不支持时热插拔可能导致虚拟机死机或者主机死机哦

B、usb设备透传

B1、usb设备介绍

1、设备上的usb一般包含:
    控制器:控制器在主机上,主机可以同时有一个或多个usb控制器,控制器通过root hub提供接口供其他usb设备连接
    外  设:可分为hub、存储、智能卡、加密狗、打印机等

2、常见的usb协议有:1.1、2.0、3.0、3.1(Type-C)等

3、可以对那些进行透传操作
    usb控制器:可以进行透传
    usb  外设:可以进行透传或者重定向

B2、对usb控制器进行透传

1、找到usb控制器对应的pci总线地址(usb控制器也位于pci总线上)
    lspci -nn | grep -i usb
00:1a.0 USB controller [0c03]: Intel Corporation C610/X99 series chipset USB Enhanced Host Controller #2 [8086:8d2d](rev 05)
00:1d.0 USB controller [0c03]: Intel Corporation C610/X99 series chipset USB Enhanced Host Controller #1 [8086:8d26](rev 05)

2、查看外设简图确定要透传的usb接口(防止将主机的usb键鼠设备的控制器透传给虚拟机)
    lsusb

3、参考上一节的驱动绑定,使用vfio-pci对usb控制器进行透传,假设要透传的控制器为2号控制器,
    其 总线地址为:  00::1a.0
    其 设备ID  为:  8086:8d26
    echo 0000:00:1a.0 > /sys/bus/pci/devices/0000\:04\:10.0/driver/unbind
    echo 8086 8d26 > /sys/bus/pci/drivers/vfio-pci/new_id

4.4、最后在qemu中添加如下参数
    -device vfio-pci, host=00:1a.0, id=hostdev0, bus=pci.0 multifunction=on, addr=0x9

B3、对usb外设进行透传(该场景碰到的几率较高)

qemu下对usb外设的透传相对容易,只需要在域定义中添加对应的usb外设厂商和设备ID即可,以透传usb-key为例
1、查看设备总线地址和设备ID
    lsusb
Bus 001 Device 001:ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003:ID 04b9:8001 Rainbow Technologies,Inc.

2、在域定义中添加设备ID,也可制定设备的总线地址
#<hostdev mode='subsystem' type='usb' managed='no' >
<hostdev mode='subsystem' type='usb' managed='yes' >
    <source>
    <vendor id='0x04b9'/>
    <product id='0x8001'/>
    </source>
</hostdev>

3、对应到qemu的参数是
    "-device usb-host, vendorid=0x04b9, productid=0x8001"
    或者 "-device usb-host, hostbus=1, hostaddr=3, id=hostdev0"
    也可以是 "-usbdevice host:0529:0001"等形式

C、sr-iov(不太好写)

声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/1109.html
谢谢你请我吃辣条谢谢你请我吃辣条

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2023/3/26作者: 辣条①号

目标:网络规划设计师、系统工程师、ceph存储工程师、云计算工程师。 不负遇见,不谈亏欠!

暂无评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

arrow grin ! ? cool roll eek evil razz mrgreen smile oops lol mad twisted wink idea cry shock neutral sad ???

文章目录