英文应该是叫qemu kvm usb device passthrough,有些人翻译成直通,有些人叫透传,总之就是passthrough。
下面的内容是综合整理了网上的教程和咨询前华为同事的结果,以及自己试验的一些结论。
准备工作:
- 确认宿主机BIOS里面打开了VT-d/VT-x/VT-i等所有硬件虚拟化支持开关
- 打开Linux操作系统的iommu开关,在grub启动命令行里面配置,Intel CPU和AMD CPU配置参数有区别:Intel CPU: intel_iommu=on;AMD CPU: amd_iommu=on
- 重启服务器,检查iommu配置是否生效(dmesg | grep -i iommu,输出“Intel-IOMMU: enabled”表示生效)
grub配置iommu参考资料:https://www.jianshu.com/p/035287ba9acb 《CentOS7 minimal kvm iommu 辅助虚拟化 vt-x (用于pci透传)》
在宿主机上通过lsusb命令获取USB设备信息(yum install usbutils -y安装该工具):
1 2 3 4 5 6 |
Bus 002 Device 002: ID 8087:8002 Intel Corp. Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 028: ID 413c:a001 Dell Computer Corp. Hub Bus 001 Device 032: ID 0781:5581 SanDisk Corp. Ultra Bus 001 Device 002: ID 8087:800a Intel Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub |
字段信息解释:Bus:001,Device:032,vendor id:0781,product id:5581
libvirt配置修改:
在虚拟机的libvirt xml配置文件的<devices></devices>段内添加如下配置:
1 2 3 4 5 6 |
<hostdev mode='subsystem' type='usb' managed='yes'> <source> <vendor id='0x1780'/> <product id='0x0401'/> </source> </hostdev> |
vendor id和product id就是lsusb获取的需要直通的usb设备信息,之后启动虚拟机,正常情况下就可以在虚拟机里看到usb设备了。
注意事项:
有些usb设备不在windows设备管理器的“通用串行总线控制器”里面(U盘一般属于这个),比如我试过的USB无线网卡,是属于“网络适配器”,U盾则属于“DVD/CD-ROM驱动器”,而加密狗设备,则属于“人体学输入设备”(我用的加密狗是这个,不同的加密狗可能有区别)。要区分设备类型,可以用lsusb -t命令查看(比如我用的加密狗设备信息如下):
1 2 |
/: Bus 07.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M |__ Port 2: Dev 2, If 0, Class=Human Interface Device, Driver=usbfs, 12M |
我就是通过Class=Human Interface Device,才想到它属于“人体学输入设备”的。
工行U盾直通效果:
另外nova里面(Mitaka版本)支持PCI设备的直通,但是usb设备好像还不支持,还没仔细研究过代码。
因此先临时用libvirt管理这台虚拟机了。注意如果手工修改了libvirt的xml配置,通过nova对虚拟机做操作,如reboot、stop/start、rebuild、resize等等会重置虚拟机的xml文件,相关usb配置都会丢失。(我是通过复制一份xml,修改掉uuid,让nova管理不了我这台虚拟机来解决的,用的系统盘、虚拟网卡还是nova创建的,nova看到的虚拟机永远是关机状态的就好了,它是用来为我手工管理的虚拟机占坑用的)。