功能原理
日常使用中,我们将USB外设插入PC/ARM/X86等终端上,便能在虚拟机中识别到此外设并进行读写操作了。我们知道虚拟机都运行在VMP上,然后终端通过网络与VMP进行通信,因此我们将USB数据由网络在终端和VMP上虚拟机间的传输叫做USB重定向,即USB映射,详细如下所示:
USB映射详细的流程如下:
1、PC/ARM/X86等终端系统接收到一个USB外设插入的事件,这个事件会通知VDIClient。
2、VDIClient收到消息后,开始获取USB外设的信息,包括VID和PID、型号、名称、配置信息等。
3、VDIClient获取到USB外设的基础配置信息后,会给Windows虚拟机发送一个USB外设插入的事件。VDIClient通过USB映射通道通知VMP服务器的虚拟USB主控制器(虚拟主控),将事件告知Windows虚拟机。
4、Windows虚拟机收到有USB外设插入的事件后,通过USB映射通道向VDIClient发送命令,获取USB外设的信息。当获取USB外设基本信息完成,就在虚拟机里面给USB外设找到匹配的驱动。
5、Windows虚拟机找到匹配的驱动后,将其与虚拟机关联起来,用户便可以在虚拟机里对USB外设进行读写操作了。
6、用户在虚拟机读写U盘的操作,都会变成命令通过USB映射通道发送给VDIClient,VDIClient解析这些命令,然后转换为ioctl读写U盘,再将读写的结果通过USB映射通道传回Windows虚拟机。
7、使用结束或者中途拔出USB外设,PC/ARM/X86终端会收到一个热拔出事件,然后将这个消息传输给虚拟机,虚拟机取消与驱动的关联,之后PC/ARM/X86终端取消usbfs驱动与USB外设的关联。
8、最后,windows虚拟机将这个USB通道释放。
注意:
①Ioctl函数:设备驱动程序中对设备的I/O通道进行管理的函数
②usbfs:USB文件系统
③上述原理仅适用于windows虚拟机,linux和国产化虚拟机由于USB映射的功能原理还在梳理,后续待完善;